在上一节SQL 语句中加入了一个条件“1=1”,如果没有加入这个条件,那么可能就会变成下面这样一条错误的语句。
SELECT id,name,url,age,country FROM website AND name LIKE CONCAT('%',#{name},'%')
显然以上语句会出现 SQL 语法异常,但加入“1=1”这样的条件又非常奇怪,所以 MyBatis 提供了 where 标签。
where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件,语法如下
- <where>
- <if test="判断条件">
- AND/OR ...
- if>
- where>
if 语句中判断条件为 true 时,where 关键字才会加入到组装的 SQL 里面,否则就不加入。where 会检索语句,它会将 where 后的第一个 SQL 条件语句的 AND 或者 OR 关键词去掉。
- <select id="selectWebsite" resultType="net.cc.po.Website">
- select id,name,url from website
- <where>
- <if test="name != null">
- AND name like #{name}
- if>
- <if test="url!= null">
- AND url like #{url}
- if>
- where>
- select>
测试
- public class Test {
- public static void main(String[] args) throws IOException {
- // 读取配置文件mybatis-config.xml
- InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建
- SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
- // 通过SqlSessionFactory创建SqlSession
- SqlSession ss = ssf.openSession();
- Website site = new Website();
- site.setname("编程");
- List
siteList = ss.selectList("net.cc.mapper.WebsiteMapper.selectWebsite", site); - for (Website ws : siteList) {
- System.out.println(ws);
- }
- }
- }
在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。
- "1.0" encoding="UTF-8"?>
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="net.cc.mapper.WebsiteMapper">
- <select id="selectWebsite" resultType="net.cc.po.Website">
- SELECT * FROM website
- <where>
- <if test="id!=null and id!=''">
- id=#{id}
- if>
- where>
- select>
-
- <update id="updateWebsite"
- parameterType="net.cc.po.Website">
- UPDATE website
- <set>
- <if test="name!=null">name=#{name}if>
- <if test="url!=null">url=#{url}if>
- set>
- WHERE id=#{id}
- update>
- mapper>
测试
- public class Test {
- public static void main(String[] args) throws IOException {
- InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
- SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
- SqlSession ss = ssf.openSession();
- Website site = new Website();
- site.setId(1);
- site.setUrl("www.cc.net");
- // 执行update语句前
- List
siteList = ss.getMapper(WebsiteMapper.class).selectWebsite(site); - for (Website st : siteList) {
- System.out.println(st);
- }
- int num = ss.getMapper(WebsiteMapper.class).updateWebsite(site);
- System.out.println("影响数据库行数" + num);
- // 执行update语句后
- List
siteList2 = ss.getMapper(WebsiteMapper.class).selectWebsite(site); - for (Website st : siteList2) {
- System.out.println(st);
- }
- ss.commit();
- ss.close();
- }
- }
对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代。
Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。语法格式如下。
- <foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">
- 参数值
- foreach>
foreach 标签主要有以下属性,说明如下。
(
开始)。,
作为分隔符)。)
开始)。
使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:
- <select id="selectWebsite"
- parameterType="net.cc.po.Website"
- resultType="net.biancheng.po.Website">
- SELECT id,name,url,age,country
- FROM website WHERE age in
- <foreach item="age" index="index" collection="list" open="("
- separator="," close=")">
- #{age}
- foreach>
- select>
测试
- public class Test {
- public static void main(String[] args) throws IOException {
- // 读取配置文件mybatis-config.xml
- InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建
- SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
- // 通过SqlSessionFactory创建SqlSession
- SqlSession ss = ssf.openSession();
- List
ageList = new ArrayList(); - ageList.add(10);
- ageList.add(12);
- List
siteList = ss.selectList("net.cc.mapper.WebsiteMapper.selectWebsite", ageList); - for (Website ws : siteList) {
- System.out.println(ws);
- }
- }
- }
在使用 foreach 标签时,应提前预估一下 collection 对象的长度。因为大量数据的 in 语句会影响性能,且还有一些数据库会限制执行的 SQL 语句长度。