|
@@ -0,0 +1,135 @@
|
|
|
+package com.lovecoding.dao.impl;
|
|
|
+
|
|
|
+import com.lovecoding.utils.JDBCTools;
|
|
|
+import com.lovecoding.utils.JDBCTools2;
|
|
|
+
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.sql.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * ClassName: BaseDAOImpl
|
|
|
+ * Package: com.lovecoding.dao.impl
|
|
|
+ * Description: 操作(增、删、改、查)代码重复度很高,所以可以抽取公共代码,给这些DAO的实现类可以抽取一个公共的父类,我们称为BaseDAOImpl.
|
|
|
+ *
|
|
|
+ * @Author 爱扣钉-陈晨
|
|
|
+ * @Create 2023/4/12 19:28
|
|
|
+ * @Version 1.0
|
|
|
+ */
|
|
|
+public abstract class BaseDAOImpl {
|
|
|
+
|
|
|
+ //五个方法
|
|
|
+ //三个 update
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 增删改通用方法
|
|
|
+ * @param sql sql语句
|
|
|
+ * @param params 参数
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public int update( String sql, Object ... params ) throws SQLException {
|
|
|
+ // sql ??
|
|
|
+ //获取链接
|
|
|
+ Connection connection = JDBCTools2.getConnection();
|
|
|
+ //sql执行对象
|
|
|
+ PreparedStatement pst = connection.prepareStatement(sql);
|
|
|
+ //设置参数
|
|
|
+ for (int i = 1; i <= params.length; i++) {
|
|
|
+ //索引从1开始
|
|
|
+ //params数组索引从0开始
|
|
|
+ pst.setObject(i,params[i-1]);
|
|
|
+ }
|
|
|
+ //执行sql
|
|
|
+ return pst.executeUpdate();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //两个 query
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询单个的方法
|
|
|
+ * @param clazz 封装的对象类型
|
|
|
+ * @param sql
|
|
|
+ * @param params
|
|
|
+ * @param <T>
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public <T> T getBean(Class<T> clazz, String sql, Object ... params) throws SQLException {
|
|
|
+ List<T> list = getList(clazz, sql, params);
|
|
|
+
|
|
|
+ if (list != null && list.size() > 0 ){
|
|
|
+ return list.get(0);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询多个的方法
|
|
|
+ * @param clazz
|
|
|
+ * @param sql
|
|
|
+ * @param params
|
|
|
+ * @param <T>
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public <T> List<T> getList(Class<T> clazz, String sql, Object[] params) throws SQLException {
|
|
|
+ //返回对象
|
|
|
+ ArrayList<T> list = new ArrayList<>();
|
|
|
+ //获取链接
|
|
|
+ Connection connection = JDBCTools.getConnection();
|
|
|
+ //sql执行对象
|
|
|
+ PreparedStatement pst = connection.prepareStatement(sql);
|
|
|
+ //设置参数
|
|
|
+ if (params != null && params.length > 0){
|
|
|
+ for (int i = 1; i <= params.length; i++) {
|
|
|
+ //索引从1开始
|
|
|
+ //params数组索引从0开始
|
|
|
+ pst.setObject(i,params[i-1]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //执行查询方法
|
|
|
+ ResultSet rs = pst.executeQuery();
|
|
|
+ //根据反射
|
|
|
+
|
|
|
+ //metaData 表头的信息
|
|
|
+ ResultSetMetaData metaData = rs.getMetaData();
|
|
|
+
|
|
|
+ //遍历
|
|
|
+ while (rs.next()){
|
|
|
+ //反射创建对象
|
|
|
+ try {
|
|
|
+ T t = clazz.newInstance();
|
|
|
+ //列的数量
|
|
|
+ int columnCount = metaData.getColumnCount();
|
|
|
+
|
|
|
+ for (int i = 1; i <= columnCount; i++) {
|
|
|
+ //设置属性值
|
|
|
+ //属性名称 值
|
|
|
+ Object val = rs.getObject(i);
|
|
|
+ //getColumnLabel 别名的中
|
|
|
+ //getColumnName 列名 = 属性名
|
|
|
+ String columnLabel = metaData.getColumnLabel(i);
|
|
|
+ //注入值
|
|
|
+ Field declaredField = clazz.getDeclaredField(columnLabel);
|
|
|
+ //破解
|
|
|
+ declaredField.setAccessible(true);
|
|
|
+ //值
|
|
|
+ declaredField.set(t,val);
|
|
|
+
|
|
|
+ }
|
|
|
+ //添加到list集合
|
|
|
+ list.add(t);
|
|
|
+ } catch (InstantiationException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (NoSuchFieldException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|