• MyBatis (where、set、foreach)标签


    where标签

     在上一节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 条件,语法如下

    1. <where>
    2. <if test="判断条件">
    3. AND/OR ...
    4. if>
    5. where>

    if 语句中判断条件为 true 时,where 关键字才会加入到组装的 SQL 里面,否则就不加入。where 会检索语句,它会将 where 后的第一个 SQL 条件语句的 AND 或者 OR 关键词去掉。

    示例:

    1. <select id="selectWebsite" resultType="net.cc.po.Website">
    2. select id,name,url from website
    3. <where>
    4. <if test="name != null">
    5. AND name like #{name}
    6. if>
    7. <if test="url!= null">
    8. AND url like #{url}
    9. if>
    10. where>
    11. select>

    测试

    1. public class Test {
    2. public static void main(String[] args) throws IOException {
    3. // 读取配置文件mybatis-config.xml
    4. InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建
    5. SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
    6. // 通过SqlSessionFactory创建SqlSession
    7. SqlSession ss = ssf.openSession();
    8. Website site = new Website();
    9. site.setname("编程");
    10. List siteList = ss.selectList("net.cc.mapper.WebsiteMapper.selectWebsite", site);
    11. for (Website ws : siteList) {
    12. System.out.println(ws);
    13. }
    14. }
    15. }

    set标签

    Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。

    示例:

    1. "1.0" encoding="UTF-8"?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="net.cc.mapper.WebsiteMapper">
    6. <select id="selectWebsite" resultType="net.cc.po.Website">
    7. SELECT * FROM website
    8. <where>
    9. <if test="id!=null and id!=''">
    10. id=#{id}
    11. if>
    12. where>
    13. select>
    14. <update id="updateWebsite"
    15. parameterType="net.cc.po.Website">
    16. UPDATE website
    17. <set>
    18. <if test="name!=null">name=#{name}if>
    19. <if test="url!=null">url=#{url}if>
    20. set>
    21. WHERE id=#{id}
    22. update>
    23. mapper>

    测试

    1. public class Test {
    2. public static void main(String[] args) throws IOException {
    3. InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
    4. SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
    5. SqlSession ss = ssf.openSession();
    6. Website site = new Website();
    7. site.setId(1);
    8. site.setUrl("www.cc.net");
    9. // 执行update语句前
    10. List siteList = ss.getMapper(WebsiteMapper.class).selectWebsite(site);
    11. for (Website st : siteList) {
    12. System.out.println(st);
    13. }
    14. int num = ss.getMapper(WebsiteMapper.class).updateWebsite(site);
    15. System.out.println("影响数据库行数" + num);
    16. // 执行update语句后
    17. List siteList2 = ss.getMapper(WebsiteMapper.class).selectWebsite(site);
    18. for (Website st : siteList2) {
    19. System.out.println(st);
    20. }
    21. ss.commit();
    22. ss.close();
    23. }
    24. }

    foreach标签

    对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代。 

    Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。语法格式如下。

    1. <foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">
    2. 参数值
    3. foreach>

    foreach 标签主要有以下属性,说明如下。

    • item:表示集合中每一个元素进行迭代时的别名。
    • index:指定一个名字,表示在迭代过程中每次迭代到的位置。
    • open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
    • separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
    • close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。


    使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:

    • 如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。
    • 如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。
    • 如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。

    示例

    1. <select id="selectWebsite"
    2. parameterType="net.cc.po.Website"
    3. resultType="net.biancheng.po.Website">
    4. SELECT id,name,url,age,country
    5. FROM website WHERE age in
    6. <foreach item="age" index="index" collection="list" open="("
    7. separator="," close=")">
    8. #{age}
    9. foreach>
    10. select>

     测试

    1. public class Test {
    2. public static void main(String[] args) throws IOException {
    3. // 读取配置文件mybatis-config.xml
    4. InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建
    5. SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
    6. // 通过SqlSessionFactory创建SqlSession
    7. SqlSession ss = ssf.openSession();
    8. List ageList = new ArrayList();
    9. ageList.add(10);
    10. ageList.add(12);
    11. List siteList = ss.selectList("net.cc.mapper.WebsiteMapper.selectWebsite", ageList);
    12. for (Website ws : siteList) {
    13. System.out.println(ws);
    14. }
    15. }
    16. }

    在使用 foreach 标签时,应提前预估一下 collection 对象的长度。因为大量数据的 in 语句会影响性能,且还有一些数据库会限制执行的 SQL 语句长度。 

  • 相关阅读:
    沉睡者IT - 如何识别NFT“洗盘交易”?
    Android 和Java 的关系
    第一章 指针仪表识别之仪表检测
    第二章: 创建第一个Spring Boot 应用
    球形气膜:举办大型活动和特色景点的独特优势—轻空间
    开发一个现代化的.NetCore控制台程序,包含依赖注入/配置/日志等要素
    Java线程定时器
    Failed to prepare the device for development
    2023年CSP-J1入门级第一轮题解
    yolo格式转labelme格式并验证
  • 原文地址:https://blog.csdn.net/qq_43079001/article/details/133762667