模仿Common DBUtils的功能实现自定义的DBUtils

①导入需要的jar包和配置文件

②辅助类

 1 package com.yxfyg.util; 2  3 import java.sql.Connection; 4  5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 import com.mchange.v2.c3p0.ComboPooledDataSource; 9 10 public class JDBCUtil {11 12 private static ComboPooledDataSource dataSource = null;13 14 static {15 dataSource = new ComboPooledDataSource();16  }17 18 public static Connection getConnection() {19 Connection conn = null;20 try {21 conn = dataSource.getConnection();22 } catch (SQLException e) {23  e.printStackTrace();24  }25 return conn;26  }27 28 public static ComboPooledDataSource getDataSource() {29 return dataSource;30  }31 32 public static void release(ResultSet rs,Statement st,Connection conn) {33  closeRs(rs);34  closeSt(st);35  closeConn(conn);36  }37 38 public static void release(Statement st,Connection conn) {39  closeSt(st);40  closeConn(conn);41  }42 43 private static void closeRs(ResultSet rs) {44 try {45 if(rs != null) {46  rs.close();47  }48 }catch(SQLException e) {49  e.printStackTrace();50 }finally {51 rs = null;52  }53  }54 55 private static void closeSt(Statement st) {56 try {57 if(st != null) {58  st.close();59  }60 }catch(SQLException e) {61  e.printStackTrace();62 }finally {63 st = null;64  }65  }66 67 private static void closeConn(Connection conn) {68 try {69 if(conn != null) {70  conn.close();71  }72 }catch(SQLException e) {73  e.printStackTrace();74 }finally {75 conn = null;76  }77  }78 }
 1 package com.yxfyg.bean; 2  3 public class Account { 4  5 private int id; 6  7 private String name; 8  9 private int money;10 11 public int getId() {12 return id;13  }14 15 public void setId(int id) {16 this.id = id;17  }18 19 public String getName() {20 return name;21  }22 23 public void setName(String name) {24 this.name = name;25  }26 27 public int getMoney() {28 return money;29  }30 31 public void setMoney(int money) {32 this.money = money;33  }34 35  @Override36 public String toString() {37 return "Account [id=" + id + ", name=" + name + ", money=" + money + "]";38  }39 40 }

③自定义的DBUtils和需要使用者进行实现的接口

 1 package com.yxfyg.dbutils; 2  3 import java.sql.Connection; 4 import java.sql.ParameterMetaData; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8  9 import com.yxfyg.util.JDBCUtil;10 11 public class MyDBUtils {12 13 // 增、删、改14 public int update(String sql, Object... args) {15 // 获取连接16 Connection conn = JDBCUtil.getConnection();17 PreparedStatement ps = null;18 int update = 0;19 try {20 ps = conn.prepareStatement(sql);21 // 确定sql语句中问号的个数22 ParameterMetaData data = ps.getParameterMetaData();23 int count = data.getParameterCount();24 for (int i = 0; i < count; i++) {25 ps.setObject(i + 1, args[i]);26  }27 update = ps.executeUpdate();28 } catch (SQLException e) {29  e.printStackTrace();30 } finally {31  JDBCUtil.release(ps, conn);32  }33 return update;34  }35 36 public <T> T query(String sql, ResultSetHandler<T> handler, Object... args) {37 38 // 获取连接39 Connection conn = JDBCUtil.getConnection();40 PreparedStatement ps = null;41 ResultSet rs = null;42 T t = null;43 try {44 ps = conn.prepareStatement(sql);45 // 确定sql语句中问号的个数46 ParameterMetaData data = ps.getParameterMetaData();47 int count = data.getParameterCount();48 for (int i = 0; i < count; i++) {49 ps.setObject(i + 1, args[i]);50  }51 rs = ps.executeQuery();52 53 //将结果集交给由使用者实现的类ResultSetHandler的对象处理54 t = handler.handle(rs);55 56 } catch (SQLException e) {57  e.printStackTrace();58 } finally {59  JDBCUtil.release(rs , ps, conn);60  }61 return t;62  }63 64 }
1 package com.yxfyg.dbutils;2 3 import java.sql.ResultSet;4 5 public interface ResultSetHandler<T> {6 7  T handle(ResultSet rs);8 9 }

④使用

 1 package com.yxfyg.test; 2  3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.util.List; 6  7 import org.junit.Test; 8  9 import com.yxfyg.bean.Account;10 import com.yxfyg.dbutils.MyDBUtils;11 import com.yxfyg.dbutils.ResultSetHandler;12 13 public class MainTest {14 15  @Test16 public void testUpdate() {17 18 MyDBUtils myUtils = new MyDBUtils();19 20 // 增、删、改都使用update方法,查使用query方法21 // 插入一条数据22 myUtils.update("insert into account values(null,?,?)","Lucy",2000);23 24 // 修改一条数据25 myUtils.update("update account set money = money - ? where name = ?", 300, "Lucy");26 27 // 删除一条数据28 myUtils.update("delete from account where name = ?","Lucy");29 30  }31 32  @Test33 public void testQuery() {34 35 MyDBUtils myUtils = new MyDBUtils();36 37 // 查询一条数据(使用匿名内部类,自己实现方法)38 Account account = myUtils.query("select * from account where name = ?", new ResultSetHandler<Account>() {39 40  @Override41 public Account handle(ResultSet rs) {42 Account account = new Account();43 try {44 while (rs.next()) {45 account.setId(rs.getInt("id"));46 account.setName(rs.getString("name"));47 account.setMoney(rs.getInt("money"));48  }49 } catch (SQLException e) {50  e.printStackTrace();51  }52 return account;53  }54 }, "Jack");55 56  System.out.println(account.toString());57  }58 59 }

 

相关文章