• jdbcTemplate的Dao层封装


      1 package com.easyrail.base.dao;
      2 
      3 import java.io.Serializable;
      4 import java.lang.reflect.Field;
      5 import java.lang.reflect.ParameterizedType;
      6 import java.sql.Types;
      7 import java.util.LinkedHashMap;
      8 import java.util.List;
      9 import java.util.Map;
     10 
     11 import org.springframework.jdbc.core.BeanPropertyRowMapper;
     12 import org.springframework.jdbc.core.JdbcTemplate;
     13 import org.springframework.jdbc.core.RowMapper;
     14 
     15 public abstract class BaseDaoImpl<T>{
     16     /** 设置一些操作的常量 */
     17     public static final String SQL_INSERT = "insert";
     18     public static final String SQL_UPDATE = "update";
     19     public static final String SQL_DELETE = "delete";
     20 
     21     private JdbcTemplate jdbcTemplate;
     22 
     23     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
     24         this.jdbcTemplate = jdbcTemplate;
     25     }
     26 
     27     private Class<T> entityClass;
     28 
     29     @SuppressWarnings("unchecked")
     30     public BaseDaoImpl() {
     31         ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
     32         entityClass = (Class<T>) type.getActualTypeArguments()[0];
     33         System.out.println("Dao实现类是:" + entityClass.getName());
     34     }
     35 
     36     public void save(T entity) {
     37         String sql = this.makeSql(SQL_INSERT);
     38         Object[] args = this.setArgs(entity, SQL_INSERT);
     39         int[] argTypes = this.setArgTypes(entity, SQL_INSERT);
     40         jdbcTemplate.update(sql.toString(), args, argTypes);
     41     }
     42 
     43     public void update(T entity) {
     44         String sql = this.makeSql(SQL_UPDATE);
     45         Object[] args = this.setArgs(entity, SQL_UPDATE);
     46         int[] argTypes = this.setArgTypes(entity, SQL_UPDATE);
     47         jdbcTemplate.update(sql, args, argTypes);
     48     }
     49 
     50     public void delete(T entity) {
     51         String sql = this.makeSql(SQL_DELETE);
     52         Object[] args = this.setArgs(entity, SQL_DELETE);
     53         int[] argTypes = this.setArgTypes(entity, SQL_DELETE);
     54         jdbcTemplate.update(sql, args, argTypes);
     55     }
     56 
     57     public void delete(Serializable id) {
     58         String sql = " DELETE FROM " + entityClass.getSimpleName() + " WHERE id=?";
     59         jdbcTemplate.update(sql, id);
     60     }
     61 
     62     public void deleteAll() {
     63         String sql = " TRUNCATE TABLE " + entityClass.getSimpleName();
     64         jdbcTemplate.execute(sql);
     65     }
     66 
     67     public T findById(Serializable id) {
     68         String sql = "SELECT * FROM " + entityClass.getSimpleName() + " WHERE id=?";
     69         RowMapper<T> rowMapper = BeanPropertyRowMapper.newInstance(entityClass);
     70         return jdbcTemplate.query(sql, rowMapper, id).get(0);
     71     }
     72 
     73     public List<T> findAll() {
     74         String sql = "SELECT * FROM " + entityClass.getSimpleName();
     75         RowMapper<T> rowMapper = BeanPropertyRowMapper.newInstance(entityClass);
     76         return jdbcTemplate.query(sql, rowMapper);
     77     }
     78 
     79     // 组装SQL
     80     private String makeSql(String sqlFlag) {
     81         StringBuffer sql = new StringBuffer();
     82         Field[] fields = entityClass.getDeclaredFields();
     83         if (sqlFlag.equals(SQL_INSERT)) {
     84             sql.append(" INSERT INTO " + entityClass.getSimpleName());
     85             sql.append("(");
     86             for (int i = 0; fields != null && i < fields.length; i++) {
     87                 fields[i].setAccessible(true); // 暴力反射
     88                 String column = fields[i].getName();
     89                 sql.append(column).append(",");
     90             }
     91             sql = sql.deleteCharAt(sql.length() - 1);
     92             sql.append(") VALUES (");
     93             for (int i = 0; fields != null && i < fields.length; i++) {
     94                 sql.append("?,");
     95             }
     96             sql = sql.deleteCharAt(sql.length() - 1);
     97             sql.append(")");
     98         } else if (sqlFlag.equals(SQL_UPDATE)) {
     99             sql.append(" UPDATE " + entityClass.getSimpleName() + " SET ");
    100             for (int i = 0; fields != null && i < fields.length; i++) {
    101                 fields[i].setAccessible(true); // 暴力反射
    102                 String column = fields[i].getName();
    103                 if (column.equals("id")) { // id 代表主键
    104                     continue;
    105                 }
    106                 sql.append(column).append("=").append("?,");
    107             }
    108             sql = sql.deleteCharAt(sql.length() - 1);
    109             sql.append(" WHERE id=?");
    110         } else if (sqlFlag.equals(SQL_DELETE)) {
    111             sql.append(" DELETE FROM " + entityClass.getSimpleName() + " WHERE id=?");
    112         }
    113         System.out.println("SQL=" + sql);
    114         return sql.toString();
    115 
    116     }
    117 
    118     // 设置参数
    119     private Object[] setArgs(T entity, String sqlFlag) {
    120         Field[] fields = entityClass.getDeclaredFields();
    121         if (sqlFlag.equals(SQL_INSERT)) {
    122             Object[] args = new Object[fields.length];
    123             for (int i = 0; args != null && i < args.length; i++) {
    124                 try {
    125                     fields[i].setAccessible(true); // 暴力反射
    126                     args[i] = fields[i].get(entity);
    127                 } catch (Exception e) {
    128                     e.printStackTrace();
    129                 }
    130             }
    131             return args;
    132         } else if (sqlFlag.equals(SQL_UPDATE)) {
    133             Object[] tempArr = new Object[fields.length];
    134             for (int i = 0; tempArr != null && i < tempArr.length; i++) {
    135                 try {
    136                     fields[i].setAccessible(true); // 暴力反射
    137                     tempArr[i] = fields[i].get(entity);
    138                 } catch (Exception e) {
    139                     e.printStackTrace();
    140                 }
    141             }
    142             Object[] args = new Object[fields.length];
    143             System.arraycopy(tempArr, 1, args, 0, tempArr.length - 1); // 数组拷贝
    144             args[args.length - 1] = tempArr[0];
    145             return args;
    146         } else if (sqlFlag.equals(SQL_DELETE)) {
    147             Object[] args = new Object[1]; // 长度是1
    148             fields[0].setAccessible(true); // 暴力反射
    149             try {
    150                 args[0] = fields[0].get(entity);
    151             } catch (Exception e) {
    152                 e.printStackTrace();
    153             }
    154             return args;
    155         }
    156         return null;
    157 
    158     }
    159 
    160     // 设置参数类型(写的不全,只是一些常用的)
    161     private int[] setArgTypes(T entity, String sqlFlag) {
    162         Field[] fields = entityClass.getDeclaredFields();
    163         if (sqlFlag.equals(SQL_INSERT)) {
    164             int[] argTypes = new int[fields.length];
    165             try {
    166                 for (int i = 0; argTypes != null && i < argTypes.length; i++) {
    167                     fields[i].setAccessible(true); // 暴力反射
    168                     if (fields[i].get(entity).getClass().getName().equals("java.lang.String")) {
    169                         argTypes[i] = Types.VARCHAR;
    170                     } else if (fields[i].get(entity).getClass().getName().equals("java.lang.Double")) {
    171                         argTypes[i] = Types.DECIMAL;
    172                     } else if (fields[i].get(entity).getClass().getName().equals("java.lang.Integer")) {
    173                         argTypes[i] = Types.INTEGER;
    174                     } else if (fields[i].get(entity).getClass().getName().equals("java.util.Date")) {
    175                         argTypes[i] = Types.DATE;
    176                     }
    177                 }
    178             } catch (Exception e) {
    179                 e.printStackTrace();
    180             }
    181             return argTypes;
    182         } else if (sqlFlag.equals(SQL_UPDATE)) {
    183             int[] tempArgTypes = new int[fields.length];
    184             int[] argTypes = new int[fields.length];
    185             try {
    186                 for (int i = 0; tempArgTypes != null && i < tempArgTypes.length; i++) {
    187                     fields[i].setAccessible(true); // 暴力反射
    188                     if (fields[i].get(entity).getClass().getName().equals("java.lang.String")) {
    189                         tempArgTypes[i] = Types.VARCHAR;
    190                     } else if (fields[i].get(entity).getClass().getName().equals("java.lang.Double")) {
    191                         tempArgTypes[i] = Types.DECIMAL;
    192                     } else if (fields[i].get(entity).getClass().getName().equals("java.lang.Integer")) {
    193                         tempArgTypes[i] = Types.INTEGER;
    194                     } else if (fields[i].get(entity).getClass().getName().equals("java.util.Date")) {
    195                         tempArgTypes[i] = Types.DATE;
    196                     }
    197                 }
    198                 System.arraycopy(tempArgTypes, 1, argTypes, 0, tempArgTypes.length - 1); // 数组拷贝
    199                 argTypes[argTypes.length - 1] = tempArgTypes[0];
    200 
    201             } catch (Exception e) {
    202                 e.printStackTrace();
    203             }
    204             return argTypes;
    205 
    206         } else if (sqlFlag.equals(SQL_DELETE)) {
    207             int[] argTypes = new int[1]; // 长度是1
    208             try {
    209                 fields[0].setAccessible(true); // 暴力反射
    210                 if (fields[0].get(entity).getClass().getName().equals("java.lang.String")) {
    211                     argTypes[0] = Types.VARCHAR;
    212                 } else if (fields[0].get(entity).getClass().getName().equals("java.lang.Integer")) {
    213                     argTypes[0] = Types.INTEGER;
    214                 }
    215 
    216             } catch (Exception e) {
    217                 e.printStackTrace();
    218             }
    219             return argTypes;
    220         }
    221         return null;
    222     }
    223 
    224     private List<T> find(int pageNo, int pageSize, Map<String, String> where, LinkedHashMap<String, String> orderby) {
    225         // where 与 order by 要写在select * from table 的后面,而不是where rownum<=? )
    226         // where rn>=?的后面
    227         StringBuffer sql = new StringBuffer(
    228                 " SELECT * FROM (SELECT t.*,ROWNUM rn FROM (SELECT * FROM " + entityClass.getSimpleName());
    229         if (where != null && where.size() > 0) {
    230             sql.append(" WHERE "); // 注意不是where
    231             for (Map.Entry<String, String> me : where.entrySet()) {
    232                 String columnName = me.getKey();
    233                 String columnValue = me.getValue();
    234                 sql.append(columnName).append(" ").append(columnValue).append(" AND "); // 没有考虑or的情况
    235             }
    236             int endIndex = sql.lastIndexOf("AND");
    237             if (endIndex > 0) {
    238                 sql = new StringBuffer(sql.substring(0, endIndex));
    239             }
    240         }
    241         if (orderby != null && orderby.size() > 0) {
    242             sql.append(" ORDER BY ");
    243             for (Map.Entry<String, String> me : orderby.entrySet()) {
    244                 String columnName = me.getKey();
    245                 String columnValue = me.getValue();
    246                 sql.append(columnName).append(" ").append(columnValue).append(",");
    247             }
    248             sql = sql.deleteCharAt(sql.length() - 1);
    249         }
    250         sql.append(" ) t WHERE ROWNUM<=? ) WHERE rn>=? ");
    251         System.out.println("SQL=" + sql);
    252         Object[] args = { pageNo * pageSize, (pageNo - 1) * pageSize + 1 };
    253         RowMapper<T> rowMapper = BeanPropertyRowMapper.newInstance(entityClass);
    254         return jdbcTemplate.query(sql.toString(), args, rowMapper);
    255     }
    256 
    257     private int count(Map<String, String> where) {
    258         StringBuffer sql = new StringBuffer(" SELECT COUNT(*) FROM " + entityClass.getSimpleName());
    259         if (where != null && where.size() > 0) {
    260             sql.append(" WHERE ");
    261             for (Map.Entry<String, String> me : where.entrySet()) {
    262                 String columnName = me.getKey();
    263                 String columnValue = me.getValue();
    264                 sql.append(columnName).append(" ").append(columnValue).append(" AND "); // 没有考虑or的情况
    265             }
    266             int endIndex = sql.lastIndexOf("AND");
    267             if (endIndex > 0) {
    268                 sql = new StringBuffer(sql.substring(0, endIndex));
    269             }
    270         }
    271         System.out.println("SQL=" + sql);
    272         return jdbcTemplate.queryForInt(sql.toString());
    273     }
    274 }
  • 相关阅读:
    2w字 + 40张图带你参透并发编程!
    完了,这个硬件成精了,它竟然绕过了 CPU...
    一文详解 Java 并发模型
    详解匈牙利算法与二分图匹配
    机器学习 | 详解GBDT在分类场景中的应用原理与公式推导
    Python | 浅谈并发锁与死锁问题
    LeetCode 91,点赞和反对五五开,这题是好是坏由你来评判
    LeetCode 90 | 经典递归问题,求出所有不重复的子集II
    【Azure DevOps系列】什么是Azure DevOps
    MSIL入门(四)之委托delegate
  • 原文地址:https://www.cnblogs.com/jianguang/p/5884643.html
Copyright © 2020-2023  润新知