MyBatis快速入门(16)动态SQL

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

虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。

动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。常用的动态SQL标签如下:

if

choose (when, otherwise)

trim (where, set)

foreach

 

 

 

 

 

 

if标签

动态 SQL 经常要做的事情是根据条件判断是否包含 where 子句的一部分。比如:

这条语句提供了一种可选的查找文本功能。如果没有传入“name”,那么只返回符合id条件的user;反之若传入了“name”,那么就会对“name”一列进行查找并返回 user 结果。另外,很多时候查询字符串会使用模糊查询,因此要是用like,还要给参数两边加上%进行模糊匹配,加的方式根据数据库拼接字符串的特性来判断,比如mysql数据库:

and name like concat('%',#{name},'%')

或者oracle数据库:

and name like '%'||#{name}||'%'

等等,按照数据库的语法来使用即可。如果有多个参数不固定,写多个if标签就可以:

注意,age不是字符串,因此不用判断 age!='',这个条件。

 

 

 

 

 

 

choose, when, otherwise标签

有时我们不想应用到所有的条件语句,而只想从中择其一项。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

还是上面的例子,但是这次变为提供了“name”就按“name”查找,提供了“id”就按“id”查找的情形,若两者都没有提供,就返回所有符合条件的 user。

从语句中可以看出,id的条件在上面,name的条件在下面,如果id先满足条件,那么后面的name就不用判断了,如果id不满足但是name条件满足,就会查询符合name条件的记录。如果都不满足,就会变成 where 1=1 and 2=2 ,这样的结果就是查询所有记录了。这种结构就类似与Java中的switch或者 if...else if这样的逻辑语句。

 

 

 

 

 

 

trim, where, set标签

前面几个例子已经合宜地解决了一个臭名昭著的动态 SQL 问题。现在回到“if”示例,我们为了拼接语句,开头都写了一个硬条件,1=1,如果不写会怎么样?可以想象当条件都不满足的时候,SQL语句最终会变成这样:

select id,name from t_user where

这会导致查询失败和报错。这个问题不能简单地用条件句式来解决,如果你也曾经被迫这样写过,那么你很可能从此以后都不会再写出这种语句了。MyBatis 有一个简单的处理,这在 90% 的情况下都会有用。而在不能使用的地方,你可以自定义处理方式来令其正常工作。一处简单的修改就能达到目的:

把where单词去掉,换成<where>标签,然后里面的条件就可以恣无忌惮的写了,如果一个条件都不满足,那么SQL最后的结果就是连where关键字都没有了,如果第一个条件满足,那么第一个条件带着and也会智能的去掉and。

如果 where 元素没有按正常套路出牌,我们可以通过自定义 trim 元素来定制 where 元素的功能。比如,和 where 元素等价的自定义 trim 元素。trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。

因此上面的写法也可以换一种等价的写法:

prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中and和or后面的空格也是必要的)。它的作用是移除所有指定在 prefixOverrides 属性中的内容,并且插入 prefix 属性中指定的内容。

 

类似的用于动态更新语句的解决方案叫做 setset 元素可以用于动态包含需要更新的列,而舍去其它的。比如:

这是一个update语句,set标签中包含的其实就是SQL中的set语句,这里,set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号,因为用了条件语句之后很可能就会在生成的 SQL 语句的后面留下这些逗号。(因为用的是“if”元素,若最后一个“if”没有匹配上而前面的匹配上,SQL 语句的最后就会有一个逗号遗留)。

同时,set标签也可以使用trim标签替换,写法如下:

注意逗号在每个判断语句的后面,所以使用了suffixOverrides属性。同时,我们可以想象,有了上面这些动态的判断标签,增加,更新,和删除语句可以写的更加具有适应性,来看一个新增:

上面这个语句基本上能满足单体的所有新增情况。其它的更新和删除大家可以试着写一下。

 

 

 

 

 

 

 

 

foreach标签

动态 SQL 的另外一个常用的操作需求是对一个集合进行遍历,前面也简单接触过,通常是在构建 IN 条件语句的时候。比如:

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。

注意: 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象传递给 foreach 作为集合参数。当使用可迭代对象或者数组时,index 是当前迭代的次数,item 的值是本次迭代获取的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

 

代码地址:https://gitee.com/blueses/mybatis-demo  08

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一种持久化框架,可以帮助开发人员管理数据库访问,提供了一种简化SQL语句编写和数据访问的方法。在这里,我将为您提供一个快速入门指南,以帮助您开始使用MyBatis。 1. 环境设置 在开始使用MyBatis之前,您需要在计算机上安装JavaMyBatis。您可以在MyBatis官网上下载MyBatis,并按照步骤进行安装。 2. 创建数据库表 在使用MyBatis之前,您需要创建一个数据库表来存储数据。在这里,我将创建一个名为“用户”的表,其中包含id、姓名和年龄字段。 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 3. 创建POJO类 在使用MyBatis之前,您需要创建一个POJO类来表示数据库表中的数据。在这里,我将创建一个名为“User”的类,并在其中添加id、name和age字段的getter和setter方法。 public class User { private int id; private String name; private int age; // getter and setter methods } 4. 创建Mapper接口和XML文件 在MyBatis中,Mapper是一个接口,它定义了与数据库进行交互的方法。在这里,我将创建一个名为“UserMapper”的接口,并在其中添加一个名为“selectUserById”的方法,该方法将返回具有指定ID的用户。 public interface UserMapper { User selectUserById(int id); } 接下来,我们需要创建一个名为“UserMapper.xml”的XML文件,该文件将包含与Mapper接口中方法对应的SQL语句。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" parameterType="int" resultType="com.example.pojo.User"> SELECT * FROM user WHERE id = #{id} </select> </mapper> 5. 配置MyBatis 现在,我们需要将MyBatis配置为使用我们创建的Mapper接口和XML文件。我们需要创建一个名为“mybatis-config.xml”的XML文件,并在其中添加以下内容: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration> 在这里,我们为MyBatis配置了一个数据源,该数据源将连接到MySQL数据库,并指定了Mapper文件的位置。 6. 测试MyBatis 现在,我们已经准备好使用MyBatis了。我们可以在Java代码中使用MyBatis来获取具有指定ID的用户。在这里,我将提供一个简单的示例: public class Main { public static void main(String[] args) { SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession session = sessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); User user = userMapper.selectUserById(1); System.out.println(user.getName()); } } 在这里,我们使用SqlSessionFactoryBuilder类从mybatis-config.xml文件中创建SqlSessionFactory对象。然后,我们打开一个SqlSession对象并获取UserMapper接口的实例。最后,我们调用selectUserById方法并打印用户的名称。 这就是MyBatis快速入门指南。希望这能帮助您开始使用MyBatis,并为您提供一个更好的方法来管理数据库访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值