DAO層操作——JDBC
阿新 • • 發佈:2018-12-22
使用JDK自帶的方法來連線和操作資料庫
一.JDBC(Java Data Base Connectivity,java資料庫連線)
是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。
JDBC提供了一種基準,據此可以構建更高階的工具和介面,使資料庫開發人員能夠編寫資料庫應用程式。
即:使用JDBC可以實現對資料庫的訪問.
二.資料庫常用的介面和類:
- -DriverManager:驅動管理器獲得資料庫的連線(獲得Connection物件)
- -Connection:資料庫連線介面,代表資料庫連線物件,每個Connection代表一個物理連線會話
- -Statement:語句介面,用來靜態操作SQL語句
- -PreparedStatement(Statement的子介面):預定義語句,用來動態操作SQL語句
- -ResultSet:結果集,儲存資料記錄的結果集合
三.JDBC 訪問資料庫的步驟:
- 載入資料庫驅動類:driverName = Class.forName("com.mysql.jdbc.Driver");
- 獲得資料庫連線:getConnection();
- 獲得資料庫操作控制代碼:PreparedStatement ps;
- 獲得結果集(查詢):ResultSet rs
- 處理結果集
- 關閉結果集
- 關閉操作控制代碼
- 關閉資料庫連線
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;
}
}