1. 程式人生 > >DAO層操作——JDBC

DAO層操作——JDBC

使用JDK自帶的方法來連線和操作資料庫

一.JDBC(Java Data Base Connectivity,java資料庫連線)

是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。
JDBC提供了一種基準,據此可以構建更高階的工具和介面,使資料庫開發人員能夠編寫資料庫應用程式。
即:使用JDBC可以實現對資料庫的訪問.

二.資料庫常用的介面和類:

  • -DriverManager:驅動管理器獲得資料庫的連線(獲得Connection物件)
  • -Connection:資料庫連線介面,代表資料庫連線物件,每個Connection代表一個物理連線會話 
  • -Statement:語句介面,用來靜態操作SQL語句 
  • -PreparedStatement(Statement的子介面):預定義語句,用來動態操作SQL語句
  • -ResultSet:結果集,儲存資料記錄的結果集合

三.JDBC 訪問資料庫的步驟:

  1. 載入資料庫驅動類:driverName = Class.forName("com.mysql.jdbc.Driver");                                                             
  2. 獲得資料庫連線:getConnection();
  3. 獲得資料庫操作控制代碼:PreparedStatement   ps;
  4. 獲得結果集(查詢):ResultSet   rs
  5. 處理結果集
  6. 關閉結果集
  7. 關閉操作控制代碼
  8. 關閉資料庫連線
package com.web.tools;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;


public class DBUtilPro {

	private static Properties pro; 	
	static{
			
		try {
			//屬性集,可儲存在流中或在流中載入
			pro = new Properties(); 
			//通過類載入器的方法載入本地檔案,獲得一個位元組輸入流
			InputStream is = DBUtilPro.class.getClassLoader().getResourceAsStream("JDBC.properties");
			//載入輸入流獲得屬性列表(鍵值對的集合)
			pro.load(is);   

			//把註冊驅動放在靜態塊,只加載一次
			Class.forName(pro.getProperty("driverName"));
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	//獲得連線
	public static Connection openConnection() throws Exception{
		Connection conn = null;
		
		String url = pro.getProperty("url");
		String user = pro.getProperty("user");
		String password = pro.getProperty("password");
				    
		conn = DriverManager.getConnection(url, user, password);			
		return conn;
	}
	
	//關閉資料庫
	public static void closeConnection(Connection conn,PreparedStatement ps,ResultSet rs){
        //此部分程式碼省略
		//關閉rs,ps,conn
	
}




--------------------JDBC.properties------------------
driverName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=yy_0105
password=yy_0105

四.操作例項

public class EmpDao {
	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;
	
	//傳入一個僱員編號,獲得僱員資訊
	public Emp getOneEmp(int id){
		Emp emp = null;
		String str = "select empno,ename,sal,hiredate from newemp where empno = ?";
		
		try{
			conn = DBUtils.openConnection();		
			ps = conn.prepareStatement(str);
			ps.setInt(1, id);
			rs = ps.executeQuery();
			
			
			while(rs.next()){
				emp = new Emp();
				emp.setEmpno(rs.getInt("empno"));
				emp.setEname(rs.getString("ename"));
				emp.setSal(rs.getDouble("sal"));
				emp.setDate(rs.getDate("hiredate"));				
			}
		}catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		return emp;	
    }
}
public class EmpDao {
	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;
	
	//查詢所有名字長度為4的員工的員工編號,姓名
	public List<Emp> getMessage(){
		Emp emp = null;
	    List<Emp> listEmp = new ArrayList<Emp>();
	    String sql = "select empno,ename from newemp where length(ename) = 4";
	    
	    conn = DBUtils.openConnection();
	    try {
	    	
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			
			while(rs.next()){
				emp = new Emp();
				emp.setEmpno(rs.getInt("empno"));
				emp.setEname(rs.getString("ename"));

				listEmp.add(emp);
			}			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	    
		return listEmp;		
	}
}
public class EmpDao {
	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;
	
	//根據指定的empno,來刪掉記錄,並得到刪掉的記錄數量
	public int deleteCount(Integer empno){
		int count = 0;
		String sql = "delete from newemp where empno = ?";
		
		try {
			
			
			conn = DBUtils.openConnection();
			
			
			ps = conn.prepareStatement(sql);
			ps.setInt(1,empno);
			
			//一旦DML語句中出現了 insert,update,delete語句,控制代碼就應該使用executeUpdate來執行SQL語句返回結果是一個int,影響函式
			count = ps.executeUpdate();
			
			//事物自動commit
				
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
		}

		return count;
	}
}
public class EmpDao {
	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;
	
    //插入
	public int insertRecord(Emp emp){
		int count = 0;
		
		conn = DBUtils.openConnection();
		String sql ="insert into newemp(empno,ename,sal,hiredate) values(?,?,?,?)";
		try {
		
			ps = conn.prepareStatement(sql);
			ps.setInt(1, emp.getEmpno());
			ps.setString(2, emp.getEname());
			ps.setDouble(3, emp.getSal());
			ps.setDate(4, new Date(emp.getDate().getTime()));
				
			count = ps.executeUpdate();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return count;		
	}
}