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); }}