mapper接口:前端
package com.zkbc.core.dao.map; import com.zkbc.core.dao.model.AuditLog; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.SelectProvider; import java.util.List; /** * @Description: 用戶審計數據處理 * @Author: yh * @CreateDate: 2018/5/3 11:37 * @UpdateUser: yh.z * @UpdateDate: 2018/5/3 11:37 * @UpdateRemark: The modified content * @Version: 1.0 */ public interface AuditLogMapper { @Insert("insert into audit_log(userId,userName,ip,startTime,endTime,module,function,clazz,method,result,useTime,createTime) values(#{userId},#{userName},#{ip},#{startTime},#{endTime},#{module},#{function},#{clazz},#{method},#{result},#{useTime},now())") @Options(useGeneratedKeys = true, keyProperty = "id") int addAuditLog(AuditLog auditLog); @SelectProvider(type = AuditLogProvider.class,method = "getAuditsByCondition") List<AuditLog> getAuditsByCondition(@Param("userId") Long userId, @Param("userName") String userName,@Param("startTime") String startTime, @Param("endTime")String endTime,@Param("startRow") Long startRow,@Param("limit") Integer limit); @SelectProvider(type = AuditLogProvider.class,method = "getCountByCondition") Long getCountByCondition(@Param("userId") Long userId, @Param("userName") String userName, @Param("startTime") String startTime, @Param("endTime") String endTime); }
其中add方法就是一個普通的插入sql,這裏是固定的,插入的value取自AuditLog對象的屬性。java
可是下面的條件查詢(包含分頁),會根據前端是否提供對應的查詢條件來動態的生成sql,使用@Select標籤就不能直接知足了,這裏使用了@SelectProvider標籤,裏面有兩個屬性,一個是sql提供者的類型,另外一個是提供者的方法。sql
SQL提供者apache
AuditLogProvider :app
package com.zkbc.core.dao.map; import java.text.SimpleDateFormat; import java.util.Map; /** * @Description: Description * @Author: 張穎輝(yh) * @CreateDate: 2018/5/7 18:16 * @UpdateUser: 張穎輝(yh) * @UpdateDate: 2018/5/7 18:16 * @UpdateRemark: The modified content * @Version: 1.0 */ public class AuditLogProvider { /** * @Description: 根據條件得到集合,按照時間倒序 * @Author: 張穎輝(yh) * @Date: 2018/5/8 10:56 * @param: * @return: * @Version: 1.0 */ public String getAuditsByCondition(Map<String, Object> para) { String sql = "select * from audit_log " + " where 1 = 1 "; sql += getCondition(para); sql += " order by createTime desc "; if (hasPara(para, "startRow") && hasPara(para, "limit")) { sql += " LIMIT " + para.get("startRow") + "," + para.get("limit"); } System.out.println("sql=" + sql); return sql; } /** * @Description: 根據條件得到總數 * @Author: 張穎輝(yh) * @Date: 2018/5/8 10:56 * @param: * @return: * @Version: 1.0 */ public String getCountByCondition(Map<String, Object> para) { String sql = "select count(1) from audit_log " + " where 1 = 1 "; sql += getCondition(para); System.out.println("sql=" + sql); return sql; } /** * @Description: 條件 * @Author: 張穎輝(yh) * @Date: 2018/5/8 10:55 * @param: [para] * @return: java.lang.String * @Version: 1.0 */ private String getCondition(Map<String, Object> para) { String condition = " "; // SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (hasPara(para, "userId")) { condition += " and userId=" + para.get("userId"); } if (hasPara(para, "userName")) { condition += " and userName like '" + para.get("userName") + "'"; } if (hasPara(para, "startTime")) { //condition += " and createTime>='" + sf.format(para.get("startTime"))+"' "; condition += " and createTime>='" + para.get("startTime") + "' "; } if (hasPara(para, "endTime")) { //condition += " and createTime<='" +sf.format(para.get("endTime"))+"' " ; condition += " and createTime<='" + para.get("endTime") + "' "; } return condition; } /** * @Description: map包含該key,而且value不爲null * @Author: 張穎輝(yh) * @Date: 2018/5/8 11:23 * @param: [para, key] * @return: boolean * @Version: 1.0 */ private boolean hasPara(Map<String, Object> para, String key) { if (para.containsKey(key) && para.get(key) != null) return true; return false; } }
上面的代碼中能夠看出,全部提供者的方法要求是做用域是public,返回的是String字符串類型,這裏使用的動態方法(彷佛靜態方法也能夠),參數是一個Map<String, Object>,根據判斷是否包含該條件參數,來動態的拼接Sql並返回,其中Map的key就是Mapper接口中方法的參數前註解@Param("userId")中的值。ide