Java通過JDBC 進行Dao層的封裝
阿新 • • 發佈:2019-02-14
前言
前面有一章節,我專門講解了Java通過JDBC 進行MySQL資料庫操作,這主要講解了MySQL資料庫的連線和簡單的操作,但是在真正的java專案中,我們要不斷的和資料庫打交道,為了提高資料庫操作的執行效率和增加程式碼的複用性,將重新封裝一個Dao層,也就是資料訪問層 ,用來訪問資料庫實現資料的持久化。
Dao層設計
Dao層操作通用的步驟:
- 1.寫SQL語句
- 2.獲取連線
- 3.建立stmt
- 4.執行sql
a)更新
String sql = “delete from admin where id=?””;
String sql = “insert into admin (userName,pwd) values (?,?)”
public void update(String sql, Object[] paramValues);b)查詢
String sql = “select * from admin”;
String sql = “select * from admin where id=? And pwd =?”;
// 傳入的什麼型別的物件,就封裝為什麼型別
// 要求: 列的名稱,要與指定型別的物件的屬性名稱一樣
Public List query (String sql , Object[] paramValues , Class clazz);
T t; // 物件賦值
- 5.關閉/異常
編寫BaseDao,自己寫的所有的Dao都繼承此類
/**
* 通用的dao,自己寫的所有的dao都繼承此類;
* 此類定義了2個通用的方法:
* 1. 更新
* 2. 查詢
* @author Charlie.chen
*
*/
public class BaseDao {
// 初始化引數
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
/**
* 查詢的通用方法
* @param sql
* @param paramsValue
*/
public <T> List<T> query(String sql, Object[] paramsValue,Class<T> clazz){
try {
// 返回的集合
List<T> list = new ArrayList<T>();
// 物件
T t = null;
// 1. 獲取連線
con = JdbcUtil.getConnection();
// 2. 建立stmt物件
pstmt = con.prepareStatement(sql);
// 3. 獲取佔位符引數的個數, 並設定每個引數的值
int count = pstmt.getParameterMetaData().getParameterCount();
if (paramsValue != null && paramsValue.length > 0) {
for (int i=0; i<paramsValue.length; i++) {
pstmt.setObject(i+1, paramsValue[i]);
}
}
// 4. 執行查詢
rs = pstmt.executeQuery();
// 5. 獲取結果集元資料
ResultSetMetaData rsmd = rs.getMetaData();
// ---> 獲取列的個數
int columnCount = rsmd.getColumnCount();
// 6. 遍歷rs
while (rs.next()) {
// 要封裝的物件
t = clazz.newInstance();
// 7. 遍歷每一行的每一列, 封裝資料
for (int i=0; i<columnCount; i++) {
// 獲取每一列的列名稱
String columnName = rsmd.getColumnName(i + 1);
// 獲取每一列的列名稱, 對應的值
Object value = rs.getObject(columnName);
// 封裝: 設定到t物件的屬性中 【BeanUtils元件】
BeanUtils.copyProperty(t, columnName, value);
}
// 把封裝完畢的物件,新增到list集合中
list.add(t);
}
return list;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JdbcUtil.closeAll(con, pstmt, rs);
}
}
/**
* 更新的通用方法
* @param sql 更新的sql語句(update/insert/delete)
* @param paramsValue sql語句中佔位符對應的值(如果沒有佔位符,傳入null)
*/
public void update(String sql,Object[] paramsValue){
try {
// 獲取連線
con = JdbcUtil.getConnection();
// 建立執行命令的stmt物件
pstmt = con.prepareStatement(sql);
// 引數元資料: 得到佔位符引數的個數
int count = pstmt.getParameterMetaData().getParameterCount();
// 設定佔位符引數的值
if (paramsValue != null && paramsValue.length > 0) {
// 迴圈給引數賦值
for(int i=0;i<count;i++) {
pstmt.setObject(i+1, paramsValue[i]);
}
}
// 執行更新
pstmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JdbcUtil.closeAll(con, pstmt, null);
}
}
編寫實際操作的Dao類繼承自BaseDao
public class AdminDao extends BaseDao {
// 刪除
public void delete(int id) {
String sql = "delete from admin where id=?";
Object[] paramsValue = {id};
super.update(sql, paramsValue);
}
// 插入
public void insert(Admin admin) {
String sql = "insert into admin (userName,pwd) values (?,?)";
Object[] paramsValue = {admin.getUserName(),admin.getPwd()};
super.update(sql, paramsValue);
}
// 查詢全部
public List<Admin> getAll(){
String sql = "select * from admin";
List<Admin> list = super.query(sql, null, Admin.class);
return list;
}
// 根據條件查詢(主鍵)
public Admin findById(int id){
String sql = "select * from admin where id=?";
List<Admin> list = super.query(sql, new Object[]{id}, Admin.class);
return (list!=null&&list.size()>0) ? list.get(0) : null;
}
}
JavaBean類
/**
* 1. bean類設計
* @author Charlie.chen
*
*/
public class Admin {
private int id;
private String userName;
private String pwd;
private int age;
private Date birth;
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "Admin [age=" + age + ", birth=" + birth + ", id=" + id
+ ", pwd=" + pwd + ", userName=" + userName + "]";
}
}