问题引入
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
package JDBC.dao_.dao;import JDBC.datasource.JDBC_Druid;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;import org.apache.commons.dbutils.handlers.BeanListHandler;import org.apache.commons.dbutils.handlers.ScalarHandler;import java.sql.Connection;import java.util.List;@SuppressWarnings({"all"})public class BasicDAO<T> {//泛型指定具体的类型QueryRunner qr = new QueryRunner();//开发通用的dml方法,针对任意表public int update(String sql, Object... parameters) {Connection connection = null;try {connection = JDBC_Druid.getConnection();int update = qr.update(connection, sql, parameters);return update;} catch (Exception e) {throw new RuntimeException(e);} finally {JDBC_Druid.close(null, null, connection);}}/*** @param sql 可以有 ?* @param clazz 传入一个Class对象 比如 Actor.Class* @param parameters 传入 ? 可变参数* @return 根据Actor.Class 返回对应的集合*/public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters) {//返回多行记录Connection connection = null;try {connection = JDBC_Druid.getConnection();return qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);} catch (Exception e) {throw new RuntimeException(e);} finally {JDBC_Druid.close(null, null, connection);}}public T querySingle(String sql, Class<T> clazz, Object... parameters) {//返回单行多列记录Connection connection = null;try {connection = JDBC_Druid.getConnection();return qr.query(connection, sql, new BeanHandler<T>(clazz), parameters);} catch (Exception e) {throw new RuntimeException(e);} finally {JDBC_Druid.close(null, null, connection);}}public Object queryScalar(String sql, Object... parameters) {//单行单列Connection connection = null;try {connection = JDBC_Druid.getConnection();return qr.query(connection, sql, new ScalarHandler(), parameters);} catch (Exception e) {throw new RuntimeException(e);} finally {JDBC_Druid.close(null, null, connection);}}}
