SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装

Posted 蕃薯耀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装相关的知识,希望对你有一定的参考价值。

SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

©Copyright 蕃薯耀 2017年7月6日

http://www.cnblogs.com/fanshuyao/

 

很久之前弄的Spring Jdbc持久化层的baseDao,现在做个记录。

基本的增、删、查、改、分页、排序都可以用,只是兼容一般,如主键必须是id,并没有深入再封装。

 封装基于Spring4+Mysql

Java代码  收藏代码
  1. package com.lqy.spring.dao.impl;  
  2.   
  3. import java.io.Serializable;  
  4. import java.lang.reflect.Field;  
  5. import java.lang.reflect.Method;  
  6. import java.util.ArrayList;  
  7. import java.util.LinkedHashMap;  
  8. import java.util.List;  
  9. import java.util.Map;  
  10.   
  11. import org.springframework.beans.BeanWrapper;  
  12. import org.springframework.beans.factory.annotation.Autowired;  
  13. import org.springframework.jdbc.core.BeanPropertyRowMapper;  
  14. import org.springframework.jdbc.core.JdbcTemplate;  
  15.   
  16. import com.lqy.Utils.EntityUtils;  
  17. import com.lqy.Utils.StrUtils;  
  18. import com.lqy.spring.bean.Page;  
  19. import com.lqy.spring.dao.BaseDao;  
  20. import com.lqy.spring.editor.GenderEditor;  
  21. import com.lqy.spring.entity.SqlEntity;  
  22. import com.lqy.spring.enums.Gender;  
  23.   
  24. @SuppressWarnings({"unchecked","rawtypes"})  
  25. public class BaseDaoImpl<T> implements BaseDao<T> {  
  26.       
  27.       
  28.     @Autowired  
  29.     JdbcTemplate jdbcTemplate;  
  30.       
  31.     //entityClass.getSimpleName()=Person  
  32.     //entityClass.getName()=com.lqy.spring.c3p0.beans.Person  
  33.     protected Class<T> entityClass = (Class<T>) EntityUtils.getEntityClass(this.getClass());  
  34.   
  35.     //private  RowMapper<T> rowMapper = new BeanPropertyRowMapper<T>(entityClass);  
  36.       
  37.     private BeanPropertyRowMapper<T> rowMapper = new BeanPropertyRowMapper<T>(entityClass){  
  38.         @Override  
  39.         protected void initBeanWrapper(BeanWrapper bw) {  
  40.             bw.registerCustomEditor(Gender.class, new GenderEditor());  
  41.             super.initBeanWrapper(bw);  
  42.         }  
  43.     };  
  44.       
  45.     /** 
  46.      * 获取实体 
  47.      * @param id 对象的id(Serializable) 
  48.      * @return T 对象 
  49.      * @author lqy 
  50.      * @since 2015-10-18 
  51.      */  
  52.     @Override  
  53.     public T get(Serializable id) {  
  54.         String sql = getSql() + "and id=? ";  
  55.         return (T)jdbcTemplate.queryForObject(sql, rowMapper, id);  
  56.     }  
  57.   
  58.     /** 
  59.      * 查询 
  60.      * @return List<T> 
  61.      * @author lqy 
  62.      * @since 2015-10-18 
  63.      */  
  64.     @Override  
  65.     public List<T> query() {  
  66.         return (List<T>) jdbcTemplate.query(getSql(), rowMapper);  
  67.     }  
  68.   
  69.     /** 
  70.      * 查询 
  71.      * @param page 分页参数 
  72.      * @param whereSql 查询条件(例:o.name=?) 
  73.      * @param params 查询条件对应的参数(List<Object>) 
  74.      * @return List<T> 
  75.      * @author lqy 
  76.      * @since 2015-10-18 
  77.      */  
  78.     @Override  
  79.     public List<T> query(Page page, String whereSql, List<Object> params) {  
  80.         List<Object> paramList = new ArrayList<Object>();  
  81.         if(!StrUtils.isEmpty(whereSql) && !StrUtils.isEmpty(params)){  
  82.             for (Object object : params) {  
  83.                 if(object instanceof Enum){  
  84.                     paramList.add(((Enum)object).ordinal());  
  85.                 }else{  
  86.                     paramList.add(object);  
  87.                 }  
  88.             }  
  89.         }  
  90.         String sql = getSql(page, whereSql, null);  
  91.         dealPage(page, sql, paramList);  
  92.           
  93.         if(!StrUtils.isEmpty(page)){  
  94.             paramList.add(page.getOffSize());  
  95.             paramList.add(page.getCurrentSize());  
  96.         }  
  97.         return (List<T>)jdbcTemplate.query(sql, rowMapper, paramList.toArray());  
  98.     }  
  99.   
  100.     /** 
  101.      * 查询 
  102.      * @param page 分页参数 
  103.      * @param orderby 排序条件(LinkedHashMap<String, String>) 
  104.      * @return List<T> 
  105.      * @author lqy 
  106.      * @since 2015-10-18 
  107.      */  
  108.     @Override  
  109.     public List<T> query(Page page, LinkedHashMap<String, String> orderby) {  
  110.         List<Object> paramsList = new ArrayList<Object>();  
  111.           
  112.         String sql = getSql(page, null, orderby);  
  113.         dealPage(page, sql, paramsList);  
  114.           
  115.         if(!StrUtils.isEmpty(page)){  
  116.             paramsList.add(page.getOffSize());  
  117.             paramsList.add(page.getCurrentSize());  
  118.         }  
  119.         return (List<T>)jdbcTemplate.query(sql, rowMapper, paramsList.toArray());  
  120.     }  
  121.   
  122.     /** 
  123.      * 查询 
  124.      * @param page 分页参数 
  125.      * @param whereSql 查询条件(例:o.name=?) 
  126.      * @param params 查询条件对应的参数(List<Object>) 
  127.      * @param orderby 排序条件(LinkedHashMap<String, String>) 
  128.      * @return List<T> 
  129.      * @author lqy 
  130.      * @since 2015-10-18 
  131.      */  
  132.     @Override  
  133.     public List<T> query(Page page, String whereSql, List<Object> params, LinkedHashMap<String, String> orderby) {  
  134.         List<Object> paramsList = new ArrayList<Object>();  
  135.         if(!StrUtils.isEmpty(whereSql) && !StrUtils.isEmpty(params)){  
  136.             for (Object object : params) {  
  137.                 if(object instanceof Enum){  
  138.                     paramsList.add(((Enum)object).ordinal());  
  139.                 }else{  
  140.                     paramsList.add(object);  
  141.                 }  
  142.             }  
  143.         }  
  144.           
  145.         String sql = getSql(page, whereSql, orderby);  
  146.         //System.out.println("sql ="+sql);  
  147.         dealPage(page, sql, paramsList);  
  148.           
  149.         if(!StrUtils.isEmpty(page)){  
  150.             paramsList.add(page.getOffSize());  
  151.             paramsList.add(page.getCurrentSize());  
  152.         }  
  153.           
  154.         return (List<T>)jdbcTemplate.query(sql, rowMapper, paramsList.toArray());  
  155.     }  
  156.   
  157.     /** 
  158.      * 更新 
  159.      * @param sql 自定义更新sql 
  160.      * @param params 查询条件对应的参数(List<Object>) 
  161.      * @return int 更新的数量 
  162.      * @author lqy 
  163.      * @since 2015-10-18 
  164.      */  
  165.     @Override  
  166.     public int update(String sql, List<Object> params) {  
  167.         //String sql="update person set name=? where id=?";  
  168.         return jdbcTemplate.update(sql, params.toArray());  
  169.     }  
  170.       
  171.     /** 
  172.      * 更新(先从数据库取出来再更新) 
  173.      * @param t 更新的对象 
  174.      * @return int 更新的数量 
  175.      * @author lqy 
  176.      * @since 2015-10-18 
  177.      */  
  178.     @Override  
  179.     public int update(T t) throws Exception{  
  180.         SqlEntity sqlEntity = getUpdateSql(t);  
  181.         //System.out.println("=====sqlEntity.getSql()="+sqlEntity.getSql());  
  182.         return jdbcTemplate.update(sqlEntity.getSql(), sqlEntity.getParams().toArray());  
  183.     }  
  184.       
  185.     /** 
  186.      * 更新(通过模板更新,把符合template条件的数据都更新为value对象中的值) 
  187.      * @param t 更新的对象 
  188.      * @return int 更新的数量 
  189.      * @author lqy 
  190.      * @since 2015-10-18 
  191.      */  
  192.     @Override  
  193.     public int update(T value,T template) throws Exception{  
  194.         SqlEntity sqlEntity = getUpdateSql(value,template);  
  195.         //System.out.println("=====update(T value,T template) sqlEntity.getSql()="+sqlEntity.getSql());  
  196.         return jdbcTemplate.update(sqlEntity.getSql(), sqlEntity.getParams().toArray());  
  197.     }  
  198.       
  199.     /** 
  200.      * 保存 
  201.      * @param t 保存的对象 
  202.      * @return int 保存的数量 
  203.      * @author lqy 
  204.      * @since 2015-10-18 
  205.      */  
  206.     @Override  
  207.     public int save(T t) throws Exception{  
  208.         SqlEntity sqlEntity = getSaveSql(t);  
  209.         return jdbcTemplate.update(sqlEntity.getSql(), sqlEntity.getParams().toArray());  
  210.     };  
  211.   
  212.     /** 
  213.      * 保存 
  214.      * @param sql 自定义保存sql 
  215.      * @param params 查询条件对应的参数(List<Object>) 
  216.      * @return int 保存的数量 
  217.      * @author lqy 
  218.      * @since 2015-10-18 
  219.      */  
  220.     @Override  
  221.     public int save(String sql, List<Object> params) {  
  222.         //String sql="INSERT INTO person (`name`,age,create_time) VALUES(?,?,?);";  
  223.         return jdbcTemplate.update(sql, params.toArray());  
  224.     }  
  225.   
  226.     /** 
  227.      * 删除 
  228.      * @param id 对象的id(Serializable) 
  229.      * @return int 删除的数量 
  230.      * @author lqy 
  231.      * @since 2015-10-18 
  232.      */  
  233.     @Override  
  234.     public int delete(Serializable id) {  
  235.         String sql="delete from " + StrUtils.changeName(this.entityClass.getSimpleName()) + " where id=?";  
  236.         return jdbcTemplate.update(sql, id);  
  237.     }  
  238.       
  239.     @SuppressWarnings("deprecation")  
  240.     @Override  
  241.     public int getCount(String whereSql, Object[] objects){  
  242.         String entityName = this.entityClass.getSimpleName();  
  243.         StringBuffer sql = new StringBuffer("select count(*) from ");  
  244.         sql.append(StrUtils.changeName(entityName));  
  245.         sql.append(" o ").append(whereSql);  
  246.         //System.out.println("getCount sql.toString()="+sql.toString());  
  247.         //return jdbcTemplate.queryForInt(sql.toString(), entityClass);  
  248.         return jdbcTemplate.queryForInt(sql.toString(), objects);  
  249.                   
  250.     }  
  251.       
  252.     protected String getSql(){  
  253.         String entityName = this.entityClass.getSimpleName();  
  254.         StringBuffer sql = new StringBuffer("select * from ");  
  255.         sql.append(StrUtils.changeName(entityName));  
  256.         sql.append(" o where 1=1 ");  
  257.         return sql.toString();  
  258.     }  
  259.       
  260.     protected String getSql(String whereSql){  
  261.         String entityName = this.entityClass.getSimpleName();  
  262.         StringBuffer sql = new StringBuffer("select * from ");  
  263.         sql.append(StrUtils.changeName(entityName));  
  264.         sql.append(" o where 1=1 ");  
  265.         if(!StrUtils.isEmpty(whereSql)){  
  266.             sql.append(" ").append(whereSql);  
  267.         }  
  268.         return sql.toString();  
  269.     }  
  270.       
  271.     /** 
  272.      * 获取sql 
  273.      * @param page 分页参数,如果为空,则不在sql增加limit ?,?  
  274.      * @param orderby 排序参数,如果为空,则不在sql增加ORDER BY 
  275.      * @param whereSql 查询条件参数,如果为空,则不在sql增加 and name=? 
  276.      * @return sql 
  277.      */  
  278.     protected String getSql(Page page, String whereSql, Map<String,String> orderby){  
  279.         String entityName = this.entityClass.getSimpleName();  
  280.         StringBuffer sql = new StringBuffer("select * from ");  
  281.         sql.append(StrUtils.changeName(entityName));  
  282.         sql.append(" o where 1=1 ");  
  283.         if(!StrUtils.isEmpty(whereSql)){  
  284.             sql.append(" ").append(whereSql);  
  285.         }  
  286.         if(!StrUtils.isEmpty(orderby)){  
  287.             sql.append(" ORDER BY ");  
  288.             for (String string : orderby.keySet()) {  
  289.                 String value = orderby.get(string);  
  290.                 if(StrUtils.isEmpty(value)){  
  291.                     value = "ASC";  
  292.                 }  
  293.                 sql.append("o.").append(string).append(" ").append(value.toUpperCase()).append(",");  
  294.             }  
  295.             if(sql.indexOf(",") > -1){  
  296.                 sql.deleteCharAt(sql.length()-1);  
  297.             }  
  298.         }  
  299.         if(!StrUtils.isEmpty(page)){  
  300.             sql.append(" limit ?,? ");  
  301.         }  
  302.         //System.out.println("------sql.toString()="+sql.toString());  
  303.         return sql.toString();  
  304.     }  
  305.       
  306.     private SqlEntity getUpdateSql(T t) throws Exception{  
  307.         SqlEntity sqlEntity = new SqlEntity();  
  308.         sqlEntity.setParams(new ArrayList<Object>());  
  309.         Field[] fields = entityClass.getDeclaredFields();  
  310.         StringBuffer sql = new StringBuffer("");  
  311.         sql.append("update ").append(StrUtils.changeName(entityClass.getSimpleName())).append(" o set ");  
  312.         for (Field field : fields) {  
  313.             StringBuffer methodName = new StringBuffer("");  
  314.             //System.out.println("===field.getType()="+field.getType());  
  315.             if(field.getType() == boolean.class){  
  316.                 if(field.getName().contains("is")){  
  317.                     methodName.append(field.getName());  
  318.                 }else{  
  319.                     methodName.append("is").append(StrUtils.firstCodeToUpperCase(field.getName()));  
  320.                 }  
  321.             }else{  
  322.                 methodName.append("get").append(StrUtils.firstCodeToUpperCase(field.getName()));  
  323.             }  
  324.             if(!"id".equals(field.getName())){  
  325.                 Method method = entityClass.getMethod(methodName.toString(), new Class[]{});  
  326.                 Object objectValue = method.invoke(t, new Object[]{});  
  327.                 if(objectValue instanceof Enum){  
  328.                     sqlEntity.getParams().add(((Enum)objectValue).ordinal());  
  329.                 }else{  
  330.                     sqlEntity.getParams().add(objectValue);  
  331.                 }  
  332.                 sql.append(" o.").append(StrUtils.changeName(field.getName())).append("= ?,");  
  333.             }  
  334.         }  
  335.         if(sql.indexOf(",") > -1){  
  336.             sql.deleteCharAt(sql.length() - 1);  
  337.         }  
  338.         sql.append(" where o.id=?");  
  339.         Method idMethod = entityClass.getMethod("getId", new Class[]{});  
  340.         sqlEntity.getParams().add(idMethod.invoke(t, new Object[]{}));  
  341.         sqlEntity.setSql(sql.toString());  
  342.         return sqlEntity;  
  343.     }  
  344.       
  345.     private SqlEntity getUpdateSql(T value, T template) throws Exception{  
  346.           
  347.         SqlEntity sqlEntity = new SqlEntity();  
  348.         sqlEntity.setParams(new ArrayList<Object>());  
  349.         Field[] fields = entityClass.getDeclaredFields();  
  350.         StringBuffer sql = new StringBuffer("");  
  351.         sql.append("update ").append(StrUtils.changeName(entityClass.getSimpleName())).append(" o set ");  
  352.         StringBuffer whereSql = new StringBuffer(" where ");  
  353.         for (Field field : fields) {  
  354.             StringBuffer methodName = new StringBuffer("");  
  355.             //System.out.println("===field.getType()="+field.getType());  
  356.             if(field.getType() == boolean.class){  
  357.                 if(field.getName().contains("is")){  
  358.                     methodName.append(field.getName());  
  359.                 }else{  
  360.                     methodName.append("is").append(StrUtils.firstCodeToUpperCase(field.getName()));  
  361.                 }  
  362.             }else{  
  363.                 methodName.append("get").append(StrUtils.firstCodeToUpperCase(field.getName()));  
  364.             }  
  365.             if(!"id".equals(field.getName())){  
  366.                 Method method = entityClass.getMethod(methodName.toString(), new Class[]{});  
  367.                 Object objectValue = method.invoke(value, new Object[]{});  
  368.                 if(!StrUtils.isEmpty(objectValue)){  
  369.                     if(objectValue instanceof Enum){  
  370.                         sqlEntity.getParams().add(((Enum)objectValue).ordinal());  
  371.                     }else{  
  372.                         sqlEntity.getParams().add(objectValue);  
  373.                     }  
  374.                     //sqlEntity.getParams().add(objectValue);  
  375.                     sql.append(" o.").append(StrUtils.changeName(field.getName())).append("= ?,");  
  376.                 }  
  377.             }  
  378.         }  
  379.           
  380.         for (Field field : fields) {  
  381.             StringBuffer methodName = new StringBuffer("");  
  382.             if(field.getType() == boolean.class){  
  383.                 if(field.getName().contains("is")){  
  384.                     methodName.append(field.getName());  
  385.                 }else{  
  386.                     methodName.append("is").append(StrUtils.firstCodeToUpperCase(field.getName()));  
  387.                 }  
  388.             }else{  
  389.                 methodName.append("get").append(StrUtils.firstCodeToUpperCase(field.getName()));  
  390.             }  
  391.             Method method = entityClass.getMethod(methodName.toString(), new Class[]{});  
  392.             Object objectValue = method.invoke(template, new Object[]{});  
  393.             if(!StrUtils.isEmpty(objectValue)){  
  394.                 sqlEntity.getParams().add(objectValue);  
  395.                 whereSql.append(" o.").append(StrUtils.changeName(field.getName())).append("= ? and");  
  396.             }  
  397.         }  
  398.         if(sql.indexOf(",") > -1){  
  399.             sql.deleteCharAt(sql.length() - 1);  
  400.         }  
  401.         if(whereSql.indexOf("and") > -1){  
  402.             sql.append(whereSql.substring(0, whereSql.length()-3));  
  403.             whereSql = new StringBuffer();  
  404.         }else{  
  405.             sql.append(whereSql);  
  406.         }  
  407.         sqlEntity.setSql(sql.toString());  
  408.         return sqlEntity;  
  409.     }  
  410.       
  411.     private SqlEntity getSaveSql(T t) throws Exception{  
  412.         SqlEntity sqlEntity = new SqlEntity();  
  413.         sqlEntity.setParams(new ArrayList<Object>());  
  414.         Field[] fields = entityClass.getDeclaredFields();  
  415.         StringBuffer sql = new StringBuffer("");  
  416.         sql.append("insert into ").append(StrUtils.changeName(entityClass.getSimpleName())).append(" ( ");  
  417.         int paramLength = 0;  
  418.         for (Field field : fields) {  
  419.             StringBuffer methodName = new StringBuffer("");  
  420.             if(field.getType() == boolean.class){  
  421.                 if(field.getName().contains("is")){  
  422.                     methodName.append(field.getName());  
  423.                 }else{  
  424.                     methodName.append("is").append(StrUtils.firstCodeToUpperCase(field.getName()));  
  425.                 }  
  426.             }else{  
  427.                 methodName.append("get").append(StrUtils.firstCodeToUpperCase(field.getName()));  
  428.             }  
  429.             Method method = entityClass.getMethod(methodName.toString(), new Class[]{});  
  430.             Object value = method.invoke(t, new Object[]{});  
  431.             if(!StrUtils.isEmpty(value)){  
  432.                 if(value instanceof Enum){  
  433.                     sqlEntity.getParams().add(((Enum) value).ordinal());  
  434.                 }else{  
  435.                     sqlEntity.getParams().add(value);  
  436.                 }  
  437.                 sql.append("`").append(StrUtils.changeName(field.getName())).append("`").append(",");  
  438.                 paramLength ++;  
  439.             }  
  440.         }  
  441.         if(sql.indexOf(",") > -1){  
  442.             sql.deleteCharAt(sql.length() - 1);  
  443.         }  
  444.         sql.append(") values(");  
  445.         for (int i=0;i<paramLength;i++) {  
  446.             sql.append("?,");  
  447.         }  
  448.         if(sql.indexOf(",") > -1){  
  449.             sql.deleteCharAt(sql.length() - 1);  
  450.         }  
  451.         sql.append(")");  
  452.         //System.out.println("sql.toString()="+sql.toString());  
  453.         sqlEntity.setSql(sql.toString());  
  454.         return sqlEntity;  
  455.     }  
  456.       
  457.     private void dealPage(Page page, String sql, List<Object> params){  
  458.         String whereSql = "";  
  459.         if(sql != null && !sql.trim().equals("")){  
  460.             int whereIndex = sql.toLowerCase().indexOf("where");  
  461.             int orderIndex = sql.toLowerCase().indexOf("order");  
  462.             int limitIndex = sql.toLowerCase().indexOf("limit");  
  463.             if(whereIndex > -1){  
  464.                 whereSql = sql.substring(whereIndex, sql.length());  
  465.                 orderIndex = whereSql.toLowerCase().indexOf("order");  
  466.             }  
  467.             if(whereIndex > -1 && orderIndex > -1){  
  468.                 whereSql = whereSql.substring(0, orderIndex - 1);  
  469.                 limitIndex = whereSql.toLowerCase().indexOf("limit");  
  470.             }  
  471.             if(whereIndex > -1 && limitIndex > -1){  
  472.                 whereSql = whereSql.substring(0, limitIndex - 1);  
  473.             }  
  474.         }  
  475.         if(page.getTotalSizeNew()){  
  476.             page.setTotalSize(getCount(whereSql, params.toArray()));  
  477.         }  
  478.         setPage(page);  
  479.     }  
  480.       
  481.     private void setPage(Page page){  
  482.         page.setTotalPages(page.getTotalSize()%page.getCurrentSize()==0?page.getTotalSize()/page.getCurrentSize():(page.getTotalSize()/page.getCurrentSize()+1));  
  483.         page.setCurrentPage(page.getOffSize()/page.getCurrentSize()+

    以上是关于SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装的主要内容,如果未能解决你的问题,请参考以下文章

    Spring JDBC

    Spring JDBC入门

    9.SpringJDBC模板类

    Spring JDBC 数据访问

    Spring JDBC 数据访问

    spring