引言
正如我们所知在mapper文件中用注解的方式写一些普通的查询,删除sql语句格式都相对简单,而且一般我们如果有动态sql需要的话,可以采用把sql写在xml文件,然后根据Mapper内方法id进行匹配,实现我们复杂的查询或者循环添加等操作。
但是,本人经历过公司同意要求把sql用注解的方式进行编写,当中不乏一些动态sql的编写,在此做个小总结,希望对大家有帮助。
首先如果注解写动态sql的话会用到<script> </scrpit>标签 ! 大家切记 !
代码展示
多条件查询以及分页低配版(返回List集合)
@Select({"<script> SELECT * FROM user WHERE " +
"<if test= "mobile != null and mobile != ''"> mobile = #{mobile} </if>" +
"<if test= "star != null and star != ''"> AND star=#{star} </if>" +
"<if test ='startTime != null '> AND UNIX_TIMESTAMP(update_time) >= #{startTime} </if>" +
"<if test ='endTime != null '> AND UNIX_TIMESTAMP(update_time) <= #{endTime} </if>" +
"<if test="count > 0"> LIMIT #{offset}, #{count} </if> </script>"})
//参数是对象,携带多参数进行模糊分页查询
List<User> getUserList(Request request);
/**
* request对象携带mobile(电话String),star(分数Byte),startTime(开始时间Long),endTime(结束时间Long),offset(分页参数,偏移量int),count(分页参数,每页返回数据条数)
* 因为前台传参时startTime和endTime是Long类型参数,所以sql查询是用UNIX_TIMESTAMP()函数处理表内数据使其变为时间戳类型,以此来方便两者比较
*/
多条件查询以及分页升级版(返回List集合)
//把条件语句单独提出来,方便其他语句使用,比如查询数据集合信息,查询数据条数的sql语句
String QUERY_CODE_SQL = "<if test= \"mobile != null and mobile != ''\"> mobile = #{mobile} </if> " +
"<if test= \"star != null and star != ''\"> AND star=#{star} </if>" +
"<if test ='startTime != null '> AND UNIX_TIMESTAMP(update_time) >= #{startTime} </if>" +
"<if test ='endTime != null '> AND UNIX_TIMESTAMP(update_time) <= #{endTime} </if>" +
"<if test=\"count > 0\"> LIMIT #{offset}, #{count} </if>";
@Select({"<script> SELECT * FROM user WHERE" + QUERY_CODE_SQL + " </script>"})
//参数是对象,携带多参数进行模糊分页查询集合信息
List<User> getUserList(Request request);
@Select({"<script> SELECT COUNT(*) FROM user WHERE" + QUERY_CODE_SQL + " </script>"})
//参数是对象,携带多参数进行模糊查询数据条数
List<User> getUserList(Request request);
根据某条件循环查询相关信息(返回List集合)
@Select({"<script> ",
"SELECT * FROM user ",
"WHERE id IN ",
"<foreach collection = 'userIds' separator = ',' open = '(' close = ')' item = 'id'> ",
"#{id} ",
"</foreach> ",
"</script>"})
List<User> getUserListByUserIds(@Param("userIds") Set<Long> userIdSet);
/**
* 参数为Set集合,集合内携带条件(多个用户的id==userIds)
* collection :collection属性的值有三个分别是List、Array、Map三种,分别对应的参数类型为:List、数组、map集合,我在上面传的参数为Set集合(set内没有重复数据,比List集合实用,避免反复查询),所以值为别名userIds,参数没有别名的话此处用collection;
* item : 表示在迭代过程中每一个元素的别名
* #{参数} 中的参数名和item别名相对应 #{id} <==> item = 'id'
* open :前缀
* close :后缀
*/
根据某条件循环查询相关信息(返回Map集合)
@Select("<script>" +
"SELECT * FROM user_info WHERE" +
" fellow_id=#{fellow_id} " +
" AND user_id IN " +
"<foreach collection = 'user_ids' separator = ',' open = '(' close = ')' item = 'user_id'>" +
" #{user_id}" +
"</foreach>" +
"</script>")
@MapKey("userId")
Map<String, CalendarTask> getCalendarTaskMap(
@Param("fellow_id") Long fellowId,
@Param("user_ids") List<Long> userIds);
/**
* 参数1是fellowId;参数2是List集合,集合内携带条件(多个用户的user_id==userIds);
* @MapKey()注解,我理解的是规定Map集合的key,本map的key就是每一个userId,所以参数是该sql语句查询结果(*查询出的数据有userId字段)的每条数据中的字段值==>userId;
*/
版权声明:本文为qq_21194601原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。