package com.allinpay.its.boss.framework.repository.mybatis.utils; 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.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.util.List; import com.allinpay.its.boss.framework.repository.mybatis.model.MyBatisBaseModel; import com.allinpay.its.boss.framework.repository.mybatis.model.WhereColumnModel; import com.allinpay.its.boss.framework.repository.mybatis.pagination.DataBaseDialect; import com.allinpay.its.boss.framework.repository.mybatis.pagination.dialect.DB2Dialect; import com.allinpay.its.boss.framework.repository.mybatis.pagination.dialect.MySqlDialect; import com.allinpay.its.boss.framework.repository.mybatis.pagination.dialect.OracleDialect; import org.apache.commons.lang.StringUtils; import org.apache.struts2.ServletActionContext; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.support.WebApplicationContextUtils; /** * 包含增加,更新,删除方法的Mybatis模版工具类 * * @author YM * * @param <T> */ @Transactional public class CRUDTemplate<T extends MyBatisBaseModel> { protected static Logger log = LoggerFactory.getLogger(CRUDTemplate.class); public static String DB_NAME = ""; public SqlSessionTemplate sqlSession; /** * 增加对象方法 * * @param obj * @return */ public String insert(T obj) { BEGIN(); // INSERT_INTO(obj.getTableName()); obj.caculationColumnList(); // 如果有主键则需要指定序列自动增加主键值 if (StringUtils.isNotBlank(obj.getPrimaryKey()) && StringUtils.isNotBlank(obj.getSequenceName())) { VALUES(obj.getPrimaryKey(), obj.getSequenceName() + ".nextval"); } VALUES(obj.returnInsertColumnsName(), obj.returnInsertColumnsDefine()); return SQL(); } /** * 根据主键更新对象方法 * * @param obj * @return */ public String update(T obj) { String idname = obj.getPrimaryKey(); BEGIN(); // UPDATE(obj.getTableName()); obj.caculationColumnList(); SET(obj.returnUpdateSet()); WHERE(idname + "=#{" + idname + "}"); return SQL(); } /** * 根据主键删除对象的方法 * * @param obj * @return */ public String delete(T obj) { String idname = obj.getPrimaryKey(); BEGIN(); // DELETE_FROM(obj.getTableName()); WHERE(idname + "=#{" + idname + "}"); return SQL(); } /** * 通用查询语句 * * @param obj * @return */ public String select(T obj) { BEGIN(); SELECT(" * "); // FROM(obj.getTableName()); String whereSQLInfo = getWhereInfos(obj); if (StringUtils.isNotBlank(whereSQLInfo)) { WHERE(whereSQLInfo); } return SQL(); } /** * 统计行数 * * @param obj * @return */ public String count(T obj) { BEGIN(); SELECT("count(*)"); // FROM(obj.getTableName()); String whereSQLInfo = getWhereInfos(obj); if (StringUtils.isNotBlank(whereSQLInfo)) { WHERE(whereSQLInfo); } return SQL(); } /** * 获取where条件语句 * * @param obj * @return */ public String getWhereInfos(T obj) { StringBuffer sb = null; List<WhereColumnModel> whereColumns = obj .getWhereColumnsNameValueType(); if (whereColumns != null && whereColumns.size() > 0) { sb = new StringBuffer(""); for (int i = 0; i < whereColumns.size(); i++) { String v_name = whereColumns.get(i).getName(); sb.append(v_name + "=#{" + v_name + "}"); if (i != whereColumns.size() - 1) { sb.append(" and "); // 这里先用and条件后续可以拓展通过注解方式灵活配置 } } return sb.toString(); } else { return null; } } /** * 这是对Mybatis注解查询的一个简单扩展,目前只支持简单类型的属性,建议直接通过xml进行配置sql * @param obj * @return */ public String pageSelect(T obj) { // String sql = select(obj).trim(); // SqlSession sqlSession; String sql=""; try { /** * 这里直接取spring管理的sqlSession有很多方式取,其他方式我都用了.老取得为空,因此这里暂时这样来取,后续待优化 * 这里是取xml中对应id的最终执行sql语句 */ sqlSession=(SqlSessionTemplate) WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext()).getBean("sqlSession"); // sql = MyBatisSQLUtil.getMyBatisSql4POJO(obj.getPageSqlIdName(), obj, sqlSession.getSqlSessionFactory()).toString(); // sql = sqlSession.getConfiguration().getMappedStatement(obj.getPageSqlIdName()).getBoundSql(obj).getSql(); } catch (Exception e) { System.out.println("----Mybatis配置文件中获取sql语句出错---"); if(log.isDebugEnabled()){ log.debug(e.getMessage()); } e.printStackTrace(); } DataBaseDialect dataBaseDialect = null; DataBaseDialect.Type databaseType = null; databaseType = DataBaseDialect.Type.valueOf(DB_NAME); String page_sql = ""; int limit = obj.getNumPerPage(); int start = obj.getPageNum(); // 默认情况下每页显示15条 if (limit == 0) { limit = 15; } switch (databaseType) { case ORACLE: dataBaseDialect = new OracleDialect(); page_sql = dataBaseDialect.getPageSelectSQL(sql, start, limit); break; case MYSQL:// 需要实现MySQL的分页逻辑 dataBaseDialect = new MySqlDialect(); page_sql = dataBaseDialect.getPageSelectSQL(sql, start, limit); break; case DB2:// 需要实现DB2的分页逻辑 dataBaseDialect = new DB2Dialect(); page_sql = dataBaseDialect.getPageSelectSQL(sql, start, limit); break; } return page_sql; } }