个人理解:

where if就相当于正常的java中的if 语句,如果有多个条件组合判断的话用 and, or连接

而where choose when otherwise

choose就好像是switch,when相当于case,可以有一种属性的对个判断,但不能同时去判断多个属性. 同时,只要有一个when满足,则break

otherwise就好像是default,如果前面的when都不满足,则进入otherwise

1.动态sql where if

传递参数为实体类user,if内的userName是user的属性 username=#{userName} 中的username是数据库表中的字段, #{userName}是实体类user中的.

 <select id="findByCondition" parameterType="user"  resultType="user">
select * from user
<!-- 这里的userName 对应的也是实体类中的属性-->
<!-- test里面的属性基本都来自于parameterType中的,如这里的userName,是实体类user中的属性-->
<where>
<if test="userName!=null">
username=#{userName}
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
</where>
</select> @Test
public void testFindByCondition() throws Exception{
User user=new User();
user.setUserName("xxx");
user.setGender("男");
List<User> list = userDao.findByCondition(user);
for (User user1:list)
{
System.out.println(user1);
}
}

2.同时,if中可以由多个条件的拼接,如这里的ids !=null and ids.size()>0 或者是ids !=null and user!=null 这样的多个条件的拼接.

<!--多个id,新建实体类,传入id集合,并用foreach标签遍历ids-->
<select id="findByIds" parameterType="vo" resultType="user">
select * from user
<!-- 这里的userName 对应的也是实体类中的属性-->
<where>
<!--这里的ids 是vo里面的属性. -->
<if test="ids !=null and ids.size()>0">
<!--这里的item对应的是user里面的属性字段-->
<foreach collection="ids" open=" uid in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select> @Test
public void testFindByIds() throws Exception{
Vo vo=new Vo();
List<Integer> list=new ArrayList<>();
list.add(2);
list.add(5);
list.add(7);
vo.setIds(list);
List<User> users = userDao.findByIds(vo);
for (User user:users)
{
System.out.println(user);
}
}

3.但是如果是where choose when otherwise 的时候,切记不能使用不同属性条件的拼接,如 a1 and b2 这样是不可以的, 但是可以 a!=null and a==1 这样,对同一个属性进行不同的判断

 <select id="findByChoose" resultType="user" parameterType="user">
select * from user
<where>
<choose>
<!-- 这里test为双引号,则代表里面应该是字符串,而'男' 会默认为字符.所以gender=='男' 会出现不匹配错误,所以这里需要toString() -->
<when test=" gender!='女'.toString() and gender=='男'.toString()">
age=22
</when>
<!--这里写成单引号,内部可以使用双引号-->
<!-- <when test=' gender=="男" '>
age=22
</when>-->
<otherwise>
age=23
</otherwise>
</choose>
</where>
</select> @Test
public void testFindByChoose() throws Exception{
User user=new User();
user.setUserName("aaa");
user.setGender("男");
user.setAge(22);
List<User> users= userDao.findByChoose(user);
for (User user1:users){
System.out.println(user1);
}
}

mybatis 基础(二) 动态sql 关于where if / where choose when otherwise的更多相关文章

  1. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  2. Mybatis入门之动态sql

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

  3. mybatis 详解------动态SQL

    mybatis 详解------动态SQL   目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...

  4. mybatis中的动态SQL

    在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...

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

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

  6. mybatis入门基础(五)----动态SQL

    一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...

  7. 框架应用:Mybatis(二) - 动态SQL

    MybatisUtil工具类 在实际开发中,我们可以编写一个MybatisUtil辅助类来进行对进行操作. 1)在静态初始化块中加载mybatis配置文件和StudentMapper.xml文件一次 ...

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

    动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的拼接和组装.可以简单的说成Mybatis中可以动态去的判断需不需要某些 ...

  9. mybatis框架(5)---动态sql

    那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态S ...

随机推荐

  1. java中MD5函数

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5U ...

  2. [心得]暑假DAY1 | 7-7考试总结

    呼.. 正式开始暑假集训. 今天一上午还在搞7-7的考试改题 然而,该来该去,TLE48过不去了 不知道哪的问题,loj上1w3ms(卡常都没能救得了) 至于T1和T3,简单总结一下算了 排序 感觉很 ...

  3. 20175215 2018-2019-2 第九周java课程学习总结

    第十一章 JDBC与MySQL数据库 11.1 MySQL数据库管理系统 下载安装过程略 使用的是MySQL 5.6而非5.7 11.2 启动MySQL数据库服务器 启动和root用户过程略 11.3 ...

  4. javascript 取小数点后几位四种方法

    javascript 取小数点后几位方法总结 Javascript取float型小数点后两位,例22.123456取成22.12,如何做? 1.通过substring截取. function getn ...

  5. Nexus3.x帐号权限配置

    一.使用admin登录后,点击上方齿轮图标 二.打开左侧导航,Security Privileges:具体的权限明细,比如我创建一个test仓库,这里就会生成 Roles:添加角色,设置每个角色可看到 ...

  6. JspFragment.invoke方法

    JspFragment.invoke方法可以说是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容.是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出. 例如 ...

  7. flutter Oops; flutter has exited unexpectedly

    使用模拟器时执行flutter run 报出下面一大堆错误 注意只有模拟器有这种问题,真机可以正常运行 Oops; flutter has exited unexpectedly. Sending c ...

  8. Sass简单使用

    Sass是成熟.稳定.强大的CSS预处理器,而SCSS是Sass3版本当中引入的新语法特性,完全兼容CSS3的同时继承了Sass强大的动态功能. 特性概览 CSS书写代码规模较大的Web应用时,容易造 ...

  9. ubuntu搭建ssh服务

    本人在ubuntu16.4.4.0-13下测试 #man uname//用于打印系统信息 sudo apt install update sudo apt install openssh-server ...

  10. 使用robotframework做接口测试三——保持登录状态

    调用登录接口登录了,其他的接口怎么保持登录状态呢?  首先来看一看,web端或者说客户端是怎么样用cookie/token等保持登录状态的.一般来说,cookie都会在登录接口由服务端返回,而且会是在 ...