Mybatis的Mapper文件中用注解方式写动态Sql语句演示

随笔 专栏收录该内容
20 篇文章 0 订阅

引言

正如我们所知在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) &lt;= #{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) &lt;= #{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;
 */
  • 4
    点赞
  • 5
    评论
  • 23
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值