package com.taover.repository; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.util.StringUtils; /** * * @author root * * @param * @param */ public class CustomJdbcTemplate { @Resource private JdbcTemplate jdbcTemplateRead; @Resource private JdbcTemplate jdbcTemplateWrite; private Map beanToTableField; private Map tableToBeanField; private String tableFieldNameListGapWithComma; private String idTableFieldName; private String idBeanFieldName; private String dbName; private String tableName; private Class tClassInfo; private CustomJdbcTemplateRowMapper customJdbcTemplateRowMapper; public CustomJdbcTemplateRowMapper getCustomJdbcTemplateRowMapper(){ return this.customJdbcTemplateRowMapper; } public CustomJdbcTemplate() throws Exception{ //获取泛型类Class this.tClassInfo = (Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; //检查实体声明 Table annoTable = (Table) tClassInfo.getAnnotation(Table.class); if(annoTable == null){ throw new Exception("DAO层初始化失败,失败原因:"+tClassInfo.getName()+"实体类,没有@Table注解指定表名"); } this.tableName = annoTable.name(); if(annoTable.schema() != null){ this.dbName = annoTable.schema(); }else if(annoTable.catalog() != null){ this.dbName = annoTable.catalog(); } //初始化数据 beanToTableField = new HashMap(); tableToBeanField = new HashMap(); tableFieldNameListGapWithComma = ""; Field[] declaredFields = tClassInfo.getDeclaredFields(); for(int i=0; i * 例如:HelloWorld->HELLO_WORLD * @param name 转换前的驼峰式命名的字符串 * @return 转换后下划线大写方式命名的字符串 */ public String camelToUnderline(String name) { StringBuilder result = new StringBuilder(); if (name != null && name.length() > 0) { // 将第一个字符处理成大写 result.append(name.substring(0, 1).toUpperCase()); // 循环处理其余字符 for (int i = 1; i < name.length(); i++) { String s = name.substring(i, i + 1); // 在大写字母前添加下划线 if (Character.isUpperCase(s.charAt(0)) && Character.isLetter(s.charAt(0))) { result.append("_"); } // 其他字符直接转成大写 result.append(s.toUpperCase()); } } return result.toString(); } /** * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
* 例如:HELLO_WORLD->HelloWorld * @param name 转换前的下划线大写方式命名的字符串 * @return 转换后的驼峰式命名的字符串 */ public String underlineToCamel(String name) { StringBuilder result = new StringBuilder(); // 快速检查 if (name == null || name.isEmpty()) { // 没必要转换 return ""; } else if (!name.contains("_")) { // 不含下划线,仅将首字母小写 return name.substring(0, 1).toLowerCase() + name.substring(1); } // 用下划线将原始字符串分割 String camels[] = name.split("_"); for (String camel : camels) { // 跳过原始字符串中开头、结尾的下换线或双重下划线 if (camel.isEmpty()) { continue; } // 处理真正的驼峰片段 if (result.length() == 0) { // 第一个驼峰片段,全部字母都小写 result.append(camel.toLowerCase()); } else { // 其他的驼峰片段,首字母大写 result.append(camel.substring(0, 1).toUpperCase()); result.append(camel.substring(1).toLowerCase()); } } return result.toString(); } public void appendWhereCondition(StringBuffer sql, StringBuffer pql, List list, List condition) { if (condition == null || condition.size() == 0) return; Object[] con = condition.get(0); int iLen = condition.size(); sql.append(" WHERE "); pql.append(" WHERE "); sql.append(con[0]); pql.append(con[0]); if (null != con[1] && con[1] != "" && con[1] != "useArg[0]") { sql.append(" " + con[1] + " ?"); pql.append(" " + con[1] + " " + con[2]); list.add(con[2]); } for (int i = 1; i < iLen; i++) { con = condition.get(i); sql.append(" AND "); pql.append(" AND "); sql.append(con[0]); pql.append(con[0]); if (null == con[1] || "" == con[1] || con[1] == "useArg[0]") continue; sql.append(" " + con[1] + " ?"); pql.append(" " + con[1] + " " + con[2]); list.add(con[2]); } } public void appendWhereConditionForCount(StringBuffer sql, List condition) { if (condition == null || condition.size() == 0) return; Object[] con = condition.get(0); int iLen = condition.size(); sql.append(" WHERE "); sql.append(con[0]); if (null != con[1] && con[1] != "" && con[1] != "useArg[0]") { sql.append(" " + con[1] + " ?"); } for (int i = 1; i < iLen; i++) { con = condition.get(i); sql.append(" AND "); sql.append(con[0]); if (null == con[1] || "" == con[1] || con[1] == "useArg[0]") continue; sql.append(" " + con[1] + " ?"); } } public void appendSql(StringBuffer sql, StringBuffer pql, List list, List obj) { for (Object[] arg : obj) { String opt = "="; if (arg.length > 2) { opt = (String)arg[2]; } if (opt.equals("=")) { sql.append(" " + arg[0] + " = ?,"); pql.append(" " + arg[0] + " = " + arg[1] + ","); } else { sql.append(" " + arg[0] + " = " + arg[0] + " + ?,"); pql.append(" " + arg[0] + " = " + arg[0] + " + " + arg[1] + ","); } list.add(arg[1]); } } private String getTableSql(){ return "".equals(this.dbName)?"`"+this.tableName+"`":("`"+this.dbName+"`.`"+this.tableName+"`"); } /** * 按主键查询 */ public T findEntityByID(ID id) { return findEntityByID(id, true, false); } /** * 按主键查询 * isLock 是否锁定, 默认不锁 * fromWriteDB 是否从写库读写,默认从读库查询 */ public T findEntityByID(ID id, boolean fromWriteDB, boolean isLock) { StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql()); StringBuffer pql = new StringBuffer(sql.toString()); sql.append(" WHERE "+idTableFieldName+" = ?"); pql.append(" WHERE "+idTableFieldName+" = " + id); if (isLock) { sql.append(" FOR UPDATE"); pql.append(" FOR UPDATE"); } T result = null; try { result = (T) (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).queryForObject(sql.toString(), this.customJdbcTemplateRowMapper, id); }catch(Exception e) { UtilsLog.errorForException(e, this.getClass()); } return result; } /** * 根据条件List查询 * Object[]数组长度是3 * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。 */ public T findEntityByCondition(List condition) throws Exception { List tempList = findListByCondition(condition, null, false); if(tempList == null || tempList.size() == 0){ return null; } if(tempList != null && tempList.size() == 1){ return tempList.get(0); }else{ throw new Exception("数据库存在多条记录满足条件"); } } /** * 根据条件sql查询 * sqlCondition 为where 后面的条件。 */ public T findEntityBySql(String sqlCondition) throws Exception{ List tempList = findListBySql(sqlCondition, false); if(tempList == null || tempList.size() == 0){ return null; } if(tempList != null && tempList.size() == 1){ return tempList.get(0); }else{ throw new Exception("数据库存在多条记录满足条件"); } } /** * 根据条件List查询 * Object[]数组长度是3 * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。 */ public List findListByCondition(List condition) { return findListByCondition(condition,null, false); } /** * 根据条件List查询 * Object[]数组长度是3 * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。 */ public List findListByCondition(List condition, String sortCondition, boolean fromWriteDB) { StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql()); StringBuffer pql = new StringBuffer(sql.toString()); List list = new ArrayList(); this.appendWhereCondition(sql, pql, list, condition); if(!StringUtils.isEmpty(sortCondition)){ sql.append(" " + sortCondition + " "); pql.append(" " + sortCondition + " "); } List resultList = null; try { resultList = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(sql.toString(), this.customJdbcTemplateRowMapper, list.toArray()); return resultList; } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return null; } /** * 根据条件sql查询 * sqlCondition 为where 后面的条件。 */ public List findListBySql(String sqlCondition) { return findListBySql(sqlCondition, false); } /** * 根据条件sql查询 * sqlCondition 为where 后面的条件。 */ public List findListBySql(String sqlCondition, boolean fromWriteDB) { StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql()+" WHERE " + sqlCondition); List resultList = null; try { resultList = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(sql.toString(), this.customJdbcTemplateRowMapper); return resultList; } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return null; } /** * 按条件分页查询 * Object[]数组长度是3 * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。 */ public Map findPageByCondition(List condition,int page, int pageSize) { return findPageByCondition(condition, null , page, pageSize, false); } /** * 按条件分页查询 * Object[]数组长度是3 * Object[]第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。 * boolean isUseCache, 是否用缓存,默认用。 * boolean isAddCache, 是否添加缓存,默认添加。 */ public Map findPageByCondition(List condition,String sortCondition, int page, int pageSize, boolean fromWriteDB) { StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql()); StringBuffer pql = new StringBuffer(sql.toString()); StringBuffer sqlCount = new StringBuffer("SELECT COUNT(1) rowCount FROM "+this.getTableSql()); List count_list = new ArrayList(); List page_list = new ArrayList(); this.appendWhereConditionForCount(sqlCount, condition); this.appendWhereCondition(sql, pql, count_list, condition); for (int i = 0; i < count_list.size(); i++) page_list.add(count_list.get(i)); page_list.add((page - 1) * pageSize); page_list.add(pageSize); if(!StringUtils.isEmpty(sortCondition)){ sql.append(" " + sortCondition + " "); pql.append(" " + sortCondition + " "); } String pageSql = sql.toString() + " limit ?, ?"; List resultList = null; try { Map totalRowsMap = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).queryForMap(sqlCount.toString(), count_list.toArray()) ; Map resultMap = new HashMap(); resultMap.put("page", page); resultMap.put("total", totalRowsMap.get("rowCount")); resultList = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(pageSql.toString(), this.customJdbcTemplateRowMapper, page_list.toArray()); resultMap.put("rows", resultList); return resultMap; } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return null; } /** * 按sql分页查询, sqlCondition为where 后条件sql */ public Map findPageBySql(String sqlCondition, int page, int pageSize) { return findPageBySql(sqlCondition, page, pageSize, false); } /** * 按sql分页查询, sqlCondition为where 后条件sql */ public Map findPageBySql(String sqlCondition, int page, int pageSize,boolean fromWriteDB) { StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql()+" WHERE " + sqlCondition ); StringBuffer sqlCount = new StringBuffer("SELECT count(1) rowCount FROM "+this.getTableSql()+" WHERE " + sqlCondition); String pageSql = sql.toString() + " limit ?, ?"; String pagePql = sql.toString() + " limit " + ((page -1) * pageSize) + ", " + (page * pageSize); List page_list = new ArrayList(); page_list.add((page - 1) * pageSize); page_list.add(page * pageSize); List resultList = null; try { Map totalRowsMap = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).queryForMap(sqlCount.toString()); Map resultMap = new HashMap(); resultMap.put("page", page); resultMap.put("total", totalRowsMap.get("rowCount")); resultList = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(pageSql.toString(), this.customJdbcTemplateRowMapper, page_list.toArray()); resultMap.put("rows", resultList); return resultMap; } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return null; } /** * 添加 */ public BigInteger addEntityForAutoincrementId(T entity) { StringBuffer sqlForLog = new StringBuffer("INSERT INTO "+this.getTableSql()+"("); StringBuffer sqlValueForLog = new StringBuffer(") VALUES ("); StringBuffer sqlInsertPart = new StringBuffer("INSERT INTO "+this.getTableSql()+"("); StringBuffer sqlColumnPart = new StringBuffer(") VALUES ("); List paramList = new ArrayList(); Iterator beanFieldIter = this.beanToTableField.keySet().iterator(); while(beanFieldIter.hasNext()){ String beanFieldName = beanFieldIter.next(); String tableFieldName = this.beanToTableField.get(beanFieldName); Field beanField; Object beanFieldValue = null; try { beanField = this.tClassInfo.getDeclaredField(beanFieldName); beanField.setAccessible(true); beanFieldValue = beanField.get(entity); } catch (Exception e) { e.printStackTrace(); } if(tableFieldName == null || beanFieldName == null || beanFieldValue == null){ continue; } sqlForLog.append("`"+tableFieldName+"`,"); sqlValueForLog.append(beanFieldValue.toString()+","); sqlInsertPart.append("`"+tableFieldName+"`,"); sqlColumnPart.append(" ?,"); paramList.add(beanFieldValue); } //打印日志内容 sqlForLog.substring(0, sqlForLog.length()-1); sqlForLog.append(") VALUES ("); sqlForLog.append(sqlValueForLog+")"); //UtilsLog.infoForMessage(sqlForLog.toString(), this.getClass()); //执行SQL String exeSql = sqlInsertPart.substring(0, sqlInsertPart.length()-1)+sqlColumnPart.substring(0, sqlColumnPart.length()-1)+")"; try { jdbcTemplateWrite.update(exeSql, paramList.toArray()); Map lastInsertIdMap = jdbcTemplateWrite.queryForMap("SELECT LAST_INSERT_ID() lastInsertId"); return (BigInteger)lastInsertIdMap.get("lastInsertId"); } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return null; } /** * 批量添加 */ public List addEntityList(List entityList) { List result = new ArrayList(); for (T entity : entityList) { result.add(addEntityForAutoincrementId(entity)); } return result; } /** * 按ID删除 */ public int deleteEntityByID(ID id) { StringBuffer sql = new StringBuffer("DELETE FROM "+this.getTableSql()+" WHERE"); StringBuffer pql = new StringBuffer(sql.toString()); pql.append(" "+this.idTableFieldName+" = " + id); sql.append(" "+this.idTableFieldName+" = ?"); //UtilsLog.infoForMessage(pql.toString(), this.getClass()); return jdbcTemplateWrite.update(sql.toString(), id); } /** * 删除按List条件 * Object[]数组长度是3 * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。 */ public int deleteEntityByCondition(List condition) throws Exception{ if (null == condition || condition.size() == 0) { throw new Exception("没有传入条件,请至少传入一个筛选条件"); } List list = new ArrayList(); StringBuffer sql = new StringBuffer("DELETE FROM "+this.getTableSql()+""); StringBuffer pql = new StringBuffer(sql.toString()); this.appendWhereCondition(sql, pql, list, condition); try { return jdbcTemplateWrite.update( sql.toString(), list.toArray()); } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return 0; } /** * 删除按condition条件 * 建议使用deleteTByCondition(List condition), 如果removeTByCondition(List condition)满足不了where条件可以使用此方法。 * condition为where后面的条件,condition不能为空。 */ public int deleteEntityBySql(String sqlCondition) throws Exception{ if("".equals(sqlCondition)) { throw new Exception("没有传入条件,请至少传入一个筛选条件"); } StringBuffer sql = new StringBuffer("DELETE FROM "+this.getTableSql()+" WHERE "); try { return jdbcTemplateWrite.update( sql.toString() + sqlCondition); } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return 0; } /** * 根据list对象逐个删除。 */ public List deleteEntityList(List entityList) { List result = new ArrayList(); for (T entity : entityList) { Field beanField; Object beanFieldValue = Integer.valueOf(0); try { beanField = this.tClassInfo.getDeclaredField(this.idBeanFieldName); beanField.setAccessible(true); beanFieldValue = beanField.get(entity); } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } result.add(deleteEntityByID((ID)beanFieldValue)); } return result; } /** * 根据ID修改指定的值 */ public int updateEntityById(List changeList, ID id) throws Exception{ if(null == id){ throw new Exception("请求条件异常,没有传入主键ID!"); } StringBuffer sql = new StringBuffer("UPDATE "+this.getTableSql()+" SET"); StringBuffer pql = new StringBuffer(sql.toString()); List list = new ArrayList(); for (int i = 0, iLen = changeList.size(); i < iLen; i++) { String name = (String) changeList.get(i)[0]; Object value = changeList.get(i)[1]; String variationOpt = "="; if (changeList.get(i).length > 2) variationOpt = (String)changeList.get(i)[2]; if (variationOpt.equals("=")) { sql.append(" " + name + " = ?,"); list.add(value); if (value == null) { pql.append(" " + name + "=null,"); } else { pql.append(" " + name + "=\"" + value.toString() + "\","); } } else { sql.append(" " + name + " = " + name + " + ?,"); list.add(value); pql.append(" " + name + " = " + name + " + " + value.toString() + ","); } } //记录SQL String pwhere = " WHERE "+this.idTableFieldName+"=\"" + id + "\""; //UtilsLog.infoForMessage(pql.toString()+pwhere, this.getClass()); try { String where = " WHERE "+this.idTableFieldName+"=?"; String updateSql = sql.substring(0, sql.length()-1)+where; list.add(id); return jdbcTemplateWrite.update(updateSql, list.toArray()); } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return 0; } /** * List updateObj 要修改成的值,数组长度为2,第一个值为列名,第二个值是要改成的值。 * List condition 修改的条件, 数组长度是3, 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。 */ public int updateEntityByCondition(List updateObj, List condition) throws Exception{ if (null == updateObj || updateObj.size() == 0) { throw new Exception("请求条件异常,请求条件List updateObj不能为空!"); } if (null == condition || condition.size() == 0) { throw new Exception("请求条件异常,请求条件List condition不能为空!"); } StringBuffer sql = new StringBuffer("UPDATE "+this.getTableSql()+" SET"); StringBuffer pql = new StringBuffer(sql.toString()); List list = new ArrayList(); this.appendSql(sql, pql, list, updateObj); StringBuffer where = new StringBuffer(""); StringBuffer pwhere = new StringBuffer(""); this.appendWhereCondition(where, pwhere, list, condition); //UtilsLog.infoForMessage(pql.toString()+pwhere.toString(), this.getClass()); String updateSql = sql.substring(0, sql.length()-1)+where.toString(); try { return jdbcTemplateWrite.update(updateSql, list.toArray()); } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return 0; } /** * List updateObj 要修改成的值,数组长度为2,第一个值为列名,第二个值是要改成的值。 * String sqlCondition 修改的条件。 */ public int updateEntityBySql(List updateObj, String sqlCondition) throws Exception{ if (null == updateObj || updateObj.size() == 0) { throw new Exception("请求条件异常,请求条件List updateObj不能为空!"); } if ("".equals(sqlCondition)) { throw new Exception("请求条件异常,请求条件sqlCondition不能为空!"); } StringBuffer sql = new StringBuffer("UPDATE "+this.getTableSql()+" SET"); StringBuffer pql = new StringBuffer(sql.toString()); List list = new ArrayList(); this.appendSql(sql, pql, list, updateObj); try { String updateSql = sql.toString().substring(0, sql.length()-1) + " WHERE "+sqlCondition; return jdbcTemplateWrite.update(updateSql, list.toArray()); } catch (Exception e) { UtilsLog.errorForException(e, this.getClass()); } return 0; } public Map getPageData(String coreSql, String orderByPartSql, Integer page, Integer pageSize){ //构造查询语句 String querySql = coreSql+orderByPartSql+UtilsSql.getLimitCondition(page, pageSize); //构造统计计数语句 String countSql = "select count(*) rows from ("+coreSql+" ) t "; //执行查询 List> queryData = new ArrayList>(); Map countData = new HashMap(); try{ queryData = this.jdbcTemplateRead.queryForList(querySql); countData = this.jdbcTemplateRead.queryForMap(countSql); }catch(Exception e){ countData.put("rows", "0"); UtilsLog.errorForException(e, this.getClass()); } return UtilsSql.createPage(page, Integer.valueOf(countData.get("rows").toString()), queryData); } }