1. 程式人生 > >JDBC---DAO經典模式 實現對資料庫的增、刪、改、查

JDBC---DAO經典模式 實現對資料庫的增、刪、改、查

JDBC(Java Data Base Connection)的作用是連線資料庫

先看下jdbc連線SQLServer資料庫的簡單例子

程式碼實現(FirstJDBC):

package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


public class FirstJDBC {
	
	public static void main(String[] args)
	{
		//呼叫連線資料庫的操作
		Connection con = createConnection();	
		
				
	}
    
	/**
	 * JDBC 建立 SQL Server資料庫連線
	 */
	private static Connection createConnection() {
		
		//定義載入驅動程式
		String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	    
		//定義 連線 伺服器 和 資料庫sample
		String dbURL = "jdbc:sqlserver://localhost:1433; DataBaseName = sample1" ;
	
		//預設使用者名稱,不要用windows預設身份驗證
		String userName = "sa" ; 
		String userPassword = "zhichao" ;
		Connection connection = null ;
		Statement sta = null ;
		
		try {
			//正式載入驅動
			Class.forName(driverName);
			//開始連線
			connection = DriverManager.getConnection(dbURL, userName, userPassword);
			System.out.println("Connection Success !");
			
			//向資料庫中執行SQL語句
			sta = connection.createStatement() ;
			ResultSet rs = sta.executeQuery("SELECT id,name,height From Table_1");
			while(rs.next())
			{
				int id = rs.getInt("id");
				String name = rs.getString("name");
				float height = rs.getFloat("height");
				
				System.out.println("id = "+id+" name = "+name+" height = "+height);
			}
		
		} catch (Exception e) {
			
			System.out.println("Connection Fail !");
			e.printStackTrace() ;
		}
		
		/**
		 * 關閉資料庫
		 * @param connection
		 */
		finally
		{
			try {
				
				if (null != sta)
				{
					sta.close() ;
					sta = null;
					System.out.println("Statement 關閉成功");
				}
				
				if (null != connection)
				{
					connection.close() ;
					connection = null;
					System.out.println("Connection 關閉成功");
				}
				
			} catch (Exception e) {
				
				e.printStackTrace() ;
			}		
			
		}		
		return connection ;
	}
}

小結:

    要寫一個jdbc程式,先要載入相應資料庫的驅動程式驅動程式最好放在你建的工程裡面,可以在你的工程下面建一個 lib資料夾以儲存外部的jar檔案,這樣的話把你的工程拷貝到別的計算機執行,仍能成功執行。

jdbc程式碼一般步驟:

1)載入外部驅動程式(jar包)

2)正式載入驅動程式 (Class.forName(driverName) )

3)獲取connection連線 (在jdk中的sql包中,只提供了一個類那就是DriverManeger,通過呼叫它的靜態方法getConnection(),可以得到以資料庫的連線

4)建立sql語句的宣告(Statement),執行sql語句(查詢),遍歷結果集

5)關閉資料庫連線(一般用finally{}來處理,或者呼叫方法的形式來完成,關閉之前先判斷你要關閉的物件連線是否為空,如果空那會拋異常,所以先判斷)

------------------------------------- ------------------------------------- ------------------------Data Access Objects-------------------- ------------------------------------------- ---------------------------

使用 DAO模式 來對資料庫做增刪改查操作

這種模式可以大概分為三個層:1.DAO層  2.服務層  3.表現層

1)表現層 :相當於客戶端用來檢視,提交資訊的角色

2)服務層 :是表現層和DAO層的紐帶,其實也沒幹什麼事就是通知訊息的角色

3)DAO   :真正要做事的角色(對資料庫的某些操作)

舉個生活中的例子:

就好比你去餐廳吃飯,你充當一個 (表現層)的角色,然後有美女服務員(服務層),問你需要吃什麼東西,給你下一張訂單,讓你填。之後服務員把訂單傳到 廚師(DAO層)那裡,具體操作廚師會搞定,一段時間後廚師把做好的食物傳給服務員,服務員把食物在傳給客戶,這些操作就算基本完成了。

執行順序: 表現層-->服務層-->DAO層-->返回服務層-->返回表現層

來看看實現DAO模式的UML圖:

程式碼實現:

1.Bean檔案,在這主要作用(有點像中介儲存的角色):當從資料庫拿出資料後,一個個set到該類裡,進行賦值,然後把該物件放到集合中,之後再get出來

Student.java

package com.myjdbc.bean;

public class Student {
	
	private Integer stuId;
	private String stuName ;
	private Integer stuAge;
	private String stuTel ;
	private String stuAddress ;
	private Integer groupId;
	
	public Integer getStuId() {
		return stuId;
	}
	public void setStuId(Integer stuId) {
		this.stuId = stuId;
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public Integer getStuAge() {
		return stuAge;
	}
	public void setStuAge(Integer stuAge) {
		this.stuAge = stuAge;
	}
	public String getStuTel() {
		return stuTel;
	}
	public void setStuTel(String stuTel) {
		this.stuTel = stuTel;
	}
	public String getStuAddress() {
		return stuAddress;
	}
	public void setStuAddress(String stuAddress) {
		this.stuAddress = stuAddress;
	}
	public Integer getGroupId() {
		return groupId;
	}
	public void setGroupId(Integer groupId) {
		this.groupId = groupId;
	}
		
}


2.java連線資料庫的基本操作及關閉,封裝在一個類中

JDBCUtils.java

package com.myjdbc.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCUtils {
	/**
	 * 獲取連線
	 * 
	 */
	public static Connection getConnection()
	{
		String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

		String url = "jdbc:sqlserver://localhost:1433; DataBaseName = studentManager";
		String user = "sa" ;
		String password = "zhichao";
		Connection con = null ;
		try {
			
			Class.forName(driverName);
			con = DriverManager.getConnection(url, user, password);
			System.out.println("success");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return con ;
		
	}
	
	/**
	 * 關閉連線
	 */
	public static void free(ResultSet rs, Statement sta , Connection con)
	{
		try {
			if(null != rs)
			{
				rs.close();
				rs = null ;
			}
			
			if(null != sta)
			{
				sta.close();
				sta = null ;
			}
			
			if(null != con)
			{
				con.close();
				con = null ;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

3.定義一個DAO介面

StudentDAO.java

package com.myjdbc.dao;

import java.util.Set;

import com.myjdbc.bean.Student ;

public interface StudentDAO {
	
	public int addStudent(Student student) ;
	
	public int deleteStudent(String name);
	
	public int updateStudent(String name);
	
	public Student findStudent(String name);
	
	public Set<Student> findAll();

	
	
	
	

}


4.實現DAO介面的類,具體DAO,做重要工作的類

ConcreteStudentDao.java

package com.myjdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;

import com.myjdbc.bean.Student;
import com.myjdbc.dao.StudentDAO;
import com.myjdbc.utils.JDBCUtils;

public class ConcreteStudentDao implements StudentDAO{
	
	//增加一個學生
    public int addStudent(Student student)
    {
    	Connection con = null ;
    	PreparedStatement ps = null ;
    	int i = 0 ;
    	try
    	{
    	    con = JDBCUtils.getConnection();
    	    String sql = "insert into student(stuName,stuAge,stuTel,stuAddress,groupId) values(?,?,?,?,?)";
    	    ps = con.prepareStatement(sql);
    	    
    	    ps.setString(1, student.getStuName());
    	    ps.setInt(2, student.getStuAge());
    	    ps.setString(3, student.getStuTel());
    	    ps.setString(4, student.getStuAddress());
    	    ps.setInt(5, student.getGroupId());
    	    
    	    i = ps.executeUpdate() ;
    	    
    	}
    	catch(SQLException e)
    	{
    		throw new DAOException(e.getMessage(),e);
    	}
    	finally
    	{
    		JDBCUtils.free(null, ps, con);
    	}
    	return i;
    }
	
    //刪除一個學生
	public int deleteStudent(String name)
	{
		Connection con = null ;
    	PreparedStatement ps = null ;
    	int i = 0 ;
    	try
    	{
    	    con = JDBCUtils.getConnection();
    	    String sql = "delete from student where stuName =?";
    	    ps = con.prepareStatement(sql);
    	    ps.setString(1, name);
    	    
    	    i = ps.executeUpdate() ;
    	    
    	}
    	catch(SQLException e)
    	{
    		throw new DAOException(e.getMessage(),e);
    	}
    	finally
    	{
    		JDBCUtils.free(null, ps, con);
    	}
	    	
		return i;
	}
	
	//修改一個學生
	public int updateStudent(String name)
	{
		Connection con = null ;
    	PreparedStatement ps = null ;
    	int i = 0 ;
    	try
    	{
    	    con = JDBCUtils.getConnection();
    	    String sql = "update student set stuAge=stuAge+1  where stuName =?";
    	    ps = con.prepareStatement(sql);
    	    ps.setString(1, name);
    	    
    	    i = ps.executeUpdate() ;
    	    
    	}
    	catch(SQLException e)
    	{
    		throw new DAOException(e.getMessage(),e);
    	}
    	finally
    	{
    		JDBCUtils.free(null, ps, con);
    	}
		
		return i;
	}
	//查詢一行
	public Student findStudent(String name)
	{
		Connection con = null ;
    	PreparedStatement ps = null ;
    	Student stu = null ;
    	ResultSet rs = null;
    	try
    	{
    	    con = JDBCUtils.getConnection();
    	    String sql = "select stuName,stuAge,stuTel,stuAddress,groupId from student where stuName =?";
    	    ps = con.prepareStatement(sql);
    	    ps.setString(1, name);
    	    
    	    rs = ps.executeQuery() ;
    	    stu = new Student();
    	    while(rs.next())
    	    {
    	    	stu.setStuName(rs.getString(1));
    	    	stu.setStuAge(rs.getInt(2));
    	    	stu.setStuTel(rs.getString(3));
    	    	stu.setStuAddress(rs.getString(4));
    	    	stu.setGroupId(rs.getInt(5));
    	    }
    	    
    	}
    	catch(SQLException e)
    	{
    		throw new DAOException(e.getMessage(),e);
    	}
    	finally
    	{
    		JDBCUtils.free(rs, ps, con);
    	}
		
		return stu;
	}
	
	//查詢所有
	public Set<Student> findAll()
	{
		Connection con = null ;
    	PreparedStatement ps = null ;
    	Student stu = null ;
    	ResultSet rs = null;
    	Set<Student> set = null ;
    	try
    	{
    	    con = JDBCUtils.getConnection();
    	    String sql = "select stuName,stuAge,stuTel,stuAddress,groupId from student";
    	    ps = con.prepareStatement(sql);
    	    
    	    set = new HashSet<Student>() ;
    	    rs = ps.executeQuery() ;
    	    
    	    while(rs.next())
    	    {
    	    	stu = new Student();
    	    	
    	    	stu.setStuName(rs.getString(1));
    	    	stu.setStuAge(rs.getInt(2));
    	    	stu.setStuTel(rs.getString(3));
    	    	stu.setStuAddress(rs.getString(4));
    	    	stu.setGroupId(rs.getInt(5));
    	    	
    	    	set.add(stu);
    	    }
    	    
    	}
    	catch(SQLException e)
    	{
    		throw new DAOException(e.getMessage(),e);
    	}
    	finally
    	{
    		JDBCUtils.free(rs, ps, con);
    	}
		
		return set;
	}
       
}


5.自定義異常 繼承了執行時異常,具體操作讓父類實現

DAOException.java

package com.myjdbc.dao;

/**
 * 自定義異常
 * @author Administrator
 *
 */
public class DAOException extends RuntimeException {
	
	
	public DAOException()
	{
		super();
	}
	
	public DAOException(String messege,Throwable cause)
	{
		super(messege,cause);
	}
	
	public DAOException(String messege)
	{
		super(messege);
	}
	
	public DAOException(Throwable cause)
	{
		super(cause);
	}
	
	

}

6定義一個服務類(服務層),本來還要定義一個介面,這裡簡寫了,客戶與DAO的紐帶,持有DAO物件的引用

StudentService.java

package com.myjdbc.service;

import java.util.Set;

import com.myjdbc.bean.Student;
import com.myjdbc.dao.StudentDAO;
import com.myjdbc.dao.ConcreteStudentDao;

public class StudentService {
	
	StudentDAO sd = new ConcreteStudentDao();
	
	public int add(Student student)
	{
		return this.sd.addStudent(student);
	}
	
	public int delete(String name)
	{
		return this.sd.deleteStudent(name);
	}
	
	public int update(String name)
	{
		return this.sd.updateStudent(name);
	}
	
	public Student find(String name)
	{
		return this.sd.findStudent(name);
	}
	
	public Set<Student> findAll()
	{
		return this.sd.findAll();
	}

}


7.定義一個測試類,相當於 (表現層)

Client.java

package com.myjdbc.test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import com.myjdbc.bean.Student;
import com.myjdbc.service.StudentService;

public class Client {
   public static void main(String[] args)
   {
	   Student stu = new Student();
	   Set<Student> set = new HashSet<Student>();
//	   stu.setStuName("zhangsan");
//	   stu.setStuAge(20);
//	   stu.setStuTel("18779157911");
//	   stu.setStuAddress("china");
//	   stu.setGroupId(1);
	   StudentService ss = new StudentService();
	   //System.out.println(ss.add(stu));
	   //System.out.println(ss.delete("aa"));
	   //System.out.println(ss.update("bb"));
	   //stu = ss.find("cc");
	   //System.out.println(stu.getStuName() +" " +stu.getStuAge()+" "+stu.getStuTel()+" "+stu.getStuAddress()+" "+stu.getGroupId());
	   set = ss.findAll() ;
	   Iterator<Student> iterator = set.iterator();
	   while(iterator.hasNext())
	   {
		  Student student =  (Student)iterator.next() ;
		  System.out.println(student.getStuName() +" " +student.getStuAge()+" "+student.getStuTel()+" "+student.getStuAddress()+" "+student.getGroupId());
	   }
   }
}

相關推薦

JDBC---DAO經典模式 實現資料庫

JDBC(Java Data Base Connection)的作用是連線資料庫 先看下jdbc連線SQLServer資料庫的簡單例子 程式碼實現(FirstJDBC): package com.jdbc; import java.sql.Connection; im

java連結mysql以及資料庫

package com.jdbcdemo; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStateme

mybatis的傳統的實現

3.2.1、儲存使用者 <insert id="saveUser" parameterType="com.atguigu.mybatis.pojo.User"> insert into t_user(`last_name`,`sex`) valu

Mapper介面方式的mybatis的實現

4.1、Mapper介面程式設計的命名習慣Mapper介面方式的程式設計,需要先有一個介面。這個介面的命名一般是xxxxMapper。 比如: User模組的Mapper,介面命名為UserMapper。 Book模組的Mapper,介面命名為BookMappe

shell指令碼操作mysql資料庫,使用mysql的-e引數可以執行各種sql的(建立,刪除,)等各種操作

來源:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520114116289991/ mysql  -hhostname -Pport -uusername -ppassword  -e  相關mysql的

dict的

date 關聯 print none 必須 數據類型 相同 一個 code dict是無序的 ,數據關聯性強,鍵值對,唯一一個個映射的數據類型 字典的鍵必須是可哈希的數據類型 (字符串,數字,bool,元祖)並且是唯一的. 不可哈希的:(列表,字典) dict的增 1

Javascript操作Cookie(

time() add return jna mts cap 關閉 nbsp expire 1 //1. 獲得指定名稱為ObjName的Cookie的值 2 function getCookie(ObjName){ 3 var arrStr = documen

MySql cmd下的學習筆記 —— 有關表的操作(

strong .com nsh utf str tab 主鍵 test har (知識回顧) 連接數據庫 mysql -uroot -p111 先建立一個新庫 create database test1; use test1; 由於今天的主要內容是表的操作,建立表的詳細過

mysql基本功能

增 ==》 insert into 庫.表(欄位名列表) values(值列表); mysql> create table meinvdb.mm(-> id int(4) not null primary key,-> name varchar(18) not null-> );Que

mysql基本功能

cat dup pda key null cte insert value creat 增 ==》 insert into 庫.表(字段名列表) values(值列表); mysql> create table meinvdb.mm(-> id

MySQL基礎操作

一,SQL語言概述1,SQL語言是關係型資料庫的標準語言,用於維護管理資料庫,如資料查詢,資料更新,訪問控制,物件管理等功能。 2,建表 這是需要掌握的。(1)#Show databases; 檢視資料庫裡所有的小資料庫名。 show看 databases 資料庫小庫 (2)#Create databa

python第四天課程:列表(),元祖

''' #1.增加 append insert li = ['alex',[1,2,3],'wusir','egon','女神','taibai'] li.append('日天') print(li) li.append(1) print(li) while 1: name = input('請

asp.net core 2.1 dotnet(三)EF.core 的

1.呼叫方式:    增加引用:          using Microsoft.EntityFrameworkCore;         using Newtonsoft

Java中List的

package Colection; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; //備選課程類 public class L

斷電導致oracle的ORA-01207錯誤完全解決辦法(重做日誌檔案(redo log files)管理(,切))

彙總整理一下有關重做日誌檔案(redo log files)管理相關的操作(增,刪,改,查,切)。供參考。1.當前日誌相關資訊[email protected]> select * from v$log;    GROUP#    THREAD#  SEQUENCE#      BYTES  

GreenDao3.2使用詳解(,升級)

首先看一下效果圖: 專案結構如下圖所示: 第一步:在build中新增配置如下: projet 目錄下的build.gradle dependencies { classpath 'org.greenrobot:greendao-gradl

表的完整語法( 子查詢 )

多行 教學 pan 比較 nbsp 匹配 字段 values 數據 表的完整語法增刪該查 表的完整 增 語法 1.所有數據按順序插入 insert [into] 表名 values (值1,……值n),[值1,……值n] 2.指定字段匹配插入,可以任意順序

SQL server中常見的的操作

--增-- /*增加列*/ alter table 表名 add 列名 varchar(20) check(你的約束條件); 如:在學生情況表中增加一個Email列,要求檢查輸入的是否為Email; alter table 學生情況表 add Email varchar

基於SpringMVC框架,完成使用者的,以及json資料處理

package org.ksea.controller; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.http.HttpServletRequest; import j

MySQL資料庫學習筆記(十一)----DAO設計模式實現資料庫刪改(進一步封裝JDBC工具類)

系列文章並非本人原創。 在這裡我想討論的一個問題是:在PersonDaoImpl這個實現類中,我們可以看到 public void add(Person p) throws SQLException { 26 Connection conn