mybatis实现零配置

以下是我在公司花了一个星期写的核心代码
package com.demo.common;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.mapping.ResultMapping;
import org.apache.ibatis.mapping.MappedStatement.Builder;
import org.apache.ibatis.scripting.LanguageDriver;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * SQL注入
 * @author 陈双
 *
 */
@Component
@EnableConfigurationProperties(CommonProperties.class)
public class SQLInjectionBean implements InitializingBean {

	private Logger logger = LoggerFactory.getLogger(getClass());
	@Autowired
	private SqlSessionFactory sqlSessionFactory;
	@Autowired
	private CommonProperties commonProperties;
	private Configuration configuration;
	private LanguageDriver languageDriver;
	private List<EntityMapping> entityMappings = new ArrayList<EntityMapping>(100);
	private Map<String,String> mappers = new HashMap<String,String>(100);
	public void addEntityMapping(EntityMapping mapping) {
		this.entityMappings.add(mapping);
	}
	public void addMapper(String entityClass,String mapperClass) {
		this.mappers.put(entityClass, mapperClass);
	}
	@Override
	public void afterPropertiesSet() throws Exception {
		logger.info("start init SQL .....");
        if (this.configuration == null) {
        	this.configuration = this.sqlSessionFactory.getConfiguration();
        	this.languageDriver = this.configuration.getDefaultScriptingLanuageInstance();
        }
        //开始扫描注解
        PackageScanner scanner = new PackageScanner(commonProperties,this);
        logger.info("scann package ....");
        scanner.scann();
        Method buildAllStatements=this.configuration.getClass().getDeclaredMethod("buildAllStatements", null);
        buildAllStatements.setAccessible(true);
        buildAllStatements.invoke(this.configuration, null);
        /*
         * 初始化MappedStatement
         */
        for (EntityMapping mapping : this.entityMappings) {
        	createResultMap(mapping);
        	addInsertMappedStatement(mapping);
        	addInsertListMappedStatement(mapping);
        	addUpdateMappedStatement(mapping);
        	addUpdateByMapMappedStatement(mapping);
        	addGetByIdMappedStatement(mapping);
        	addGetCountMappedStatement(mapping);
        	addGetListMappedStatement(mapping);
        	addGetListByIdsMappedStatement(mapping);
        	addGetMappedStatement(mapping);
        	addDeleteByIdMappedStatement(mapping);
        	addDeleteMappedStatement(mapping);
        	addExecuteDeleteBySqlMappedStatement(mapping);
        	addExecuteInsertBySqlMappedStatement(mapping);
        	addExecuteQueryListBySqlMappedStatement(mapping);
        	addExecuteQueryOneBySqlMappedStatement(mapping);
        	addExecuteUpdateBySqlMappedStatement(mapping);
        }
        logger.info("end init SQL .....");
	}
	/**
	 * 创建ResultMap
	 * @param mapping
	 * @throws ClassNotFoundException 
	 */
	public void createResultMap(EntityMapping mapping) throws ClassNotFoundException {
		List<ResultMapping> list = new ArrayList<ResultMapping>();
		for (PropertyMapping propertyMapping : mapping.getPropertyMappings()) {
			ResultMapping resultMapping = new ResultMapping.Builder(this.configuration,propertyMapping.getProperty(),propertyMapping.getColumn(),propertyMapping.getType()).build();
			list.add(resultMapping);
		}
		Class<?> entityClass = Class.forName(mapping.getClassName());
		ResultMap resultMap = new ResultMap.Builder(this.configuration, getResultMapId(mapping.getClassName()), entityClass,list).build();
		this.configuration.addResultMap(resultMap);
	}
	/**
	 * 添加insert
	 * @throws ClassNotFoundException 
	 */
	public void addInsertMappedStatement(EntityMapping mapping) throws ClassNotFoundException {
		String id = this.mappers.get(mapping.getClassName())+".insert";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		Class<?> clz = Class.forName(mapping.getClassName());
		String sql = SQLHeper.generateInsertSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, clz);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.INSERT).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加insertList
	 */
	public void addInsertListMappedStatement(EntityMapping mapping) {
		String id = this.mappers.get(mapping.getClassName())+".insertList";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		String sql = SQLHeper.generateInsertListSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, List.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.INSERT).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加update
	 * @param mapping
	 * @throws ClassNotFoundException 
	 */
	public void addUpdateMappedStatement(EntityMapping mapping) throws ClassNotFoundException {
		String id = this.mappers.get(mapping.getClassName())+".update";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		Class<?> clz = Class.forName(mapping.getClassName());
		String sql = SQLHeper.generateUpdateSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, clz);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.UPDATE).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加updateByMap
	 * @param mapping
	 */
	public void addUpdateByMapMappedStatement(EntityMapping mapping) {
		String id = this.mappers.get(mapping.getClassName())+".updateByMap";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		String sql = SQLHeper.generateUpdateByMapSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, Map.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.UPDATE).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加getById
	 * @param mapping
	 */
	public void addGetByIdMappedStatement(EntityMapping mapping) {
		String id = this.mappers.get(mapping.getClassName())+".getById";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		ArrayList<ResultMap> resultMaps = new ArrayList<>();
		//对应xml中的resultSet的id
		resultMaps.add(this.configuration.getResultMap(getResultMapId(mapping.getClassName())));
		String sql = SQLHeper.generateGetByIdSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, SQLHeper.generateGetByIdSql(mapping), Serializable.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.SELECT).resultMaps(resultMaps).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加get
	 * @param mapping
	 * @throws ClassNotFoundException 
	 */
	public void addGetMappedStatement(EntityMapping mapping) throws ClassNotFoundException {
		String id = this.mappers.get(mapping.getClassName())+".get";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		Class<?> clz = Class.forName(mapping.getClassName());
		ArrayList<ResultMap> resultMaps = new ArrayList<>();
		//对应xml中的resultSet的id
		resultMaps.add(this.configuration.getResultMap(getResultMapId(mapping.getClassName())));
		String sql = SQLHeper.generateGetSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, clz);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.SELECT).resultMaps(resultMaps).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加getList
	 * @param mapping
	 * @throws ClassNotFoundException 
	 */
	public void addGetListMappedStatement(EntityMapping mapping) throws ClassNotFoundException {
		String id = this.mappers.get(mapping.getClassName())+".getList";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		Class<?> clz = Class.forName(mapping.getClassName());
		ArrayList<ResultMap> resultMaps = new ArrayList<>();
		//对应xml中的resultSet的id
		resultMaps.add(this.configuration.getResultMap(getResultMapId(mapping.getClassName())));
		String sql = SQLHeper.generateGetListSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, clz);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.SELECT).resultMaps(resultMaps).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 生成getListByIds
	 * @param mapping
	 */
	public void addGetListByIdsMappedStatement(EntityMapping mapping) {
		String id = this.mappers.get(mapping.getClassName())+".getListByIds";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		ArrayList<ResultMap> resultMaps = new ArrayList<>();
		//对应xml中的resultSet的id
		resultMaps.add(this.configuration.getResultMap(getResultMapId(mapping.getClassName())));
		String sql = SQLHeper.generateGetListByIdsSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, List.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.SELECT).resultMaps(resultMaps).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加getCount
	 * @param mapping
	 * @throws ClassNotFoundException 
	 */
	public void addGetCountMappedStatement(EntityMapping mapping) throws ClassNotFoundException {
		String id = this.mappers.get(mapping.getClassName())+".getCount";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		Class<?> clz = Class.forName(mapping.getClassName());
		String sql = SQLHeper.generateGetCountSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, clz);
		List<ResultMap> resultMaps = new ArrayList<ResultMap>();
		//生成ResultMap
		ResultMap resultMap = new ResultMap.Builder(this.configuration, id +"-Inline", Integer.class, new ArrayList<ResultMapping>()).build();
		resultMaps.add(resultMap);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.SELECT).resultMaps(resultMaps).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加deleteById
	 * @param mapping
	 * @throws ClassNotFoundException 
	 */
	public void addDeleteByIdMappedStatement(EntityMapping mapping) throws ClassNotFoundException {
		String id = this.mappers.get(mapping.getClassName())+".deleteById";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		String sql = SQLHeper.generateDeleteByIdSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, Serializable.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.DELETE).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加delete
	 * @param mapping
	 * @throws ClassNotFoundException 
	 */
	public void addDeleteMappedStatement(EntityMapping mapping) throws ClassNotFoundException {
		String id = this.mappers.get(mapping.getClassName())+".delete";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		Class<?> clz = Class.forName(mapping.getClassName());
		String sql = SQLHeper.generateDeleteSql(mapping);
		logger.info(id);
		logger.info(sql);
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, sql, clz);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.DELETE).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加executeInsertBySql
	 * @param mapping
	 */
	public void addExecuteInsertBySqlMappedStatement(EntityMapping mapping) {
		String id = this.mappers.get(mapping.getClassName())+".executeInsertBySql";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, "${sql}", Map.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.INSERT).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加executeUpdateBySql
	 * @param mapping
	 */
	public void addExecuteUpdateBySqlMappedStatement(EntityMapping mapping) {
		String id = this.mappers.get(mapping.getClassName())+".executeUpdateBySql";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, "${sql}", Map.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.UPDATE).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加executeDeleteBySql
	 * @param mapping
	 */
	public void addExecuteDeleteBySqlMappedStatement(EntityMapping mapping) {
		String id = this.mappers.get(mapping.getClassName())+".executeDeleteBySql";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, "${sql}", Map.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.DELETE).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加executeQueryOneBySql
	 * @param mapping
	 */
	public void addExecuteQueryOneBySqlMappedStatement(EntityMapping mapping) {
		String id = this.mappers.get(mapping.getClassName())+".executeQueryOneBySql";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		ArrayList<ResultMap> resultMaps = new ArrayList<>();
		//对应xml中的resultSet的id
		resultMaps.add(this.configuration.getResultMap(getResultMapId(mapping.getClassName())));
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, "${sql}", Map.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.SELECT).resultMaps(resultMaps).build();
		this.configuration.addMappedStatement(ms);
	}
	/**
	 * 添加executeQueryListBySql
	 * @param mapping
	 */
	public void addExecuteQueryListBySqlMappedStatement(EntityMapping mapping) {
		String id = this.mappers.get(mapping.getClassName())+".executeQueryListBySql";
		if (this.configuration.hasStatement(id, false)) {
			return;
		}
		ArrayList<ResultMap> resultMaps = new ArrayList<>();
		//对应xml中的resultSet的id
		resultMaps.add(this.configuration.getResultMap(getResultMapId(mapping.getClassName())));
		SqlSource sqlSource = this.languageDriver.createSqlSource(configuration, "${sql}", Map.class);
		MappedStatement ms= new Builder(this.configuration,id,sqlSource,SqlCommandType.SELECT).resultMaps(resultMaps).build();
		this.configuration.addMappedStatement(ms);
	}
	private String getResultMapId(String entityName) {
        return "Base"+entityName.substring(entityName.lastIndexOf(".") + 1)+"ResultMap";
    }
}

package com.demo.common;

import java.util.Date;

/**
 * SQL生成工具
 * @author 陈双
 *
 */
public class SQLHeper {
	/**
	 *  生成insert SQL
	 * @param mapping
	 * @return
	 */
     public static String generateInsertSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("<script>insert into "+mapping.getTable());
    	 sql.append("\r\n");
    	 sql.append("<trim prefix='(' suffix=')' suffixOverrides=',' >");
    	 sql.append("\r\n");
    	 for (int i =0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append("<if test='"+property.getProperty() +"!= null'>");
    		 sql.append("\r\n");
    		 sql.append(property.getColumn());
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    		 sql.append("\r\n");
    		 sql.append("</if>");
    	 }
    	 sql.append("\r\n");
    	 sql.append("</trim>");
    	 sql.append("\r\n");
    	 sql.append("<trim prefix='values (' suffix=')' suffixOverrides=',' >");
    	 sql.append("\r\n");
    	 for (int i =0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append("<if test='"+property.getProperty() +"!= null'>");
    		 sql.append("\r\n");
    		 sql.append("#{");
    		 sql.append(property.getProperty());
    		 sql.append("}");
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    		 sql.append("\r\n");
    		 sql.append("</if>");
    	 }
    	 sql.append("\r\n");
    	 sql.append("</trim></script>");
    	 return sql.toString();
     }
     /**
      * 生成insertList SQL
      * @param mapping
      * @return
      */
     public static String generateInsertListSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("<script>insert into "+mapping.getTable());
    	 sql.append("(");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append(property.getColumn());
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    	 }
    	 sql.append(") values");
    	 sql.append("\r\n");
    	 sql.append("<foreach collection='entityList' item='entity' separator=','>");
    	 sql.append("\r\n");
    	 sql.append("(");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append("\r\n");
    		 sql.append("#{entity.");
    		 sql.append(property.getProperty());
    		 sql.append("}");
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    	 }
    	 sql.append("\r\n");
    	 sql.append(")");
    	 sql.append("\r\n");
    	 sql.append("</foreach></script>");
    	 return sql.toString();
     }
     /**
      * 生成update SQL
      * @param mapping
      * @return
      */
     public static String generateUpdateSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("<script>update ");
    	 sql.append(mapping.getTable());
    	 sql.append("\r\n");
    	 sql.append("<trim suffixOverrides=',' >");
    	 sql.append("\r\n");
    	 sql.append("<set>");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 if (property.getProperty().equals("id")) {
    			 continue;
    		 }
    		 sql.append("\r\n");
    		 sql.append("<if test='"+property.getProperty()+" != null'>");
    		 sql.append("\r\n");
    		 sql.append(property.getColumn());
    		 sql.append("=#{");
    		 sql.append(property.getProperty());
    		 sql.append("}");
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    		 sql.append("\r\n");
			 sql.append("</if>");
    	 }
    	 sql.append("\r\n");
    	 sql.append("</set>");
    	 sql.append("\r\n");
    	 sql.append("</trim>");
    	 sql.append("\r\n");
    	 sql.append("where id_=#{id}</script>");
    	 return sql.toString();
     }
     /**
      * 生成updateByMap SQL
      * @param mapping
      * @return
      */
     public static String generateUpdateByMapSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("<script>update ");
    	 sql.append(mapping.getTable());
    	 sql.append("\r\n");
    	 sql.append("<trim suffixOverrides=',' >");
    	 sql.append("\r\n");
    	 sql.append("<set>");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 if (property.getProperty().equals("id")) {
    			 continue;
    		 }
    		 sql.append("\r\n");
    		 sql.append("<if test='entity."+property.getProperty()+" != null'>");
    		 sql.append("\r\n");
    		 sql.append(property.getColumn());
    		 sql.append("=#{entity.");
    		 sql.append(property.getProperty());
    		 sql.append("}");
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    		 sql.append("\r\n");
			 sql.append("</if>");
    	 }
    	 sql.append("\r\n");
    	 sql.append("</set>");
    	 sql.append("\r\n");
    	 sql.append("</trim>");
    	 sql.append("\r\n");
    	 sql.append("where 1=1 ");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append("\r\n");
    		 if (property.getType().equals(String.class)) {
    			 sql.append("<if test='condition."+property.getProperty()+" != null and condition."+property.getProperty()+" != \"\"'>");
    		 } else {
    			 sql.append("<if test='condition."+property.getProperty()+" != null'>");
    		 }
    		
    		 sql.append("\r\n");
    		 sql.append(" and ");
    		 sql.append(property.getColumn());
    		 sql.append("=#{condition.");
    		 sql.append(property.getProperty());
    		 sql.append("}");
    		 sql.append("\r\n");
			 sql.append("</if>");
    	 }
    	 sql.append("\r\n");
		 sql.append("</script>");
    	 return sql.toString();
     }
     /**
      * 生成getById SQL
      * @param mapping
      * @return
      */
     public static String generateGetByIdSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("select ");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append(property.getColumn());
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    	 }
    	 sql.append(" from ");
    	 sql.append(mapping.getTable());
    	 sql.append(" where id_=#{id}");
    	 return sql.toString();
     }
     /**
      * 生成get SQL
      * @param mapping
      * @return
      */
     public static String generateGetSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("<script>select ");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append(property.getColumn());
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    	 }
    	 sql.append(" from ");
    	 sql.append(mapping.getTable());
    	 sql.append(" where 1=1 ");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append("\r\n");
    		 if (property.getType().equals(String.class)) {
    			 sql.append("<if test='"+property.getProperty()+" != null and "+property.getProperty()+" != \"\"'>");
    		 } else {
    			 sql.append("<if test='"+property.getProperty()+" != null'>");
    		 }
    		 sql.append("\r\n");
    		 sql.append(" and ");
    		 sql.append(property.getColumn());
    		 sql.append("=#{");
    		 sql.append(property.getProperty());
    		 sql.append("}");
    		 sql.append("\r\n");
			 sql.append("</if>");
    	 }
    	 sql.append("\r\n");
    	 sql.append("</script>");
    	 return sql.toString();
     }
     /**
      * 生成getList SQL
      * @param mapping
      * @return
      */
     public static String generateGetListSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("<script>select ");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append(property.getColumn());
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    	 }
    	 sql.append(" from ");
    	 sql.append(mapping.getTable());
    	 sql.append(" where 1=1 ");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append("\r\n");
    		 if (property.getType().equals(String.class)) {
    			 sql.append("<if test='"+property.getProperty()+" != null and "+property.getProperty()+" != \"\"'>");
    		 } else {
    			 sql.append("<if test='"+property.getProperty()+" != null'>");
    		 }
    		 sql.append("\r\n");
    		 sql.append(" and ");
    		 sql.append(property.getColumn());
    		 sql.append("=#{");
    		 sql.append(property.getProperty());
    		 sql.append("}");
    		 sql.append("\r\n");
			 sql.append("</if>");
			 //扩展属性
			 if(property.getType().equals(Date.class)){
				 //开始时间
				 sql.append("\r\n");
				 sql.append("<if test='ov."+property.getProperty()+"Begin != null'>");
				 sql.append("\r\n");
	    		 sql.append(" and date(");
	    		 sql.append(property.getColumn());
	    		 sql.append(")>=date(#{ov.");
	    		 sql.append(property.getProperty());
	    		 sql.append("Begin,jdbcType=TIMESTAMP})");
	    		 sql.append("\r\n");
				 sql.append("</if>");
				 sql.append("\r\n");
				 //结束时间
				 sql.append("<if test='ov."+property.getProperty()+"End != null'>");
				 sql.append("\r\n");
	    		 sql.append(" and date(");
	    		 sql.append(property.getColumn());
	    		 sql.append(")<=date(#{ov.");
	    		 sql.append(property.getProperty());
	    		 sql.append("End,jdbcType=TIMESTAMP})");
	    		 sql.append("\r\n");
				 sql.append("</if>");
    		 }
    	 }
    	 sql.append("\r\n");
    	 sql.append("<if test='sortFields != null'>");
    	 sql.append("\r\n");
    	 sql.append("order by ${sortFields} ${sortType} ");
    	 sql.append("\r\n");
    	 sql.append("</if>");
    	 sql.append("</script>");
    	 return sql.toString();
     }
     public static String generateGetListByIdsSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("<script>select ");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append(property.getColumn());
    		 if (i < mapping.getPropertyMappings().size()-1) {
    			 sql.append(",");
    		 }
    	 }
    	 sql.append(" from ");
    	 sql.append(mapping.getTable());
    	 sql.append(" where id_ in ");
    	 sql.append("\r\n");
    	 sql.append("<foreach item='id' collection='idList' open='(' separator=',' close=')'>");
    	 sql.append("\r\n");
    	 sql.append("#{id}");
    	 sql.append("\r\n");
    	 sql.append("</foreach></script>");
    	 return sql.toString();
     }
     /**
      * 生成getCount SQL
      * @param mapping
      * @return
      */
     public static String generateGetCountSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("<script>select ");
    	 sql.append("count(*)");
    	 sql.append(" from ");
    	 sql.append(mapping.getTable());
    	 sql.append(" where 1=1 ");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append("\r\n");
    		 if (property.getType().equals(String.class)) {
    			 sql.append("<if test='"+property.getProperty()+" != null and "+property.getProperty()+" != \"\"'>");
    		 } else {
    			 sql.append("<if test='"+property.getProperty()+" != null'>");
    		 }
    		 sql.append("\r\n");
    		 sql.append(" and ");
    		 sql.append(property.getColumn());
    		 sql.append("=#{");
    		 sql.append(property.getProperty());
    		 sql.append("}");
    		 sql.append("\r\n");
			 sql.append("</if>");
			 //扩展属性
			 if(property.getType().equals(Date.class)){
				 //开始时间
				 sql.append("\r\n");
				 sql.append("<if test='ov."+property.getProperty()+"Begin != null'>");
				 sql.append("\r\n");
	    		 sql.append(" and date(");
	    		 sql.append(property.getColumn());
	    		 sql.append(")>=date(#{ov.");
	    		 sql.append(property.getProperty());
	    		 sql.append("Begin,jdbcType=TIMESTAMP})");
	    		 sql.append("\r\n");
				 sql.append("</if>");
				 sql.append("\r\n");
				 //结束时间
				 sql.append("<if test='ov."+property.getProperty()+"End != null'>");
				 sql.append("\r\n");
	    		 sql.append(" and date(");
	    		 sql.append(property.getColumn());
	    		 sql.append(")<=date(#{ov.");
	    		 sql.append(property.getProperty());
	    		 sql.append("End,jdbcType=TIMESTAMP})");
	    		 sql.append("\r\n");
				 sql.append("</if>");
    		 }
    	 }
    	 sql.append("\r\n");
    	 sql.append("</script>");
    	 return sql.toString();
     }
     /**
      * 生成 deleteById SQL
      * @param mapping
      * @return
      */
     public static String generateDeleteByIdSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("delete from ");
    	 sql.append(mapping.getTable());
    	 sql.append(" where id_=#{id}");
    	 return sql.toString();
     }
     /**
      * 生成delete SQL
      * @param mapping
      * @return
      */
     public static String generateDeleteSql(EntityMapping mapping) {
    	 StringBuffer sql = new StringBuffer("<script>delete from ");
    	 sql.append(mapping.getTable());
    	 sql.append(" where 1=1 ");
    	 for (int i=0;i<mapping.getPropertyMappings().size();i++) {
    		 PropertyMapping property = mapping.getPropertyMappings().get(i);
    		 sql.append("\r\n");
    		 if (property.getType().equals(String.class)) {
    			 sql.append("<if test='"+property.getProperty()+" != null and "+property.getProperty()+" != \"\"'>");
    		 }else {
    			 sql.append("<if test='"+property.getProperty()+" != null'>");
    		 }
    		 sql.append("\r\n");
    		 sql.append(" and ");
    		 sql.append(property.getColumn());
    		 sql.append("=#{");
    		 sql.append(property.getProperty());
    		 sql.append("}");
    		 sql.append("\r\n");
			 sql.append("</if>");
    	 }
    	 sql.append("\r\n");
    	 sql.append("</script>");
    	 return sql.toString();
     }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值