问题引入

1.apache+Druid+dbutils 简化了JDBC 开发,但还有不足
2.sql语句是固定的,不能通过参数传入,通用性不好,需要进行改进,更方便执行增删改查
3.对于select操作,如果有返回值,返回类型不能固定,需要使用泛型
4.将来的表很多,业务需求复杂,不可能只靠一个java类来完成

DAO基本说明

1.DAO:data access object 数据访问对象
2.这样的通用类,称为BasicDao,是专门和数据库交互的,即完成对数据库(表)的 CRUD 操作
3.在 BasicDao 的基础上,实现一张表对应一个DAO,更好的完成功能,比如 Customer表——Customer.java类(javaBean)—— CustomerDAO.java
BV}K$I_C{ZC3T`~~O4VP6UD.png

  1. package JDBC.dao_.dao;
  2. import JDBC.datasource.JDBC_Druid;
  3. import org.apache.commons.dbutils.QueryRunner;
  4. import org.apache.commons.dbutils.handlers.BeanHandler;
  5. import org.apache.commons.dbutils.handlers.BeanListHandler;
  6. import org.apache.commons.dbutils.handlers.ScalarHandler;
  7. import java.sql.Connection;
  8. import java.util.List;
  9. @SuppressWarnings({"all"})
  10. public class BasicDAO<T> {//泛型指定具体的类型
  11. QueryRunner qr = new QueryRunner();
  12. //开发通用的dml方法,针对任意表
  13. public int update(String sql, Object... parameters) {
  14. Connection connection = null;
  15. try {
  16. connection = JDBC_Druid.getConnection();
  17. int update = qr.update(connection, sql, parameters);
  18. return update;
  19. } catch (Exception e) {
  20. throw new RuntimeException(e);
  21. } finally {
  22. JDBC_Druid.close(null, null, connection);
  23. }
  24. }
  25. /**
  26. * @param sql 可以有 ?
  27. * @param clazz 传入一个Class对象 比如 Actor.Class
  28. * @param parameters 传入 ? 可变参数
  29. * @return 根据Actor.Class 返回对应的集合
  30. */
  31. public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters) {//返回多行记录
  32. Connection connection = null;
  33. try {
  34. connection = JDBC_Druid.getConnection();
  35. return qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);
  36. } catch (Exception e) {
  37. throw new RuntimeException(e);
  38. } finally {
  39. JDBC_Druid.close(null, null, connection);
  40. }
  41. }
  42. public T querySingle(String sql, Class<T> clazz, Object... parameters) {//返回单行多列记录
  43. Connection connection = null;
  44. try {
  45. connection = JDBC_Druid.getConnection();
  46. return qr.query(connection, sql, new BeanHandler<T>(clazz), parameters);
  47. } catch (Exception e) {
  48. throw new RuntimeException(e);
  49. } finally {
  50. JDBC_Druid.close(null, null, connection);
  51. }
  52. }
  53. public Object queryScalar(String sql, Object... parameters) {//单行单列
  54. Connection connection = null;
  55. try {
  56. connection = JDBC_Druid.getConnection();
  57. return qr.query(connection, sql, new ScalarHandler(), parameters);
  58. } catch (Exception e) {
  59. throw new RuntimeException(e);
  60. } finally {
  61. JDBC_Druid.close(null, null, connection);
  62. }
  63. }
  64. }