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 }