基于spring创建通用的Mybatis类
来源:互联网 发布:日本深夜节目软件 编辑:程序博客网 时间:2024/05/27 12:21
基于spring创建通用的Mybatis类
一、环境
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='用户基础信息表'
2. Pom.xml
<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>
3. 注解 (Id, Virtual)
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 {
}
4. DO
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;
}
}
5. DAO(baseDao,UserInfoDao)
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>{
}
6. 拦截器
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){
}
}
7. 其它工具类
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();
}
}
}
}
8. 测试
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);
}
}
9. 配置(jdbc.properties,log4j.properties,mybatis-config.xml,spring.xml)
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"/>
<beanid="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="#{meta['db.user']}"/>
<property name="password" value="#{meta['db.password']}"/>
<propertyname="driverClass" value="#{meta['db.driver']}"/>
<propertyname="jdbcUrl" value="#{meta['db.driverUrl']}"/>
<propertyname="maxPoolSize" value="#{meta['proxool.maximumConnectionCount']}"/>
<propertyname="minPoolSize" value="#{meta['proxool.minimumConnectionCount']}"/>
<propertyname="initialPoolSize" value="#{meta['proxool.prototypeCount']}"/>
<propertyname="maxIdleTime" value="60"/>
<propertyname="acquireRetryAttempts" value="5"/>
<!--每60秒检查所有连接池中的空闲连接。默9认值: 0,不检查 -->
<propertyname="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 -->
<beanid="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-argindex="0" ref="sqlSessionFactory"/>
</bean>
<beanid="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
name="mainSqlSessionFactory">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<beanid="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.common.mybatis.dao"/>
<property name="sqlSessionFactoryBeanName" value="mainSqlSessionFactory"/>
</bean>
</beans>
- 基于spring创建通用的Mybatis类
- 快速搭建基于Maven的通用Web项目(Spring-Mybatis-JSF-Jersey-Boostrap)
- 基于Mybatis的通用Service层实现
- mybatis基于spring的配置
- 基于spring的mybatis封装
- 基于spring jdbc的通用存取层
- 基于Mybatis的通用Service层实现【未验证】
- Mybatis+Spring基于接口编程的例子
- 基于注解的mybatis和spring整合
- 基于注解的mybatis和spring整合
- 基于Spring-SpringMVC-Mybatis的简单例子
- 基于注解的mybatis和spring整合
- 基于mybatis+spring的读写分离
- MyBatis + Spring 基于SqlSessionDaoSupport的泛型基类
- 基于spring、mybatis的图书管理系统
- SpringMVC+Spring+Mybatis基于Maven的整合
- MyBatis基于Spring-boot集成通用Mapper以及pagehelper分页插件(含源码下载)
- 基于Maven的Spring + Spring MVC + Mybatis的环境搭建
- 【前端工程师之路】JavaScript——数据类型
- 【NIO】dawn中buffer的使用
- LeetCode-Invert Binary Tree-解题报告
- uc/os-ii任务就绪表
- 【前端工程师之路】JavaScript——Math对象
- 基于spring创建通用的Mybatis类
- STM32F407VG (三)ADC
- LeetCode Climbing Stairs
- MongoDB Windows环境安装及配置
- ORA-12560: TNS: 协议适配器错误的问题
- java初学者知识小总结-02(6.29)
- 2015062901 - 有偿付出
- 第八章(对象工厂)
- ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了