jdbc框架

DBAssist類:sql

public class DBAssist {
 private DataSource dataSource;
 
 public DBAssist(DataSource dataSource){//由調用者傳入數據源
  this.dataSource = dataSource;
 }
 /**
  * 執行DML語句:insert update delete
  * @param sql 執行的sql語句
  * @param params 語句中佔位符對應的參數
  */
 public void update(String sql,Object[] params){
  Connection conn = null;
  PreparedStatement stmt = null;
  ResultSet rs = null;
  try{
   conn = dataSource.getConnection();
   stmt = conn.prepareStatement(sql);
   
   //獲得sql語句中佔位符的個數
   ParameterMetaData pmd = stmt.getParameterMetaData();
   int paramCount = pmd.getParameterCount();
   if(paramCount>0){
    //有佔位符
    if(params==null||params.length==0){
     throw new RuntimeException("參數有誤");
    }
    //對比佔位符的數量和參數的個數是否匹配
    if(paramCount!=params.length){
     throw new RuntimeException("參數個數不匹配");
    }
    //設置對應的參數
    for(int i=0;i<paramCount;i++){
     stmt.setObject(i+1, params[i]);
    }
   }
   
   
   stmt.executeUpdate();
  }catch(Exception e){
   throw new RuntimeException(e);
  }finally{
   release(rs, stmt, conn);
  }
 }
 /**
  * 前提:JavaBean中的字段名和數據庫字段名必須一致
  * @param sql
  * @param params
  * @param handler
  * @return
  */
 public Object query(String sql,Object params[],ResultSetHandler handler){
  Connection conn = null;
  PreparedStatement stmt = null;
  ResultSet rs = null;
  try{
   conn = dataSource.getConnection();
   stmt = conn.prepareStatement(sql);
   
   //獲得sql語句中佔位符的個數
   ParameterMetaData pmd = stmt.getParameterMetaData();
   int paramCount = pmd.getParameterCount();
   if(paramCount>0){
    //有佔位符
    if(params==null||params.length==0){
     throw new RuntimeException("參數有誤");
    }
    //對比佔位符的數量和參數的個數是否匹配
    if(paramCount!=params.length){
     throw new RuntimeException("參數個數不匹配");
    }
    //設置對應的參數
    for(int i=0;i<paramCount;i++){
     stmt.setObject(i+1, params[i]);
    }
   }
   
   
   rs = stmt.executeQuery();
   //關鍵任務:把結果集中的記錄封裝到JavaBean中。誰用誰知道,框架不知道(策略設計模式)
   return handler.handle(rs);
  }catch(Exception e){
   throw new RuntimeException(e);
  }finally{
   release(rs, stmt, conn);
  }
 }
 private static void release(ResultSet rs,Statement stmt,Connection conn){
  if(rs!=null){
   try {
    rs.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
   rs = null;
  }
  if(stmt!=null){
   try {
    stmt.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
   stmt = null;
  }
  if(conn!=null){
   try {
    conn.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
   conn = null;
  }
 }
}數據庫

ResultSetHandler接口:設計模式

public interface ResultSetHandler {
 //結果處理策略:抽象的
 Object handle(ResultSet rs);
}框架

 BeanHandler類:this

public class BeanHandler implements ResultSetHandler {
 
 private Class clazz;
 public BeanHandler(Class clazz){
  this.clazz = clazz;
 }.net

 public Object handle(ResultSet rs) {
  try {
   if(rs.next()){
    //知道結果中有幾列和列名
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
    Object bean = clazz.newInstance();
    for(int i=0;i<columnCount;i++){
     String feildName = rsmd.getColumnName(i+1);//也就拿到了JavaBean中的字段名
     Object fieldValue = rs.getObject(i+1);//字段值
     
     //設置JavaBean中數據的字段值
     Field field = clazz.getDeclaredField(feildName);//反射私有字段
     field.setAccessible(true);//暴力反射
     field.set(bean, fieldValue);
    }
    return bean;
   }else{
    return null;//沒有結果
   }
  } catch (Exception e) {
   throw new RuntimeException("封裝數據失敗");
  }
 }設計

}
接口

BeanListHandler類:get

public class BeanListHandler implements ResultSetHandler {
 private Class clazz;
 public BeanListHandler(Class clazz){
  this.clazz = clazz;
 }
 public Object handle(ResultSet rs) {
  try {
   List list = new ArrayList();
   while(rs.next()){
    //知道結果中有幾列和列名
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
    Object bean = clazz.newInstance();
    for(int i=0;i<columnCount;i++){
     String feildName = rsmd.getColumnName(i+1);//也就拿到了JavaBean中的字段名
     Object fieldValue = rs.getObject(i+1);//字段值
     
     //設置JavaBean中數據的字段值
     Field field = clazz.getDeclaredField(feildName);//反射私有字段
     field.setAccessible(true);//暴力反射
     field.set(bean, fieldValue);
    }
    list.add(bean);
   }
   return list;
  } catch (Exception e) {
   throw new RuntimeException("封裝數據失敗");
  }
 }
}io

 

UserDaoImpl類:

public class UserDaoImpl {
 private DBAssist da = new DBAssist(DBCPUtil.getDataSource());
 @Test
 public void addUser(){
  da.update("insert into user values(?,?,?)", new Object[]{2,"def","male"});
 }
 @Test
 public void updateUser(){
  da.update("update user set name=?,gender=? where id=?", new Object[]{"ddd","female",1});
 }
 @Test
 public void delUser(){
  da.update("delete from user where id=?", new Object[]{1});
 }
 @Test
 public void query(){
  User user = (User)da.query("select * from user",null, new BeanHandler(User.class));
  System.out.println(user);
 }
 @Test  public void query1(){  List<User> users = (List<User>)da.query("select * from user",null, new BeanListHandler(User.class));  for(User user:users)   System.out.println(user); }}

相關文章
相關標籤/搜索