佞言者,谄而于忠;谀言者,博而于智

文章目录

  • 前言
  • 一、动态sql
    • 1.1sql标签:
    • 1.2 include标签:
    • 1.3. if标签:进行条件判断
    • 1.4. where标签:进行多条件拼接,在查询,删除,更新中使用
    • 1.5. set标签:
    • 1.6. foreach标签:
  • 二、指定参数下标位置查询
  • 三、入参是Map
  • 四、返回值是map
  • 总结

前言

mybatis内容扩展的真多…


一、动态sql

可以定义代码片段,可以进行逻辑判断,可以进行循环处理(批量处理)
使条件判断更为简单

1.1sql标签:

用来定义代码片段,可以将所有的列名,或复杂的条件定义为代码片段,供使用时调用

    <!--    定义代码片段--><sql id="allColumns">id,username,birthday,sex,address</sql>

1.2 include标签:

用来引用sql标签定义的代码片段

    <select id="getById" parameterType="int" resultType="users">select <include refid="allColumns"></include>from userswhere id=#{id}</select>

1.3. if标签:进行条件判断

1.4. where标签:进行多条件拼接,在查询,删除,更新中使用

<select id="getByCondition" parameterType="users" resultType="users">select <include refid="allColumns"></include>from users<where><if test="userName != null and userName != ''">and username like concat('%',#{userName},'%')</if><if test="birthday != null">and birthday = #{birthday}</if><if test="sex != null and sex != ''">and sex = #{sex}</if><if test="address != null and address != ''">and address like concat('%',#{address},'%')</if></where></select>

用where if标签可以动态的进行模糊查询,如下:

    @Testpublic void testGetByCondition() throws ParseException {Users u = new Users();u.setSex("1");u.setUserName("小");u.setAddress("市");//u.setBirthday(sf.parse("2001-01-01"));List<Users> list = usersMapper.getByCondition(u);list.forEach(users -> System.out.println(users));}

1.5. set标签:

有选择的进行更新处理,至少更新一列
没有给值的情况,保持不变,但是至少更新一列
实例:

<update id="updateBySet" parameterType="users">update users<set><if test="userName != null and userName!=''">username = #{userName},</if><if test="birthday !=null">birthday = #{birthday},</if><if test="sex != null and sex != ''">sex = #{sex},</if><if test="address != null and address != ''">address = #{address},</if></set>where id = #{id}</update>

1.6. foreach标签:

用来进行循环遍历,完成循环条件查询,批量删除,批量增加,批量更新
例如:

    <!--//查询指定多个id的用户信息List<Users> getByIds(Integer []arr);<foreach>中的collection是类型item是名称separator属性是分隔符--><select id="getByIds" resultType="users">select <include refid="allColumns"></include>from userswhere id in<foreach collection="array" item="id" separator="," open="(" close=")">#{id}</foreach></select>

参数:
collection:用来指定入参的类型,如果是List集合,则为list,如果是Map集合,则为map,如果是数组,则为array(最常见的三类型).
item:每次循环遍历出来的值或对象
separator:多个对象或对象或语句之间的分隔符
open:整个循环外的前括号
close:整个循环外的后括号

二、指定参数下标位置查询

如果入参是多个,可以通过指定参数位置进行传参,是实体类包含不住的条件。实体类只能封装住成员变量的条件。如果某个成员变量要有区间范围内的判断,或者有两个值进行处理,则实体类包不住。

例如:查询指定日期范围内的用户信息(也可以用@Param)

    <!--//查询指定日期范围内的用户List<Users> getByBirthday(Date begin,Date end);--><select id="getByBirthday" resultType="users">select <include refid="allColumns"></include>from userswhere birthday between #{arg0} and #{arg1}</select>

arg0是第一个参数,arg1是第二个参数
此法中arg0和1是系统设定的参数名
而在@Param中相当于是自定义参数名

三、入参是Map

如果入参超过一个以上,使用map封装查询条件(KV)
更有语义,查询条件更明确

如下:

    <!--//入参是map(实体类无法封装所有查询条件)List<Users> getByMap(Map map);#{birthdayBegin}:就是map中的key--><select id="getByMap" resultType="users">select <include refid="allColumns"></include>from userswhere birthday between #{birthdayBegin} and #{birthdayEnd}</select>

测试类:

    @Testpublic void testGetByMap() throws ParseException {Date begin = sf.parse("1999-01-01");Date end = sf.parse("1999-12-31");Map map = new HashMap<>();map.put("birthdayBegin",begin);map.put("birthdayEnd",end);List<Users> list = usersMapper.getByMap(map);list.forEach(users -> System.out.println(users));}

四、返回值是map

如果返回的数据实体类无法包含,可以使用map返回多张表中的若干数据
返回这些数据之间没有任何关系。就是Object类型,返回的map的key就是列名或别名
如下:

    <!--//返回值是map(一行)Map getReturnMap(Integer id);--><select id="getReturnMap" parameterType="int" resultType="map">select username name,address afrom userswhere id = #{id}</select><!--//返回多行的mapList<Map> getMulMap();--><select id="getMulMap" resultType="map">select username,addressfrom users</select>

测试如下:

    @Testpublic void testReturnMap(){Map map = usersMapper.getReturnMap(3);System.out.println(map);System.out.println(map.get("username"));}@Testpublic void testReturnMapMul(){List<Map> list = usersMapper.getMulMap();list.forEach(map -> System.out.println(map));}

总结

mybatis的配置标签动态用法
看看代码就行
都有注解

MyBatis扩展之动态sql相关推荐

  1. Mybatis入门之动态sql

    Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...

  2. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

  3. Java - MyBatis中的动态SQL是什么意思?

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 对于一些复杂的查询,我们可能会指定多个查询条件,但是 ...

  4. mybatis注解开发动态sql

    mybatis注解开发动态sql 本篇来讲一下如何使用mybatis注解模式中的动态sql 先来讲一下什么是动态sql 在我们实际开发的时候可能会出现很多方法需要一条很相似的sql语句来进行增删改查, ...

  5. Mybatis 注解开发 + 动态SQL

    Hello 大家好我是橙子同学,今天分享注解Mybatis注解开发+动态sql 目录 每文一铺垫(今天有小插曲哦) 注解开发 添加 @Insert 删除 @Delete 查询 @Select 修改 @ ...

  6. 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)

    视频地址:http://edu.51cto.com/sd/be679 动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的 ...

  7. mybatis学习(39):动态sql片段

    目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; im ...

  8. mybatis学习(33):动态sql if

    目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; im ...

  9. Mybatis中的动态SQL,一对一,一对多以及标签

    文章目录 动态SQL中的结果集映射 一对一 一对多 where标签 where..if...标签(作用和Java中的if一样,只要满足if条件的都可以拼接) where..choose..标签(作用和 ...

最新文章

  1. c 语言如何处理表格文件中的数据库,C#程序从Excel表格中读取数据并进行处理
  2. 爬虫实战:爬虫加数据分析,重庆电气小哥一文带你分析重庆所有旅游景点
  3. boost::connected_components用法的测试程序
  4. 5行代码解决——L1-042 日期格式化 (5分)
  5. ubuntu下安装jdk、tomcat、mysql
  6. 计算机编程要哪方面天赋,编程要哪门子天赋
  7. [c++基本语法]——构造函数初始化列表
  8. ssd内部是多个flash一起操作_一键自毁军工级SSD固态硬盘的技术亮点
  9. Linux基本操作——Linux磁盘基本概念
  10. 爬虫爬评书吧_python scrapy+Mongodb爬取蜻蜓FM,酷我及懒人听书
  11. SpringBoot整合(Elasticserch)
  12. EMNLP杰出论文 | 当注意力遇到RNN,五倍以上训练加速!
  13. 以太网转串口方案总结
  14. 要重复多少次变成潜意识_从骨子里的改变-潜意识的力量!
  15. 网课笔记 ☀ 经济学原理课后习题及答案
  16. Matlab读取股票数据
  17. 【渝粤教育】国家开放大学2019年春季 2444酒店管理概论 参考试题
  18. java 飞机 源码_Java 飞机游戏源码(带音乐)
  19. 【python学习】如何将字典添加到字典
  20. 外接u盘/硬盘安装CentOS(linux)的步骤(含双系统)

热门文章

  1. DD云服务器系统,ION云服务器 – 一键dd 安装Win7系统且设置网络连接
  2. openlayers鼠标经过指定图层箭头变成手势
  3. 导图解房(02-01)购房资格与首付贷款解读-北京
  4. 【51汇编示例】 51汇编实现冒泡法;
  5. 在 Kubernetes 中部署高可用 Harbor 镜像仓库
  6. DJ混音软件DJ Mixer Pro常见问题
  7. python绘制柱状图/对比图
  8. cstringw转lpctstr_LPCTSTR和CString的关系
  9. java 插件程序开发框架-jpf
  10. 永恒之塔linux服务端,最新永恒之塔单机版7.8 德国最新服务端,内附大量图片教程...