美文网首页
使用注解和spring的JdbcTemplate进行封装实现类似

使用注解和spring的JdbcTemplate进行封装实现类似

作者: 负二贷 | 来源:发表于2019-11-16 07:53 被阅读0次

    工具类DBUtils:

    /**2014-05修改

    增加对查询语句的缓存

    增加对jdbcTemplt查询出的Map转换成Bean的方法*/privatestaticLogger log = Logger.getLogger(SQLUtils.class);

        privatestaticMap cacheMap =new HashMap();

        privatestaticMap insertSqlCache =new HashMap();

        privatestaticMap updateSqlCache =new HashMap();

        privatestaticMap deleteSqlCache =new HashMap();

        privatestaticMap selectSqlCache =new HashMap();

        /**    * 根据pojo类的class来构建select * from 的SQL语句

        * @param pojoClass

        * @return*/publicstatic String buildSelectSql(Class pojoClass){

            List fieldInfoList = loadPojoSqlInfo(pojoClass);

            String sql = buildSelectSql(pojoClass, fieldInfoList);

            if(log.isDebugEnabled()){

                log.debug("select sql is:"+sql);

            }

            return sql;

        }

        /**    * 根据pojo类的class来构建insert的SQL语句

        * @param pojoClass

        * @return*/publicstatic String buildInsertSql(Class pojoClass){

            List fieldInfoList = loadPojoSqlInfo(pojoClass);

            String sql = buildInsertSql(pojoClass, fieldInfoList);

            if(log.isDebugEnabled()){

                log.debug("insert sql is:"+sql);

            }

            return sql;

        }

        /**    * 根据pojo类的class构建根据pk来update的SQL语句

        * @param pojoObject

        * @return*/publicstatic String buildUpdateSql(Class pojoClass){

            List fieldInfoList = loadPojoSqlInfo(pojoClass);

            String sql = buildUpdateSqlByPK(pojoClass, fieldInfoList);

            if(log.isDebugEnabled()){

                log.debug("update sql is:"+sql);

            }

            return sql;

        }

        /**    * 根据pojo类的Class和更新的条件字段来生成upate的SQL语句

        * @param pojoClass

        * @param columns

        * @return    * @throws Exception

        */publicstaticString buildUpdateSqlByColumns(Class pojoClass,String[] columns)throws Exception{

            if(null!=columns && columns.length>0){

                List fieldInfoList = loadPojoSqlInfo(pojoClass);

                String sql = buildUpdateSqlByColumns(pojoClass, fieldInfoList, columns);

                if(log.isDebugEnabled()){

                    log.debug("update sql is:"+sql);

                }

                return sql;

            }else{

                if(log.isDebugEnabled()){

                    log.debug("生成update sql error! 参数columns必须有值"  );

                }

                thrownewException("参数columns必须有值!");

            }

        }

        /**    * 根据pojo类的Class生成根据pk来delete的SQL语句

        * @param pojoClass

        * @return*/publicstatic String buildDeleteSql(Class pojoClass){

            List fieldInfoList = loadPojoSqlInfo(pojoClass);

            String sql = buildDeleteSqlByPK(pojoClass,fieldInfoList);

            if(log.isDebugEnabled()){

                log.debug("delete sql is:"+sql);

            }

            return sql;

        }

        /**    * 根据pojo类的Class和更新的条件字段来生成delete的SQL语句

        * @param pojoClass

        * @param columns

        * @return    * @throws Exception

        */publicstaticString buildDeleteSqlByColumns(Class pojoClass,String[] columns)throws Exception{

            if(null!=columns && columns.length>0){

                List fieldInfoList = loadPojoSqlInfo(pojoClass);

                String sql = buildDeleteSqlByColumns(pojoClass, fieldInfoList, columns);

                if(log.isDebugEnabled()){

                    log.debug("delete sql is:"+sql);

                }

                return sql;

            }else{

                if(log.isDebugEnabled()){

                    log.debug("生成delete sql error! 参数columns必须有值"  );

                }

                thrownewException("参数columns必须有值!");

            }

        }

        /**    * 将SQL查询出来的map对象转成实体对象

        * @param map

        * @param pojoClass

        * @return    * @throws Exception

        */publicstaticObject coverMapToBean(Map map,Class pojoClass)throws Exception{

            Object result = pojoClass.newInstance();

            List list = loadPojoSqlInfo(pojoClass);

            for(FieldInfo fieldInfo : list){

                String dbName = fieldInfo.getDbFieldName().toUpperCase();

                String fieldName = fieldInfo.getPojoFieldName();

                String setMethoName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);

                if(map.get(dbName)!=null){

                    Method m = pojoClass.getMethod(setMethoName, fieldInfo.getType());

                    m.invoke(result, map.get(dbName));

                }

            }

            return result;

        }

        /**    * 加载读取pojo的注解信息

        * @param pojoClass

        * @return*/    @SuppressWarnings("unchecked")

        privatestaticList loadPojoSqlInfo(Class pojoClass){

            List resultList =null;

            if(null== cacheMap.get(pojoClass.getName())){

                resultList =newArrayList();

                Field[] fields = pojoClass.getDeclaredFields();

                for(Field field : fields){

                    FieldInfo fieldInfo =new FieldInfo();

                    fieldInfo.setPojoFieldName(field.getName());

                    if(field.isAnnotationPresent(com.test.anno.Field.class)){

                        String value = ((com.test.anno.Field)field.getAnnotation(com.test.anno.Field.class)).value();//得到配置的数据库字段名if(StringUtils.isEmpty(value)){//没有设置数据库的字段名,则取pojo的字段名                        fieldInfo.setDbFieldName(lowerStrToUnderline(field.getName()));

                        }else{

                            fieldInfo.setDbFieldName(value);

                        }

                    }else{

                        fieldInfo.setDbFieldName(lowerStrToUnderline(field.getName()));

                    }

                    if(field.isAnnotationPresent(com.test.anno.PK.class)){

                        fieldInfo.setIsPk(true);

                    }

                    if(field.isAnnotationPresent(com.test.anno.NoInsert.class)){

                        fieldInfo.setIsInsert(false);

                    }

                    if(field.isAnnotationPresent(com.test.anno.NoUpdate.class)){

                        fieldInfo.setIsUpdate(false);

                    }

                    fieldInfo.setType(field.getType());

                    resultList.add(fieldInfo);

                }

                cacheMap.put(pojoClass.getName(), resultList);

            }else{

                resultList = (List)cacheMap.get(pojoClass.getName());

            }

            return resultList;

        }

        /**    * 评价select语句

        * @param pojoClass

        * @param fieldInfoList

        * @return*/privatestaticString buildSelectSql(Class pojoClass,List fieldInfoList){

            if(selectSqlCache.get(pojoClass.getName()) !=null){

                return (String)selectSqlCache.get(pojoClass.getName());

            }

            return"select * from " + loadTableName(pojoClass);

        }

        /**    * 拼接insert的SQL

        * @param pojoClass

        * @param fieldInfoList

        * @return*/    @SuppressWarnings("unchecked")

        privatestaticString buildInsertSql(Class pojoClass,List fieldInfoList){

            String result =null;

            if(insertSqlCache.get(pojoClass.getName()) !=null){

                result = (String)insertSqlCache.get(pojoClass.getName());

                return result;

            }

            String tableName = loadTableName(pojoClass);

            StringBuffer temp1 =new StringBuffer();

            StringBuffer temp2 =new StringBuffer();

            for(FieldInfo fieldInfo : fieldInfoList){

                if(fieldInfo.getIsInsert()){

                    temp1.append(fieldInfo.getDbFieldName()).append(",");

                    temp2.append(":").append(fieldInfo.getPojoFieldName()).append(",");

                }

            }

            temp1.deleteCharAt(temp1.length()-1);

            temp2.deleteCharAt(temp2.length()-1);

            StringBuffer resultSql =new StringBuffer();

            resultSql.append("insert into ");

            resultSql.append(tableName);

            resultSql.append("(");

            resultSql.append(temp1);

            resultSql.append(") values (");

            resultSql.append(temp2);

            resultSql.append(")");

            result = resultSql.toString();

            insertSqlCache.put(pojoClass.getName(), result);

            return result;

        }

        /**    * 生成根据主键生成删除的SQL

        * @param pojoClass

        * @param fieldInfoList

        * @return*/    @SuppressWarnings("unchecked")

        privatestaticString buildDeleteSqlByPK(Class pojoClass,List fieldInfoList){

            String result =null;

            if(deleteSqlCache.get(pojoClass.getName()+"_pk") !=null){

                result = (String)deleteSqlCache.get(pojoClass.getName());

                return result;

            }

            StringBuffer resultSql =new StringBuffer();

            resultSql.append(appendBaseDeleteSQL(pojoClass));

            for(FieldInfo fieldInfo : fieldInfoList){

                if(fieldInfo.getIsPk()){

                    resultSql.append(fieldInfo.getDbFieldName());

                    resultSql.append("=:").append(fieldInfo.getPojoFieldName()).append(" and ");

                }

            }

            resultSql.delete(resultSql.length()-4, resultSql.length());

            result = resultSql.toString();

            deleteSqlCache.put(pojoClass.getName()+"_pk", result);

            return result;

        }

        /**    * 拼接根据主键来update的SQL

        * @param pojoClass

        * @param fieldInfoList

        * @return*/    @SuppressWarnings("unchecked")

        privatestaticString buildUpdateSqlByPK(Class pojoClass, List fieldInfoList){

            String result =null;

            if(updateSqlCache.get(pojoClass.getName()+"_pk") !=null){

                result = (String)updateSqlCache.get(pojoClass.getName()+"_pk");

                return result;

            }

            StringBuffer resultSql =new StringBuffer();

            resultSql.append(appendBaseUpdateSQL(pojoClass, fieldInfoList));

            for(FieldInfo fieldInfo : fieldInfoList){

                if(fieldInfo.getIsPk()){

                    resultSql.append(fieldInfo.getDbFieldName());

                    resultSql.append("=:").append(fieldInfo.getPojoFieldName()).append(" and ");

                }

            }

            resultSql.delete(resultSql.length()-4, resultSql.length());

            result = resultSql.toString();

            updateSqlCache.put(pojoClass.getName()+"_pk", result);

            return result;

        }

        /**    * 根据用户指定的更新条件(字段)来生成update的SQL

        * @param pojoClass

        * @param fieldInfoList

        * @param columns

        * @return*/privatestaticString buildUpdateSqlByColumns(Class pojoClass, List fieldInfoList,String[] columns){

            StringBuffer resultSql =new StringBuffer();

            if(updateSqlCache.get(pojoClass.getName()+"_columns") !=null){

                resultSql.append((String)updateSqlCache.get(pojoClass.getName()+"_columns"));

            }else{

                resultSql.append(appendBaseUpdateSQL(pojoClass, fieldInfoList));

            }

            for(String column : columns){

                for(FieldInfo fieldInfo : fieldInfoList){

                    if(column.equals(fieldInfo.getPojoFieldName())){

                        resultSql.append(fieldInfo.getDbFieldName());

                        resultSql.append("=:").append(column).append(" and ");

                        break;

                    }

                }

            }

            resultSql.delete(resultSql.length()-4, resultSql.length());

            return resultSql.toString();

        }

        /**    * 拼接update语句的where之前的sql

        * @param pojoClass

        * @param fieldInfoList

        * @param resultSql

        */    @SuppressWarnings("unchecked")

        privatestaticString appendBaseUpdateSQL(Class pojoClass, List fieldInfoList){

            String result =null;

            if(updateSqlCache.get(pojoClass.getName()+"_columns") !=null){

                result = (String)updateSqlCache.get(pojoClass.getName()+"_columns");

            }else{

                StringBuffer resultSql =new StringBuffer();

                String tableName = loadTableName(pojoClass);

                resultSql.append("update ").append(tableName).append(" set ");

                for(FieldInfo fieldInfo : fieldInfoList){

                    if(fieldInfo.getIsUpdate() && !fieldInfo.getIsPk()){

                        resultSql.append(fieldInfo.getDbFieldName());

                        resultSql.append("=:").append(fieldInfo.getPojoFieldName()).append(",");

                    }

                }

                resultSql.deleteCharAt(resultSql.length()-1);

                resultSql.append(" where ");

                result = resultSql.toString();

                updateSqlCache.put(pojoClass.getName()+"_columns", result);

            }

            return result;

        }

        /**    * 根据用户指定的更新条件(字段)来生成delete的SQL

        * @param pojoClass

        * @param fieldInfoList

        * @param columns

        * @return*/privatestaticString buildDeleteSqlByColumns(Class pojoClass, List fieldInfoList,String[] columns){

            StringBuffer resultSql =new StringBuffer();

            if(deleteSqlCache.get(pojoClass.getName()+"_columns") !=null){

                resultSql.append((String)deleteSqlCache.get(pojoClass.getName()+"_columns"));

            }else{

                resultSql.append(appendBaseUpdateSQL(pojoClass, fieldInfoList));

            }

            for(String column : columns){

                for(FieldInfo fieldInfo : fieldInfoList){

                    if(column.equals(fieldInfo.getPojoFieldName())){

                        resultSql.append(fieldInfo.getDbFieldName());

                        resultSql.append("=:").append(column).append(" and ");

                        break;

                    }

                }

            }

            resultSql.delete(resultSql.length()-4, resultSql.length());

            return resultSql.toString();

        }

        /**    * 拼接delete语句的where之前的sql

        * @param pojoClass

        * @param fieldInfoList

        * @param resultSql

        */    @SuppressWarnings("unchecked")

        privatestatic String appendBaseDeleteSQL(Class pojoClass){

            if(deleteSqlCache.get(pojoClass.getName()+"_columns") !=null){

                return(String)deleteSqlCache.get(pojoClass.getName()+"_columns");

            }else{

                String result = "delete from " + loadTableName(pojoClass) + " where ";

                deleteSqlCache.put(pojoClass.getName()+"_columns", result);

                return result;

            }

        }

        /**    * 通过类获取表名

        * @param pojoClass

        * @return*/    @SuppressWarnings("unchecked")

        privatestatic String loadTableName(Class pojoClass){

            if(pojoClass.isAnnotationPresent(Table.class)){

                Table table = (Table)pojoClass.getAnnotation(Table.class);

                return table.value();

            }else{

                return lowerStrToUnderline(pojoClass.getSimpleName());

            }

        }

        /**    * 将大写字母转换成下划线加小写字母

        * 例:userName--> user_name

        * @param str

        * @return*/privatestatic String lowerStrToUnderline(String str) {

            if(StringUtils.isEmpty(str)){

                return"";

            }

            StringBuilder sb =new StringBuilder(str);

            char c;

            intcount = 0;

            for(inti = 0; i < str.length(); i++) {

                c = str.charAt(i);

                if(c >= 'A' && c <= 'Z') {

                    sb.replace(i+count, i+count+1, (c+"").toLowerCase());

                    sb.insert(i+count, "_");

                    count++;

                }

            }

            return sb.toString();

        }

    注解类:

    import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;

    @Retention(RetentionPolicy.RUNTIME)

    @Target(ElementType.FIELD)public@interface Field {

        //数据库字段名publicString value()default"";

    }

    import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;

    @Retention(RetentionPolicy.RUNTIME)

    @Target(ElementType.FIELD)public@interface NoInsert {

    }

    import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;

    @Retention(RetentionPolicy.RUNTIME)

    @Target(ElementType.FIELD)public@interface NoUpdate {

    }

    import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;

    @Retention(RetentionPolicy.RUNTIME)

    @Target(ElementType.FIELD)public@interface PK {

    }

    import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;

    @Retention(RetentionPolicy.RUNTIME)

    @Target(ElementType.TYPE)public@interface Table {

        public String value();

    }

    用来保存pojo类的字段信息的类:

    publicclass FieldInfo {

        //java字段名private String pojoFieldName;

        //数据库字段名private String dbFieldName;

        //是否是主键privatebooleanisPk =false;

        //update时是否需要更新privatebooleanisUpdate =true;

        //insert时是否需要插入privatebooleanisInsert =true;

        publicboolean isPk() {

            return isPk;

        }

        publicvoidsetIsPk(boolean isPk) {

            this.isPk = isPk;

        }

        publicboolean isUpdate() {

            return isUpdate;

        }

        publicvoidsetIsUpdate(boolean isUpdate) {

            this.isUpdate = isUpdate;

        }

        public String getPojoFieldName() {

            return pojoFieldName;

        }

        publicvoid setPojoFieldName(String pojoFieldName) {

            this.pojoFieldName = pojoFieldName;

        }

        public String getDbFieldName() {

            return dbFieldName;

        }

        publicvoid setDbFieldName(String dbFieldName) {

            this.dbFieldName = dbFieldName;

        }

        publicboolean isInsert() {

            return isInsert;

        }

        publicvoidsetIsInsert(boolean isInsert) {

            this.isInsert = isInsert;

        }

    }

    pojo类:

    @Table("t_log")publicclass WorkLog {

        //id    @PK

        @Field("id")

        private String logId ; 

        //日志日期    @NoUpdate

        privateDate logDate;//log_date

        //所属项目private String projectId;

        //工作类型private String    jobTypeId; 

        //日志内容private String    content;   

        //工作时长privatedouble    workTime;   

        //填写时间private Timestamp fillTime;   

        //日志填写人    @NoUpdate

        private String employeeId;   

        //状态    @NoUpdate

        private String archivingState;

      //.....get set method}

    分装一个基础的操作的BaseDao类(这里只封装了几个常用的CRUD操作,具体运用可以再增加):

    @Resource

        private JdbcTemplate jdbcTemplate;

        @Resource

        private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

        /**    * 保存新增的实体对象

        * @param bean

        * @return*/publicboolean baseSave(Object bean){

            String sql = SQLUtils.buildInsertSql(bean.getClass());

            SqlParameterSource sps =new BeanPropertySqlParameterSource(bean);

            returnthis.namedParameterJdbcTemplate.update(sql, sps)>0?true:false;

        }

        /**    * 根据主键保存修改的实体对象

        * @param bean

        * @return*/publicboolean baseSaveUpdate(Object bean){

            String sql = SQLUtils.buildUpdateSql(bean.getClass());

            SqlParameterSource sps =new BeanPropertySqlParameterSource(bean);

            returnthis.namedParameterJdbcTemplate.update(sql, sps)>0?true:false;

        }

        /**    * 根据bean的部分字段的条件来更新bean的信息

        * @param bean

        * @param fileds

        * @return    * @throws Exception

        */publicbooleanbaseSaveUpdateWithColumn(Object bean,String[] fileds)throws Exception{

            String sql = SQLUtils.buildUpdateSqlByColumns(bean.getClass(), fileds);

            SqlParameterSource sps =new BeanPropertySqlParameterSource(bean);

            returnthis.namedParameterJdbcTemplate.update(sql, sps)>0?true:false;

        }

        /**    * 根据bean的pk来删除bean

        * @param bean

        * @return*/publicboolean baseDelete(Object bean){

            String sql = SQLUtils.buildDeleteSql(bean.getClass());

            SqlParameterSource sps =new BeanPropertySqlParameterSource(bean);

            returnthis.namedParameterJdbcTemplate.update(sql, sps)>0?true:false;

        }

        /**    * 根据bean的部分字段的条件来删除bean

        * @param bean

        * @param fileds

        * @return    * @throws Exception

        */publicbooleanbaseDeleteWithColumn(Object bean,String[] fileds)throws Exception{

            String sql = SQLUtils.buildDeleteSqlByColumns(bean.getClass(), fileds);

            SqlParameterSource sps =new BeanPropertySqlParameterSource(bean);

            returnthis.namedParameterJdbcTemplate.update(sql, sps)>0?true:false;

        }

        /**    * 自动分页/不分页查询返回list

        * @param cs

        * @param conditionDef

        * @param paramMap

        * @return*/public List baseQueryForList(Class cs, ConditionDef conditionDef, Map paramMap){

            Condition condition=new Condition(conditionDef,paramMap);

            String sql = SQLUtils.buildSelectSql(cs) + condition.getConditionClauseWithWhere();

            if(PagingUtils.isPagingSearchRequest(paramMap)) {

                return PagingUtils.pagingQuery(namedParameterJdbcTemplate, sql, paramMap);

            }else {

                return namedParameterJdbcTemplate.queryForList(sql, paramMap);

            }

        }

        /**    * 查询满足条件的单条记录的实体对象,如果超过1条则抛出异常,没查询到则返回null

        * @param cs

        * @param conditionDef

        * @param paramMap

        * @return    * @throws Exception

        */publicObject baseQueryForEntity(Class cs, ConditionDef conditionDef, Map paramMap)throws Exception{

            Condition condition=new Condition(conditionDef,paramMap);

            String sql = SQLUtils.buildSelectSql(cs) + condition.getConditionClauseWithWhere();

            List list =this.namedParameterJdbcTemplate.queryForList(sql, paramMap);

            if(null==list || list.size()==0 || list.size()>1){

                returnnull;

            }elseif(list.size()>1){

                thrownewException("query return record more then one!!");

            }else{

                Map map = (Map)list.get(0);

                return SQLUtils.coverMapToBean(map, cs);

            }

        }

        public JdbcTemplate getJdbcTemplate() {

            return jdbcTemplate;

        }

        public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {

            return namedParameterJdbcTemplate;

        }

     对查询参数进行封装的类:

    ConditionDef.java

    publicclass ConditionDef {

        privateMap paraNameAndSubConditionClauseMap =new LinkedHashMap();

        privateMap paraNameAndClassTypeMap =new HashMap();

        privateMap> paraNameAndLikeMatchInfoMap =new HashMap();

        public ConditionDef(Object[][] defineArr) {

            for (Object[] subDefine : defineArr) {

                Pattern pattern = Pattern.compile(":([\\w\\d_]+)");

                String currDefClause = (String) subDefine[0];

                intcurrDefClauseLen = currDefClause.length();

                Matcher matcher = pattern.matcher(currDefClause);

                //System.out.println(currDefClause);Set varNameSet =new HashSet();

                intvarNameCount = 0;

                charclauseMode = Condition.STANDARD_MODE;

                String oneVarName =null;

                booleanisUsedSameMatchMode=true;

                List matchModeList=new ArrayList();

                while (matcher.find()) {

                    String varName = matcher.group(1);

                    oneVarName = varName;

                    intstart = matcher.start();

                    intend = matcher.end();

                    charprefix = currDefClause.charAt(start - 1);

                    charsuffix = end >= currDefClauseLen ? ' ' : currDefClause.charAt(end);

                    charsubConditionMatchMode = Condition.STANDARD_MODE;

                    if(prefix == '%' && suffix == '%') {

                        clauseMode = subConditionMatchMode = Condition.GLOBAL_MATCH;

                        matchModeList.add(clauseMode);

                    } elseif(prefix == '%') {

                        clauseMode = subConditionMatchMode = Condition.PREFIX_MATCH;

                        matchModeList.add(clauseMode);

                    } elseif(suffix == '%') {

                        clauseMode = subConditionMatchMode = Condition.SUFFIX_MATCH;

                        matchModeList.add(clauseMode);

                    }

                    varNameSet.add(varName);

                    varNameCount++;

                    if(varNameCount>1&&matchModeList.size()>=2) {

                        intsize=matchModeList.size();

                        if(!matchModeList.get(size-1).equals(matchModeList.get(size-2))) {

                            isUsedSameMatchMode=false;

                        }

                    }

                }

                if(varNameSet.size() != 1) {

                    thrownewRuntimeException("One sub condition clause must only have one var name ! clause :"                        + currDefClause);

                }

                if(oneVarName ==null) {

                    thrownewRuntimeException("Sub condition is not have any var name ! clause :" + currDefClause);

                }

                if(subDefine.length > 1) {

                    paraNameAndClassTypeMap.put(oneVarName, (Class) subDefine[1]);

                    //System.out.println("save var type : " + oneVarName + "," + ((Class) subDefine[1]).getSimpleName());            }

                if(clauseMode != Condition.STANDARD_MODE) {

                    if(isUsedSameMatchMode&&varNameCount==matchModeList.size()) {

                        paraNameAndLikeMatchInfoMap.put(oneVarName, matchModeList.subList(0,1));

                    } else {

                        currDefClause=currDefClause.replaceAll("%:"+oneVarName+"%", ":"+oneVarName+"_globalMatch");

                        currDefClause=currDefClause.replaceAll("%:"+oneVarName, ":"+oneVarName+"_suffixMatch");

                        currDefClause=currDefClause.replaceAll(":"+oneVarName+"%", ":"+oneVarName+"_prefixMatch");

                        paraNameAndLikeMatchInfoMap.put(oneVarName, matchModeList);

                    }

                    currDefClause = currDefClause.replaceAll("'\\%", "");

                    currDefClause = currDefClause.replaceAll("\\%'", "");

                    currDefClause = currDefClause.replaceAll("\\%", "");

                    currDefClause = currDefClause.replaceAll("'", "");

                    //System.out.println("processed clause : " + currDefClause);            }

                String tempClause=currDefClause.toUpperCase();

                if(tempClause.indexOf("AND")!=-1||tempClause.indexOf("OR")!=-1) {

                    currDefClause="("+currDefClause+")";

                }

                paraNameAndSubConditionClauseMap.put(oneVarName, currDefClause);

            }

        }

        public String[] getConditionVarNames() {

            // TODO Auto-generated method stubreturnparaNameAndSubConditionClauseMap.keySet().toArray(new String[paraNameAndSubConditionClauseMap.keySet().size()]);

        }

        public String getSubConditionClause(String varName) {

            // TODO Auto-generated method stubreturn paraNameAndSubConditionClauseMap.get(varName);

        }

        publicboolean isExistClassTypeInfo(String varName) {

            // TODO Auto-generated method stubreturn paraNameAndClassTypeMap.containsKey(varName);

        }

        public Class getClassTypeInfo(String varName) {

            // TODO Auto-generated method stubreturn paraNameAndClassTypeMap.get(varName);

        }

        publicboolean isExistMatchModeInfo(String varName) {

            // TODO Auto-generated method stubreturn paraNameAndLikeMatchInfoMap.containsKey(varName);

        }

        publicList getMatchModeInfo(String varName) {

            // TODO Auto-generated method stubreturn paraNameAndLikeMatchInfoMap.get(varName);

        }

    }

    Condition.java

    publicclass Condition {

        publicstaticfinalString AND = " AND ";

        publicstaticfinalString OR = " OR ";

        publicstaticfinalcharPREFIX_MATCH = 'P';

        publicstaticfinalcharSUFFIX_MATCH = 'S';

        publicstaticfinalcharGLOBAL_MATCH = 'G';

        publicstaticfinalcharLIKE_MODE = 'L';

        publicstaticfinalcharSTANDARD_MODE = 0;

        List varTypesList =new ArrayList();

        privateString conditionClauseStr = "";

        privateString relateOperate = AND;

        public Condition(ConditionDef def, Map valueMap) {

            this(def, valueMap, AND);

        }

        public Condition(ConditionDef def, Map valueMap, String relateOperate) {

            this.relateOperate = relateOperate;

            String[] varNameArr = def.getConditionVarNames();

            List usedSubConditionClauseList =new ArrayList();

            for (String varName : varNameArr) {

                if(!StringUtils.isEmpty(valueMap.get(varName))) {

                    usedSubConditionClauseList.add(def.getSubConditionClause(varName));

                    Object priValue =  valueMap.get(varName);

                    if (def.isExistClassTypeInfo(varName)) {

                        Class targetClass = def.getClassTypeInfo(varName);

                        Object newValue =null;

                        if(targetClass == java.sql.Date.class) {

                            newValue = java.sql.Date.valueOf((String)priValue);

                            valueMap.put(varName, newValue);

                        } elseif(targetClass == java.sql.Timestamp.class) {

                            newValue = java.sql.Timestamp.valueOf((String)priValue);

                            valueMap.put(varName, newValue);

                        } elseif(targetClass == java.sql.Time.class) {

                            newValue = java.sql.Time.valueOf((String)priValue);

                            valueMap.put(varName, newValue);

                        } elseif(targetClass == java.util.List.class) {

                            List valueList=new ArrayList();

                            if (priValue.getClass().isArray()){

                                String[] valueArr=(String[])priValue;

                                for (String string : valueArr) {

                                    valueList.add(string);

                                }

                            }else{

                                valueList.add(priValue);

                            }

                            valueMap.put(varName, valueList);

                        }

                    }

                    if (def.isExistMatchModeInfo(varName)) {

                        List matchModeList = def.getMatchModeInfo(varName);

                        if(matchModeList.size() == 1) {

                            if(matchModeList.get(0) == Condition.GLOBAL_MATCH) {

                                priValue = "%" + priValue + "%";

                            } elseif(matchModeList.get(0) == Condition.PREFIX_MATCH) {

                                priValue = priValue + "%";

                            } elseif(matchModeList.get(0) == Condition.SUFFIX_MATCH) {

                                priValue = "%" + priValue;

                            }

                            valueMap.put(varName , priValue);

                        } else {

                            for(char currMatchMode : matchModeList) {

                                if(currMatchMode == Condition.GLOBAL_MATCH) {

                                    String newValue = "%" + priValue + "%";

                                    valueMap.put(varName + "_globalMatch", newValue);

                                } elseif(currMatchMode == Condition.PREFIX_MATCH) {

                                    String newValue = priValue + "%";

                                    valueMap.put(varName + "_prefixMatch", newValue);

                                } elseif(currMatchMode == Condition.SUFFIX_MATCH) {

                                    String newValue = "%" + priValue;

                                    valueMap.put(varName + "_suffixMatch", newValue);

                                }

                            }

                        }

                    }

                }

            }

            this.conditionClauseStr = StringUtils.join(usedSubConditionClauseList, relateOperate);

        }

        public String getConditionClause() {

            returnthis.conditionClauseStr;

        }

        public String getConditionClauseWithWhere() {

            return"".equals(conditionClauseStr)?"":" WHERE " + conditionClauseStr;

        }

        public String getConditionClauseWithStartRelateOperatorIfNeeded() {

            if(conditionClauseStr.trim().equals("")) {

                return"";

            }else {

                returnthis.relateOperate + " " + conditionClauseStr;

            }

        }

        public String getConditionClauseWithRelateOperatorAtStart() {

            returnthis.relateOperate + " " + conditionClauseStr;

        }

        public Integer[] getConditionVarTypes() {

            returnvarTypesList.toArray(new Integer[]{});

        }

    }

    调用Dao:

    publicclassTestDaoextends BaseDao{

        privateConditionDef conditionDef=new ConditionDef(

            new Object[][] {

                {"DEPTNO = :deptno"},

                {"MGRNO = :mgrno"}

            }

        );

        public List query(Map paramMap){

            returnthis.baseQueryForList(Department.class, conditionDef, paramMap);

        }

        publicvoid save(){

            Department dep =new Department();

            dep.setDeptno("S22");

            dep.setDeptname("my depart");

            dep.setMgrno("000060");

            dep.setAdmrdept("E01");

            dep.setLocation("haha");

            this.baseSave(dep);

        }

        publicvoidupdate()throws Exception{

            Map paramMap =new HashMap();

            paramMap.put("deptno", "S22");

            Object o =this.baseQueryForEntity(Department.class, conditionDef, paramMap);

            Department dept =null;

            if(o!=null){

                dept = (Department)o;

                dept.setLocation("update");

                this.baseSaveUpdate(dept);

            }

        }

        publicvoid delete(){

            Department dept =new Department();

            dept.setDeptno("S22");

            this.baseDelete(dept);

        }

    }

    相关文章

      网友评论

          本文标题:使用注解和spring的JdbcTemplate进行封装实现类似

          本文链接:https://www.haomeiwen.com/subject/ngsunftx.html