基于spring创建通用的Mybatis类
2015-06-29 21:56
387 查看
基于spring创建通用的Mybatis类
一、环境
1. 开发环境:windows7,jdk1.8, mysql5.5,maven3
2. 使用工具:eclipse(Luna Service Release 1 (4.4.1))
二、简单说明
使用mybatis的拦截器进行通用类设计。同时使用注解方法进行sql脚本的生成,可用于项目中,虽然与不使用拦截器,使用XML进行SQL脚本生成在性能上有一定的差异(第一次执行时性能差异很大),但不大,而且简化开发。
三、源代码
1. 表生成SQL脚本
2. Pom.xml
3. 注解 (Id, Virtual)
4. DO
5. DAO(baseDao,UserInfoDao)
6. 拦截器
7. 其它工具类
8. 测试
9. 配置(jdbc.properties,log4j.properties,mybatis-config.xml,spring.xml)
一、环境
1. 开发环境:windows7,jdk1.8, mysql5.5,maven3
2. 使用工具:eclipse(Luna Service Release 1 (4.4.1))
二、简单说明
使用mybatis的拦截器进行通用类设计。同时使用注解方法进行sql脚本的生成,可用于项目中,虽然与不使用拦截器,使用XML进行SQL脚本生成在性能上有一定的差异(第一次执行时性能差异很大),但不大,而且简化开发。
三、源代码
1. 表生成SQL脚本
CREATE TABLE `user_info` ( `user_id` bigint(14) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `user_name` varchar(30) NOT NULL COMMENT '用户姓名', `pass_word` varchar(32) NOT NULL COMMENT '用户密码', `account` varchar(30) NOT NULL COMMENT '用户账号', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COMMENT='用户基础信息表' |
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>common</groupId> <artifactId>common-mybatis</artifactId> <version>0.0.1-SNAPSHOT</version> <name>common-mybatis</name> <description>创建通用的dao</description> <properties> <commons.lang.version>2.6</commons.lang.version> <spring.version>3.1.4.RELEASE</spring.version> <slf4j.version>1.6.1</slf4j.version> <mybatis.version>3.2.8</mybatis.version> <mybatis-spring.version>1.2.2</mybatis-spring.version> <c3p0.version>0.9.1.2</c3p0.version> <mysql-connector-java.version>5.1.10</mysql-connector-java.version> <junit.version>4.12</junit.version> </properties> <dependencies> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>${commons.lang.version}</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>${c3p0.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.5</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector-java.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> </dependencies> </project> |
package com.common.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 用于DTO,标明此DTO属性对应为主键 * @author szy * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Id { } |
package com.common.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 用于DTO,当此DTO上的属性不需要DML时使用 * @author szy * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Virtual { } |
package com.common.mybatis.model; import java.io.Serializable; import com.common.annotation.Id; publicclass UserInfoimplements Serializable { privatestaticfinallongserialVersionUID = 3307279233947614156L; @Id private LonguserId; private StringuserName; private StringpassWord; private Stringaccount; public Long getUserId() { returnuserId; } publicvoid setUserId(LonguserId) { this.userId =userId; } public String getUserName() { returnuserName; } publicvoid setUserName(StringuserName) { this.userName =userName; } public String getPassWord() { returnpassWord; } publicvoid setPassWord(StringpassWord) { this.passWord =passWord; } public String getAccount() { returnaccount; } publicvoid setAccount(Stringaccount) { this.account =account; } } |
package com.common.mybatis.dao; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.DeleteProvider; import org.apache.ibatis.annotations.InsertProvider; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.SelectProvider; import org.apache.ibatis.annotations.UpdateProvider; import com.common.utils.MyBatisTemplate; /** * 继承此类注意:泛型为Serializable接口实现Bean,bean中使用@Id声明主键(不支持联合主键,只有一个属性是主键),使用@NotColumn声明不持久化的属性 * 子类class上使用@RegisterDto注册要持久化的Bean * 继承的子类不得覆盖此类方法 * @author szy * * @param <T> */ public interface BaseDao<T> { /** * 插入数据 * @param obj */ @InsertProvider(type = MyBatisTemplate.class,method = "insert") @Options(useGeneratedKeys = true) void insert(T obj); /** * 根据主键更新数据中不为空的属 * @param obj * @return */ @UpdateProvider(type=MyBatisTemplate.class,method="updateNotNullById") int updateNotNullById(T obj); /** * 根据主键更新数据的全部属 * @param obj * @return */ @UpdateProvider(type=MyBatisTemplate.class,method="updateById") int updateById(T obj); /** * 根据主键删除数据 * @param id * @return */ @DeleteProvider(type=MyBatisTemplate.class,method="deleteById") int deleteById(Number id); /** * 根据对象中不为空的条件删除数据 * @param id * @return */ @DeleteProvider(type=MyBatisTemplate.class,method="deleteByObject") int deleteByObject(T obj); /** * 根据参数中不为空的条件删除数据,key对应dto中的属性 * @param id * @return */ @DeleteProvider(type=MyBatisTemplate.class,method="deleteByParamNotEmpty") int deleteByParamNotEmpty(Map<String,Object> param); /** * 根据参数中条件删除数据,key对应dto中的属性 * @param id * @return */ @DeleteProvider(type=MyBatisTemplate.class,method="deleteByParam") int deleteByParam(Map<String,Object> param); /** * 根据主键查询数据 * @param id * @return */ @SelectProvider(type=MyBatisTemplate.class,method="queryById") T queryById(Number id); /** * 根据对象中不为空的属性查询列表 * @param id * @return */ @SelectProvider(type=MyBatisTemplate.class,method="queryByObject") List<T> queryByObject(T obj); /** * 根据参数中不为空的属性查询列表,key对应dto中的属性 * @param id * @return */ @SelectProvider(type=MyBatisTemplate.class,method="queryByParamNotEmpty") List<T> queryByParamNotEmpty(Map<String,Object> params); /** * 根据参数查询列表,key对应dto中的属性 * @param id * @return */ @SelectProvider(type=MyBatisTemplate.class,method="queryByParam") List<T> queryByParam(Map<String,Object> params); /** * 根据对象中不为空的属性查询总数 * @param id * @return */ @SelectProvider(type=MyBatisTemplate.class,method="queryByObjectCount") Integer queryByObjectCount(T obj); /** * 根据参数中不为空的属性查询总数,key对应dto中的属性 * @param id * @return */ @SelectProvider(type=MyBatisTemplate.class,method="queryByParamNotEmptyCount") Integer queryByParamNotEmptyCount(Map<String,Object> params); /** * 根据参数查询总数,key对应dto中的属性 * @param id * @return */ @SelectProvider(type=MyBatisTemplate.class,method="queryByParamCount") Integer queryByParamCount(Map<String,Object> params); /** * 根据参数中不为空的属性查询总数,key对应dto中的属性 * @param id * @return */ @SelectProvider(type=MyBatisTemplate.class,method="queryPageByParamNotEmpty") List<T> queryPageByParamNotEmpty(Map<String,Object> params); /** * 根据参数查询总数,key对应dto中的属性 * @param id * @return */ @SelectProvider(type=MyBatisTemplate.class,method="queryPageByParam") List<T> queryPageByParam(Map<String,Object> params); } |
package com.common.mybatis.dao; import com.common.mybatis.model.UserInfo; publicinterface UserInfoDaoextends BaseDao<UserInfo>{ } |
package com.common.utils; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ResultMap; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Plugin; import org.apache.ibatis.plugin.Signature; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import com.common.mybatis.dao.BaseDao; @Intercepts({ @Signature( type = Executor.class, method = "update", args = { MappedStatement.class,Object.class }), @Signature( type = Executor.class, method = "query", args = { MappedStatement.class,Object.class, RowBounds.class, ResultHandler.class}) }) public class BaseDaoInterceptor implements Interceptor { private static final Log LOGGER = LogFactory.getLog(BaseDaoInterceptor.class); private static final Method[] methods = BaseDao.class.getMethods(); public Object intercept(Invocation invocation) throws Throwable { MappedStatement statement = (MappedStatement) invocation.getArgs()[0]; Object parameter = (Object) invocation.getArgs()[1]; String sqlId = statement.getId(); String methodId = sqlId.substring(sqlId.lastIndexOf(".")+1, sqlId.length()); DtoUtil.MapperWrap mapperWrap = setSqlMapper(sqlId,statement,parameter); setDataSource(statement,parameter); Class<?> currentClass = mapperWrap.getDaoClass(); Class<?> resultType = mapperWrap.getResultType(); if (!isBaseMethod(currentClass, methodId)) { return invocation.proceed(); } setPrimaryKey(statement,mapperWrap); setPrimaryValue(parameter, invocation, resultType, methodId); setResultClass(statement, resultType, methodId); setClass(parameter, resultType); return invocation.proceed(); } public Object plugin(Object target) { if (target instanceof Executor) { return Plugin.wrap(target, this); } else { return target; } } public void setProperties(Properties properties) { } private void setPrimaryKey(final MappedStatement statement,final DtoUtil.MapperWrap mapperWrap){ String[] keys = statement.getKeyProperties(); String[] keyColumns = statement.getKeyColumns(); keys[0]=mapperWrap.getIdParams(); if(StringUtils.isNotBlank(mapperWrap.getIdColumn())){ keyColumns = new String[]{mapperWrap.getIdColumn()}; } } private void setPrimaryValue(Object parameter, Invocation invocation, Class<?> paramClass, String methodId) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException { if ("queryById".equals(methodId) || "deleteById".equals(methodId)) { Object param = paramClass.newInstance(); Field field = paramClass.getDeclaredField("id"); field.setAccessible(true); if (field.getType().getSimpleName().equals(Long.class.getSimpleName())) { if (parameter instanceof Integer) { field.set(param, ((Integer) parameter).longValue()); } else { field.set(param, parameter); } } else { if (parameter instanceof Long) { field.set(param, ((Long) parameter).intValue()); } else { field.set(param, parameter); } } invocation.getArgs()[1] = param; parameter = param; } } private void setResultClass(MappedStatement statement, Class<?> currentClass, String methodId) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ if (methodId.startsWith("query") && !methodId.endsWith("Count")) { List<ResultMap> resultMaps = statement.getResultMaps(); ResultMap resultMap = resultMaps.get(0); Field rf = resultMap.getClass().getDeclaredField("type"); rf.setAccessible(Boolean.TRUE); rf.set(resultMap, currentClass); } else if (methodId.endsWith("Count")) { ResultMap resultMap = statement.getResultMaps().get(0); Field rf = resultMap.getClass().getDeclaredField("type"); rf.setAccessible(Boolean.TRUE); rf.set(resultMap, Integer.class); } } @SuppressWarnings("unchecked") private void setClass(Object parameter, Class<?> currentClass) throws InstantiationException, IllegalAccessException, ClassNotFoundException { if (parameter instanceof Map) { ((Map<String,Object>) parameter).put(DtoUtil.SPACE_TABLE_NAME, currentClass); } } private boolean isBaseMethod(Class<?> currentClass, String methodId) throws ClassNotFoundException { Boolean isBaseMethod = Boolean.FALSE; for (Method method : methods) { String methodName = method.getName(); if (methodId.equals(methodName)) { isBaseMethod = Boolean.TRUE; } } if (!isBaseMethod) { return Boolean.FALSE; } isBaseMethod = Boolean.FALSE; for (Class<?> clazz : currentClass.getInterfaces()) { if (clazz.equals(BaseDao.class)) { isBaseMethod = Boolean.TRUE; } } return isBaseMethod; } private Class<?> getClass(String className,Collection<Class<?>> clazzes) throws ClassNotFoundException { for(Class<?> clazz : clazzes){ if(className.equals(clazz.getName())){ return clazz; } } return null; } private Class<?> getResultType(Class<?> clazzDao){ Type[] params = clazzDao.getGenericInterfaces(); Type tc = null; if(params!=null && params.length>0 && params[0] instanceof ParameterizedType){ tc = ((ParameterizedType)params[0]).getActualTypeArguments()[0]; } return (Class<?>)tc; } private Map<String,Field> getResultMapping(Class<?> resultType){ Field[] fields = resultType.getDeclaredFields(); Map<String,Field> resultColumnMap = new HashMap<String,Field>(); for (Field field : fields) { DtoUtil.putField(field,resultColumnMap); } Class<?> parentClass = resultType.getSuperclass(); if(null!=parentClass && !parentClass.getSimpleName().equals("Serializable")){ fields = resultType.getSuperclass().getDeclaredFields(); for (Field field : fields) { DtoUtil.putField(field,resultColumnMap); } } return resultColumnMap; } private Map<String,String> getResultColumn(Map<String,Field> resultMapping){ Map<String,String> resultColumnMap = new HashMap<String,String>(); for(Map.Entry<String,Field> entry : resultMapping.entrySet()){ Field field = entry.getValue(); DtoUtil.putFieldColumn(field,resultColumnMap); } return resultColumnMap; } private DtoUtil.MapperWrap setSqlMapper(final String sqlId,final MappedStatement statement,final Object parameter) throws ClassNotFoundException{ String daoClassName = sqlId.substring(0, sqlId.lastIndexOf(".")); if(!DtoUtil.DAO_METHOD_MAP.containsKey(daoClassName)){ String className = sqlId.substring(0, sqlId.lastIndexOf(".")); Class<?> currentClass = getClass(className,statement.getConfiguration().getMapperRegistry().getMappers()); DtoUtil.MapperWrap mapperWrap = new DtoUtil.MapperWrap(); Class<?> resultType = getResultType(currentClass); String paramId = DtoUtil.id((Serializable) parameter); mapperWrap.setKey(resultType.getName()); mapperWrap.setDaoClassName(daoClassName); mapperWrap.setDaoClass(currentClass); mapperWrap.setResultType(resultType); mapperWrap.setResultTypeSimpleName(resultType.getSimpleName()); mapperWrap.setTableName(mapperWrap.getResultTypeSimpleName().replaceAll("([A-Z])", "_$1").replaceFirst("_", "").toLowerCase()); mapperWrap.setParamsType(resultType); mapperWrap.setParamsTypeName(resultType.getName()); mapperWrap.setIdParams(paramId); mapperWrap.setIdColumn(paramId.replaceAll("([A-Z])", "_$1").toLowerCase()); mapperWrap.setFieldMap(this.getResultMapping(resultType)); mapperWrap.setColumnMap(this.getResultColumn(mapperWrap.getFieldMap())); DtoUtil.DAO_METHOD_MAP.put(daoClassName, mapperWrap); DtoUtil.DAO_RESULT_MAP.put(mapperWrap.getKey(), mapperWrap); } return DtoUtil.DAO_METHOD_MAP.get(daoClassName); } private void setDataSource(final MappedStatement statement,final Object parameter){ } } |
package com.common.utils; import java.util.ArrayList; import java.util.List; /** * 存放公共常量 * @author szy * */ public final class Constant { public enum MYBATIS_SPECIAL_STRING{ ORDER_BY,LIMIT,COLUMNS,TABLES,WHERE,LIKE; public static List<String> list(){ List<String> result = new ArrayList<String>(); for (MYBATIS_SPECIAL_STRING entry : MYBATIS_SPECIAL_STRING.values()) { result.add(entry.name()); } return result; } } } |
package com.common.utils; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.common.annotation.Id; import com.common.annotation.Virtual; public final class DtoUtil { public final static String SPLIT_DAO_RESULT_SIGN="|"; public final static Map<String,Class<?>> FIELD_TYPE_MAP = new HashMap<String,Class<?>>(); static{ FIELD_TYPE_MAP.put("Double", Double.class); FIELD_TYPE_MAP.put("Short", Short.class); FIELD_TYPE_MAP.put("Long", Long.class); FIELD_TYPE_MAP.put("Float", Float.class); FIELD_TYPE_MAP.put("Integer", Integer.class); FIELD_TYPE_MAP.put("Byte", Byte.class); FIELD_TYPE_MAP.put("String", String.class); FIELD_TYPE_MAP.put("Character", Character.class); FIELD_TYPE_MAP.put("sDate", Date.class); FIELD_TYPE_MAP.put("Boolean", Boolean.class); FIELD_TYPE_MAP.put("Date", java.util.Date.class); } public static final String SPACE_TABLE_NAME="SPACE_TABLE_NAME"; /** * 用于存放POJO的列信息 */ private final static Map<Class<? extends Serializable>,Map<String,String>> columnMap = new ConcurrentHashMap<Class<? extends Serializable>, Map<String,String>>(); public final static Map<String,MapperWrap> DAO_METHOD_MAP = new ConcurrentHashMap<String,MapperWrap>(); public final static Map<String,MapperWrap> DAO_RESULT_MAP = new ConcurrentHashMap<String,MapperWrap>(); /** * 获取POJO对应的表名 需要POJO中的属性定义@Table(name) * * @return */ public static String tableName(Serializable obj) { String objClassName =obj.getClass().getSimpleName(); return objClassName.replaceAll("([A-Z])", "_$1") .replaceFirst("_", "").toLowerCase(); } /** * 获取POJO中的主键字段名 需要定义@Id * * @return */ public static String id(Serializable obj) { for (Field field : obj.getClass().getDeclaredFields()) { if (null != field.getAnnotation(Id.class)) return field.getName(); } if(obj.getClass().equals(Long.class) || obj.getClass().equals(long.class) || obj.getClass().equals(int.class)|| obj.getClass().equals(Integer.class)){ return "id"; } throw new RuntimeException("undefine " + obj.getClass().getName() + " @Id"); } private static boolean isNull(Serializable obj, String fieldname) { try { Field field = obj.getClass().getDeclaredField(fieldname); return isNull(obj, field); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } return false; } private static boolean isNull(Serializable obj, Field field) { try { field.setAccessible(true); return field.get(obj) == null; } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return false; } /** * 用于计算类定义 需要POJO中的属性定义 */ public static void caculationColumnList(Serializable obj) { Class<? extends Serializable> className = obj.getClass(); if (columnMap.containsKey(className)) return; Field[] fields = className.getDeclaredFields(); Map<String,String> fieldMap = new HashMap<String,String>(); for (Field field : fields) { Virtual notColumn =field.getAnnotation(Virtual.class); boolean isStatic = Modifier.isStatic(field.getModifiers()); boolean isFinal= Modifier.isFinal(field.getModifiers()); boolean isPrimitive =field.getType().isPrimitive() || FIELD_TYPE_MAP.containsValue(field.getType()); if(null!=notColumn || isStatic || isFinal ||!isPrimitive){ continue; } String fieldName = field.getName(); String column = fieldName.replaceAll("([A-Z])", "_$1").toLowerCase(); fieldMap.put(fieldName, column); } columnMap.put(className, fieldMap); Class<?> parentClass = className.getSuperclass(); if(null!=parentClass && !parentClass.getSimpleName().equals("Serializable")){ fields = className.getSuperclass().getDeclaredFields(); for (Field field : fields) { Virtual notColumn =field.getAnnotation(Virtual.class); boolean isStatic = Modifier.isStatic(field.getModifiers()); boolean isFinal= Modifier.isFinal(field.getModifiers()); boolean isPrimitive =field.getType().isPrimitive() || FIELD_TYPE_MAP.containsValue(field.getType()); if(null!=notColumn || isStatic || isFinal ||!isPrimitive){ continue; } String fieldName = field.getName(); String column = fieldName.replaceAll("([A-Z])", "_$1").toLowerCase(); fieldMap.put(fieldName, column); } } } public static void putField(final Field field,final Map<String,Field> fieldMap){ Virtual notColumn =field.getAnnotation(Virtual.class); boolean isStatic = Modifier.isStatic(field.getModifiers()); boolean isFinal= Modifier.isFinal(field.getModifiers()); boolean isPrimitive =field.getType().isPrimitive() || FIELD_TYPE_MAP.containsValue(field.getType()); if(null!=notColumn || isStatic || isFinal ||!isPrimitive){ return; } fieldMap.put(field.getName(), field); } public static void putFieldColumn(final Field field,final Map<String,String> fieldMap){ Virtual notColumn =field.getAnnotation(Virtual.class); boolean isStatic = Modifier.isStatic(field.getModifiers()); boolean isFinal= Modifier.isFinal(field.getModifiers()); boolean isPrimitive =field.getType().isPrimitive() || FIELD_TYPE_MAP.containsValue(field.getType()); if(null!=notColumn || isStatic || isFinal ||!isPrimitive){ return; } String fieldName = field.getName(); String column = fieldName.replaceAll("([A-Z])", "_$1").toLowerCase(); fieldMap.put(fieldName, column); } @SuppressWarnings("unchecked") public static void caculationColumnList(Class<?> className) { if (columnMap.containsKey(className)) return; Field[] fields = className.getDeclaredFields(); Map<String,String> fieldMap = new HashMap<String,String>(); for (Field field : fields) { Virtual notColumn =field.getAnnotation(Virtual.class); boolean isStatic = Modifier.isStatic(field.getModifiers()); boolean isFinal= Modifier.isFinal(field.getModifiers()); boolean isPrimitive =field.getType().isPrimitive() || FIELD_TYPE_MAP.containsValue(field.getType()); if(null!=notColumn || isStatic || isFinal ||!isPrimitive){ continue; } String fieldName = field.getName(); String column = fieldName.replaceAll("([A-Z])", "_$1").toLowerCase(); fieldMap.put(fieldName, column); } columnMap.put((Class<? extends Serializable>) className, fieldMap); Class<?> parentClass = className.getSuperclass(); if(null!=parentClass && !parentClass.getSimpleName().equals("Serializable")){ fields = className.getSuperclass().getDeclaredFields(); for (Field field : fields) { Virtual notColumn =field.getAnnotation(Virtual.class); boolean isStatic = Modifier.isStatic(field.getModifiers()); boolean isFinal= Modifier.isFinal(field.getModifiers()); boolean isPrimitive =field.getType().isPrimitive() || FIELD_TYPE_MAP.containsValue(field.getType()); if(null!=notColumn || isStatic || isFinal ||!isPrimitive){ continue; } String fieldName = field.getName(); String column = fieldName.replaceAll("([A-Z])", "_$1").toLowerCase(); fieldMap.put(fieldName, column); } } } /** * Where条件信息 */ public class WhereColumn { public String name; public boolean isString; public WhereColumn(String name, boolean isString) { this.name = name; this.isString = isString; } } /** * 用于获取Insert的字段累加 * * @return */ public static String returnInsertColumnsName(Serializable obj) { StringBuilder sb = new StringBuilder(); Map<String,String> fieldMap = columnMap.get(obj.getClass()); Iterator<String> iterator= fieldMap.keySet().iterator(); int i = 0; while(iterator.hasNext()){ String fieldname=iterator.next(); if (isNull(obj, fieldname) && !fieldname.contains("createTime") && !fieldname.contains("updateTime")) continue; if(i++!=0){ sb.append(','); } sb.append(fieldMap.get(fieldname)); } return sb.toString(); } /** * 用于获取Insert的字段映射累加 * * @return */ public static String returnInsertColumnsDefine(Serializable obj) { StringBuilder sb = new StringBuilder(); Map<String,String> fieldMap = columnMap.get(obj.getClass()); Iterator<String> iterator= fieldMap.keySet().iterator(); int i = 0; while(iterator.hasNext()){ String fieldname=iterator.next(); boolean isTime = fieldname.equalsIgnoreCase("createTime") || fieldname.equalsIgnoreCase("updateTime"); if ((!isTime) && isNull(obj, fieldname)) continue; if(i++!=0){ sb.append(','); } if(isTime){ sb.append("NOW()"); }else{ sb.append("#{").append(fieldname).append('}'); } } return sb.toString(); } /** * 用于获取Update Set的字段累加 * * @return */ public static String returnUpdateSetFull(Serializable obj) { StringBuilder sb = new StringBuilder(); Map<String,String> fieldMap = columnMap.get(obj.getClass()); int i = 0; for (Map.Entry<String, String> column : fieldMap.entrySet()) { boolean isUpdateTime = column.getKey().equalsIgnoreCase("updateTime"); boolean isCreateTime = column.getKey().equalsIgnoreCase("createTime"); if (i++ != 0) sb.append(','); if(isUpdateTime){ sb.append("update_time=NOW()"); }else if(isCreateTime && isNull(obj, column.getKey())){ sb.append("create_time=NOW()"); }else{ sb.append(column.getValue()).append("=#{").append(column.getKey()).append('}'); } } return sb.toString(); } /** * 用于获取Update Set的字段累加 * * @return */ public static String returnUpdateSet(Serializable obj) { StringBuilder sb = new StringBuilder(); Map<String,String> fieldMap = columnMap.get(obj.getClass()); int i = 0; for (Map.Entry<String, String> column : fieldMap.entrySet()) { String key = column.getKey(); boolean isUpdateTime = key.equalsIgnoreCase("updateTime"); if (isNull(obj, key) && !isUpdateTime) continue; if (i++ != 0) sb.append(','); if(isUpdateTime){ sb.append("update_time=NOW()"); }else{ sb.append(column.getValue()).append("=#{").append(column.getKey()).append('}'); } } return sb.toString(); } /** * 用于获取select、delete的条件组装 * @return */ public static String whereColumnNotNull(Serializable obj) { StringBuilder sb = new StringBuilder(); Map<String,String> fieldMap = columnMap.get(obj.getClass()); int i = 0; for (Map.Entry<String, String> column : fieldMap.entrySet()) { if (isNull(obj, column.getKey())) continue; if (i++ != 0) sb.append(" AND "); sb.append(column.getValue()).append("=#{").append(column.getKey()+"}"); } return sb.toString(); } /** * 用于获取select、delete的条件组装 * @return */ public static String whereColumn(Map<String,Object> param) { StringBuilder sb = new StringBuilder(); int i = 0; for (Map.Entry<String, Object> column : param.entrySet()) { if (i++ != 0) sb.append(" AND "); if(!Constant.MYBATIS_SPECIAL_STRING.list().contains(column.getKey().toUpperCase())){ sb.append(column.getKey().replaceAll("([A-Z])", "_$1").toLowerCase()).append("=#{").append(column.getKey()+"}"); }else if(Constant.MYBATIS_SPECIAL_STRING.LIKE.name().equalsIgnoreCase(column.getKey())){ sb.append(column.getValue()); } else if (Constant.MYBATIS_SPECIAL_STRING.COLUMNS.name().equalsIgnoreCase(column.getKey())) { sb.append(column.getValue()); } } return sb.toString(); } /** * 用于获取select、delete的条件组装 * @return */ public static String whereColumnNotEmpty(Map<String,Object> param) { StringBuilder sb = new StringBuilder(); int i = 0; for (Map.Entry<String, Object> column : param.entrySet()) { if (column.getValue()==null) continue; if (i++ != 0) sb.append(" AND "); if(!Constant.MYBATIS_SPECIAL_STRING.list().contains(column.getKey().toUpperCase())){ sb.append(column.getKey().replaceAll("([A-Z])", "_$1").toLowerCase()).append("=#{").append(column.getKey()+"}"); }else if(Constant.MYBATIS_SPECIAL_STRING.LIKE.name().equalsIgnoreCase(column.getKey())){ sb.append(column.getValue()); } else if (Constant.MYBATIS_SPECIAL_STRING.COLUMNS.name().equalsIgnoreCase(column.getKey())) { sb.append(column.getValue()); } } return sb.toString(); } public static String queryColumn(Serializable obj){ StringBuilder sb = new StringBuilder(); Map<String,String> fieldMap = columnMap.get(obj.getClass()); int i = 0; for (Map.Entry<String, String> column : fieldMap.entrySet()) { if (i++ != 0) sb.append(','); sb.append(column.getValue()).append(" as ").append(column.getKey()); } return sb.toString(); } public static String queryColumn(Map<String,String> fieldColumnMap){ StringBuilder sb = new StringBuilder(); int i = 0; for (Map.Entry<String, String> column : fieldColumnMap.entrySet()) { if (i++ != 0) sb.append(','); sb.append(column.getValue()).append(" as ").append(column.getKey()); } return sb.toString(); } /* public Integer getId(Serializable obj) { return 0; }*/ /** * 打印类字段信息 */ public static String objString(Serializable obj) { Field[] fields = obj.getClass().getDeclaredFields(); StringBuilder sb = new StringBuilder(); sb.append('['); for (Field f : fields) { if (Modifier.isStatic(f.getModifiers()) || Modifier.isFinal(f.getModifiers())) continue; Object value = null; try { f.setAccessible(true); value = f.get(obj); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } if (value != null) sb.append(f.getName()).append('=').append(value).append(','); } sb.append(']'); return sb.toString(); } static class MapperWrap implements Serializable{ /** * */ private static final long serialVersionUID = -7578889926308207995L; private String key; private String daoClassName; private String tableName; private String idColumn; private String idParams; private Map<String,String> columnMap = new HashMap<String,String>(); private Map<String,Field> fieldMap = new HashMap<String,Field>(); private String paramsTypeName; private String resultTypeSimpleName; private Class<?> daoClass; private Class<?> paramsType; private Class<?> resultType= paramsType; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getDaoClassName() { return daoClassName; } public void setDaoClassName(String daoClassName) { this.daoClassName = daoClassName; } public String getTableName() { return tableName; } public void setTableName(String tableName) { this.tableName = tableName; } public String getIdColumn() { return idColumn; } public void setIdColumn(String idColumn) { this.idColumn = idColumn; } public String getIdParams() { return idParams; } public void setIdParams(String idParams) { this.idParams = idParams; } public Map<String, String> getColumnMap() { return columnMap; } public void setColumnMap(Map<String, String> columnMap) { this.columnMap = columnMap; } public String getParamsTypeName() { return paramsTypeName; } public void setParamsTypeName(String paramsTypeName) { this.paramsTypeName = paramsTypeName; } public Class<?> getDaoClass() { return daoClass; } public void setDaoClass(Class<?> daoClass) { this.daoClass = daoClass; } public Class<?> getParamsType() { return paramsType; } public void setParamsType(Class<?> paramsType) { this.paramsType = paramsType; } public Class<?> getResultType() { return resultType; } public void setResultType(Class<?> resultType) { this.resultType = resultType; } public Map<String, Field> getFieldMap() { return fieldMap; } public void setFieldMap(Map<String, Field> fieldMap) { this.fieldMap = fieldMap; } public String getResultTypeSimpleName() { return resultTypeSimpleName; } public void setResultTypeSimpleName(String resultTypeSimpleName) { this.resultTypeSimpleName = resultTypeSimpleName; } } } |
package com.common.utils; import static com.common.utils.DtoUtil.SPACE_TABLE_NAME; import static com.common.utils.DtoUtil.caculationColumnList; import static com.common.utils.DtoUtil.id; import static com.common.utils.DtoUtil.queryColumn; import static com.common.utils.DtoUtil.returnInsertColumnsDefine; import static com.common.utils.DtoUtil.returnInsertColumnsName; import static com.common.utils.DtoUtil.returnUpdateSet; import static com.common.utils.DtoUtil.returnUpdateSetFull; import static com.common.utils.DtoUtil.tableName; import static com.common.utils.DtoUtil.whereColumn; import static com.common.utils.DtoUtil.whereColumnNotEmpty; import static com.common.utils.DtoUtil.whereColumnNotNull; import static org.apache.ibatis.jdbc.SqlBuilder.BEGIN; import static org.apache.ibatis.jdbc.SqlBuilder.DELETE_FROM; import static org.apache.ibatis.jdbc.SqlBuilder.FROM; import static org.apache.ibatis.jdbc.SqlBuilder.INSERT_INTO; import static org.apache.ibatis.jdbc.SqlBuilder.ORDER_BY; import static org.apache.ibatis.jdbc.SqlBuilder.SELECT; import static org.apache.ibatis.jdbc.SqlBuilder.SET; import static org.apache.ibatis.jdbc.SqlBuilder.SQL; import static org.apache.ibatis.jdbc.SqlBuilder.UPDATE; import static org.apache.ibatis.jdbc.SqlBuilder.VALUES; import static org.apache.ibatis.jdbc.SqlBuilder.WHERE; import java.io.Serializable; import java.util.Iterator; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class MyBatisTemplate<T extends Serializable> { private final static Log log = LogFactory.getLog(MyBatisTemplate.class); public String insert(T obj) { BEGIN(); INSERT_INTO(tableName(obj)); caculationColumnList(obj); VALUES(returnInsertColumnsName(obj), returnInsertColumnsDefine(obj)); return SQL(); } public String updateById(T obj) { String idname = id(obj); BEGIN(); UPDATE(tableName(obj)); caculationColumnList(obj); SET(returnUpdateSetFull(obj)); WHEREID(idname); return SQL(); } public String updateNotNullById(T obj) { String idname = id(obj); BEGIN(); UPDATE(tableName(obj)); caculationColumnList(obj); SET(returnUpdateSet(obj)); WHEREID(idname); return SQL(); } public String deleteById(T obj) { String idname = id(obj); BEGIN(); DELETE_FROM(tableName(obj)); WHEREID(idname); return SQL(); } public String deleteByObject(T obj){ caculationColumnList(obj); BEGIN(); DELETE_FROM(tableName(obj)); WHERE(whereColumnNotNull(obj)); return SQL(); } public String deleteByParamNotEmpty(Map<String,Object> param){ removeEmpty(param); BEGIN(); Serializable obj = (Serializable) param.get(SPACE_TABLE_NAME); String limit =""; if(param.containsKey(Constant.MYBATIS_SPECIAL_STRING.LIMIT.name())){ limit=addlimit(param); } DELETE_FROM(tableName(obj)); param.remove(SPACE_TABLE_NAME); if(param!=null && param.values()!=null && param.values().size()>0) WHERE(whereColumnNotEmpty(param)); return SQL()+limit; } public String deleteByParam(Map<String,Object> param){ BEGIN(); Serializable obj = (Serializable) param.get(SPACE_TABLE_NAME); String limit =""; if(param.containsKey(Constant.MYBATIS_SPECIAL_STRING.LIMIT.name())){ limit=addlimit(param); } DELETE_FROM(tableName(obj)); param.remove(SPACE_TABLE_NAME); if(param!=null && param.values()!=null && param.values().size()>0) WHERE(whereColumn(param)); return SQL()+limit; } public String queryById(T obj){ String idname = id(obj); caculationColumnList(obj); BEGIN(); SELECT(queryColumn(obj)); FROM(tableName(obj)+" "+obj.getClass().getSimpleName()); WHEREID(idname); return SQL(); } public String queryByObject(T obj){ caculationColumnList(obj); BEGIN(); SELECT(queryColumn(obj)); FROM(tableName(obj)+" "+obj.getClass().getSimpleName()); if(!"".equals(whereColumnNotNull(obj))){ WHERE(whereColumnNotNull(obj)); } return SQL(); } public String queryByParamNotEmpty(Map<String,Object> param){ try{ removeEmpty(param); Serializable obj =(Serializable) param.get(SPACE_TABLE_NAME); param.remove(SPACE_TABLE_NAME); Object orderBy = param.get(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name()); param.remove(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name()); caculationColumnList(obj); BEGIN(); SELECT(queryColumn(obj)); FROM(tableName(obj)+" "+obj.getClass().getSimpleName()); if(!param.isEmpty()) WHERE(whereColumnNotEmpty(param)); if(null!=orderBy) ORDER_BY(orderBy.toString()); String sql = SQL(); log.debug(sql); return sql; }catch(Exception e){ log.error("出错了 !"+param); e.printStackTrace(); return null; } } public String queryByParam(Map<String,Object> param){ try{ Serializable obj =(Serializable) param.get(SPACE_TABLE_NAME); Object orderBy = param.get(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name()); param.remove(SPACE_TABLE_NAME); param.remove(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name()); caculationColumnList(obj); BEGIN(); SELECT(queryColumn(obj)); FROM(tableName(obj)+" "+obj.getClass().getSimpleName()); if(!param.isEmpty()) WHERE(whereColumn(param)); if(null!=orderBy) ORDER_BY(orderBy.toString()); String sql = SQL(); log.debug(sql); return sql; }catch(Exception e){ log.error("出错了!"+param); e.printStackTrace(); return null; } } public String queryByObjectCount(T obj) { caculationColumnList(obj); BEGIN(); SELECT(" count(*) total "); FROM(tableName(obj) + " " + obj.getClass().getSimpleName()); WHERE(whereColumnNotNull(obj)); return SQL(); } public String queryByParamNotEmptyCount(Map<String, Object> param) { try{ removeEmpty(param); Serializable obj = (Serializable)param.remove(SPACE_TABLE_NAME); caculationColumnList(obj); BEGIN(); SELECT(" count(*) total "); FROM(tableName(obj) + " " + obj.getClass().getSimpleName()); Object orderBy = param.remove(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name()); if(!param.isEmpty()) WHERE(whereColumn(param)); param.put(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name(), orderBy); String sql = SQL(); log.debug(sql); return sql; }catch(Exception e){ log.error("出错了!"+param); e.printStackTrace(); return null; } } public String queryByParamCount(Map<String, Object> param) { try{ Serializable obj = (Serializable) param.get(SPACE_TABLE_NAME); param.remove(SPACE_TABLE_NAME); caculationColumnList(obj); BEGIN(); SELECT(" count(*) total "); FROM(tableName(obj) + " " + obj.getClass().getSimpleName()); Object orderBy = param.remove(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name()); if(!param.isEmpty()) WHERE(whereColumn(param)); param.put(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name(), orderBy); String sql = SQL(); log.debug(sql); return sql; }catch(Exception e){ log.error("出错了!"+param); e.printStackTrace(); return null; } } public String queryPageByParamNotEmpty(Map<String,Object> param){ removeEmpty(param); Serializable obj =(Serializable)param.remove(SPACE_TABLE_NAME); String limit = addlimit(param); Object orderBy = param.remove(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name()); caculationColumnList(obj); BEGIN(); SELECT(queryColumn(obj)); FROM(tableName(obj)+" "+obj.getClass().getSimpleName()); if(!param.isEmpty()) WHERE(whereColumnNotEmpty(param)); if(orderBy!=null){ ORDER_BY(orderBy.toString()); } return SQL()+limit; } public String queryPageByParam(Map<String,Object> param){ Serializable obj =(Serializable)param.remove(SPACE_TABLE_NAME); String limit = addlimit(param); Object orderBy = param.remove(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name()); caculationColumnList(obj); BEGIN(); SELECT(queryColumn(obj)); FROM(tableName(obj)+" "+obj.getClass().getSimpleName()); if(!param.isEmpty()) WHERE(whereColumn(param)); if(orderBy!=null){ ORDER_BY(orderBy.toString()); } return SQL()+limit; } @SuppressWarnings("unchecked") public String queryPageByParams(Map<String,Object> param){ Serializable obj =(Serializable)param.remove(SPACE_TABLE_NAME); Object orderBy = param.remove(Constant.MYBATIS_SPECIAL_STRING.ORDER_BY.name()); caculationColumnList(obj); BEGIN(); SELECT(queryColumn(obj)); FROM(tableName(obj)+" "+obj.getClass().getSimpleName()); if(!((Map<String,Object>)param.get("params")).isEmpty()) WHERE(whereColumn((Map<String,Object>)param.get("params"))); if(orderBy!=null){ ORDER_BY(orderBy.toString()); } return SQL(); } public void WHEREID(final String idname){ WHERE(idname.replaceAll("([A-Z])", "_$1").toLowerCase() + "=#{" + idname + "}"); } public String addlimit(Map<String,Object> param){ String subsql =" "+ Constant.MYBATIS_SPECIAL_STRING.LIMIT.name()+" "; Object obj =param.remove(Constant.MYBATIS_SPECIAL_STRING.LIMIT.name()); if(null==obj){ subsql = subsql+"0,10"; }else{ subsql = subsql+obj; } return subsql; } private void removeEmpty(Map<String,Object> params){ Iterator<String> iterator = params.keySet().iterator(); while(iterator.hasNext()){ String key = iterator.next(); if(params.get(key)==null){ params.remove(key); iterator = params.keySet().iterator(); } } } } |
package com.common.mybatis.dao; importstatic org.junit.Assert.fail; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.common.mybatis.model.UserInfo; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath*:spring.xml" }) publicclass UserInfoDaoTest { privatefinalstatic Loglog = LogFactory.getLog(UserInfoDaoTest.class); @Autowired private UserInfoDaouserInfoDao; @Before publicvoid setUp()throws Exception { } @Test publicvoid testInsert() { UserInfo userInfo = new UserInfo(); userInfo.setUserName("测试用户"); userInfo.setAccount("test001"); userInfo.setPassWord("123243213"); userInfoDao.insert(userInfo); } } |
db.driver=com.mysql.jdbc.Driver db.driverUrl=jdbc\:mysql\://localhost\:3306/testmybatis?allowMultiQueries=true db.user=root db.password=1234 proxool.maximumConnectionCount=20 proxool.minimumConnectionCount=5 proxool.prototypeCount=3 proxool.simultaneousBuildThrottle=15 db1.driver=com.mysql.jdbc.Driver db1.driverUrl=jdbc\:mysql\://localhost\:3306/testmybatis?allowMultiQueries=true db1.user=root db1.password=1234 |
log4j.rootLogger=debug,fileout,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d%-5psoa[%t](%F:%L)-%m%n #daily run report, #24 log files for every day log4j.appender.fileout=org.apache.log4j.DailyRollingFileAppender log4j.appender.fileout.File=../common-mybatis.log log4j.appender.fileout.layout=org.apache.log4j.PatternLayout log4j.appender.fileout.DatePattern='.'yyyy-MM-dd-HH log4j.appender.fileout.layout.ConversionPattern=%d%-5psoa[%c](%F:%L)-%m%n log4j.logger.com.common.mybatis = debug,fileout,stdout log4j.logger.java.org.apache.ibatis=debug,fileout,stdout log4j.logger.java.sql=debug,fileout,stdout |
log4j.rootLogger=debug,fileout,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d%-5psoa[%t](%F:%L)-%m%n #daily run report, #24 log files for every day log4j.appender.fileout=org.apache.log4j.DailyRollingFileAppender log4j.appender.fileout.File=../common-mybatis.log log4j.appender.fileout.layout=org.apache.log4j.PatternLayout log4j.appender.fileout.DatePattern='.'yyyy-MM-dd-HH log4j.appender.fileout.layout.ConversionPattern=%d%-5psoa[%c](%F:%L)-%m%n log4j.logger.com.common.mybatis = debug,fileout,stdout log4j.logger.java.org.apache.ibatis=debug,fileout,stdout log4j.logger.java.sql=debug,fileout,stdout |
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd" default-autowire="byName"> <aop:aspectj-autoproxy/> <context:annotation-config/> <util:properties id="meta" location="classpath:jdbc.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="#{meta['db.user']}"/> <property name="password" value="#{meta['db.password']}"/> <property name="driverClass" value="#{meta['db.driver']}"/> <property name="jdbcUrl" value="#{meta['db.driverUrl']}"/> <property name="maxPoolSize" value="#{meta['proxool.maximumConnectionCount']}"/> <property name="minPoolSize" value="#{meta['proxool.minimumConnectionCount']}"/> <property name="initialPoolSize" value="#{meta['proxool.prototypeCount']}"/> <property name="maxIdleTime" value="60"/> <property name="acquireRetryAttempts" value="5"/> <!--每60秒检查所有连接池中的空闲连接。默9认值: 0,不检查 --> <property name="idleConnectionTestPeriod" value="60"/> <property name="testConnectionOnCheckin" value="true"/> <property name="automaticTestTable" value="c3p0Table"/> <property name="numHelperThreads" value="20"/> <!--在连接被应用程序 checkout后指定时间内未checkin则由连接缓冲池执行kill操作,同时打印堆栈跟踪信息 --> <property name="debugUnreturnedConnectionStackTraces" value="true"/> <property name="unreturnedConnectionTimeout" value="70"/> </bean> <!--mybatis --> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" name="mainSqlSessionFactory"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.common.mybatis.dao"/> <property name="sqlSessionFactoryBeanName" value="mainSqlSessionFactory"/> </bean> </beans> |
相关文章推荐
- 码讲——java基础,变量和表达式
- 《Java程序设计》第17周课程设计:《猜猜看》游戏 第一天
- JAVA设计模式初探之装饰者模式
- 用java Swing写一个最简单的图形框
- SpringMVC自定义多视图解析器
- J2EE之EJB
- eclipse + libsvm-3.12 用SVM实现简单线性分类
- Java static属性和静态代码块和构造方法等的执行顺序探讨
- javaapi中的排序
- Java实现栈和队列
- spring 源码解读与设计详解:8 Spring配置文件的读取与容器装配详析
- 如何从零开始学习Java语言
- spring 源码解读与设计详解: 7 BeanDefinitionParserDelegate深入解读
- Java基础总结之反射
- Spring-mvc传参数
- sphinx 中的注解,及java Annotation 总结
- Java学习03--变量的强制转换、字符运算
- Struts中的常量
- SAX读取xml文件的方法总结
- sh_Spring整合Hibernate