8-Mybatis 的动态 SQL 语句

Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL 是动态变 化的,此时在前面的学习中我们的 SQL 就不能满足要求了。
参考的官方文档,描述如下:

Dynamic SQL

One of the most powerful features of MyBatis has always been its Dynamic SQL capabilities. If you have any experience with JDBC or any similar framework, you understand how painful it is to conditionally concatenate strings of SQL together, making sure not to forget spaces or to omit a comma at the end of a list of columns. Dynamic SQL can be downright painful to deal with.

While working with Dynamic SQL will never be a party, MyBatis certainly improves the situation with a powerful Dynamic SQL language that can be used within any mapped SQL statement.

The Dynamic SQL elements should be familiar to anyone who has used JSTL or any similar XML based text processors. In previous versions of MyBatis, there were a lot of elements to know and understand. MyBatis 3 greatly improves upon this, and now there are less than half of those elements to work with. MyBatis employs powerful OGNL based expressions to eliminate most of the other elements:

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

动态 SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

一、动态 SQL 标签

我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询, 如果 username 不为空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
/**
* 根据用户信息,查询用户列表
* @param user
* @return
*/
List findByUser(User user);
注意: 标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。
另外要注意 where 1=1 的作用 ~! 另外注意这里使用了别名,要在SqlMapConfig.xml中配置别名
@Test
    public void testFindByUser() {
        User u = new User();
        u.setUsername("%王%");
        u.setAddress("%顺义%");
        //6.执行操作
        List users = userDao.findByUser(u);
        for(User user : users) {
            System.out.println(user);
        } }

二、动态 SQL 标签

为了简化上面 where 1=1 的条件拼装,我们可以采用标签来简化开发。


    

三、动态标签之标签

1.需求

传入多个 id 查询用户信息,用下边两个 sql 实现:
SELECT * FROM USERS WHERE username LIKE '% %' AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '% %' AND id IN (10,89,16)
这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。
这样我们将如何进行参数的传递?

2.QueryVo 中加入一个 List 集合用于封装参数

/**
 * 

Title: QueryVo

*

Description: 查询条件对象

*/ @Data public class QueryVo implements Serializable { private User user; private List ids; }

3.其他代码和配置

/**
* 根据 id 集合查询用户
* @param vo
* @return
*/
List findInIds(QueryVo vo);

    
SQL 语句:
select 字段 from user where id in (?)
标签用于遍历集合,它的属性:
     collection: 代表要遍历的集合元素,注意编写时不要写 #{}
     open: 代表语句的开始部分
     close: 代表结束部分
     item: 代表遍历集合的每个元素,生成的变量名
     sperator: 代表分隔符
@Test
    public void testFindInIds() {
        QueryVo vo = new QueryVo();
        List ids = new ArrayList();
        ids.add(41);
        ids.add(42);
        ids.add(43);
        ids.add(46);
        ids.add(57);
        vo.setIds(ids);
        List users = userDao.findInIds(vo);
        for (User user : users) {
            System.out.println(user);
        }
    }

四、Mybatis 中简化编写的 SQL 片段

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。

1.定义SQL片段



    select * from user

2.引用代码片段


    

你可能感兴趣的:(mybatis,mybatis,sql,数据库)