mybatis常用的动态sql,mybaties动态sql

  mybatis常用的动态sql,mybaties动态sql

  

目录

1.If语句2。Where语句2.1和自定义trim元素相当于where元素3。Set语句3.1自定义trim元素相当于set元素4。选择语句5。Foreach语句6。SQL片段7。附加的绑定元素:MyBatis配置动态SQL语句概要

 

  

1. If 语句

要求:根据作者姓名和博客名称查询博客!如果作者名为空,则只根据博客名查询;否则按作者姓名查询。

 

  !-要求一:根据作者姓名和博客名称查询博客!如果作者姓名为空,则只根据博客名称查询,否则,则查询select * from blog where title=# { title } and author=# { author }-select id= query blogif 参数type= map 结果type= blog select * from blog where if test= title!=null title=# { title }/if if test= author!=null 和author=# {author}/if/select。如果author等于null,那么查询语句是select * from user where title=# { title },但是如果title为空呢?那么查询语句就是SELECT * FROM USER WHERE AND AUTHOR=# { AUTHOR },这是一个错误的SQL语句。怎么解决?看下面的where语句!

  00-1010修改上面的SQL语句:

  select id= query logif parameter type= map result type= blog select * from blog where if test= title!=null title=# { title }/if if test= author!=null 和author=# { author }/if/WHERE/select WHERE元素只有在子元素返回任何内容时才会插入到“WHERE”子句中。此外,如果子句以“AND”和“or”开头,where元素也会删除它们。

  如果where元素与您预期的不同,您可以通过自定义trim元素来自定义where元素的功能。

  

2. Where语句

trim prefix=其中 prefixOverrides=和OR ./修剪

 

  00-1010同样,上面的查询SQL语句包含where关键字。如果更新操作包含set关键字,我们该怎么办?

  !-注意集合之间用逗号分隔-update id= update blog 参数type= map update blog set if test= title!=null title=#{title},/if if test=author!=null author=#{author} /if /set其中id=# { id };/update在本例中,set元素将在行首动态插入SET关键字,并将删除多余的逗号(这些逗号是在使用条件语句为列赋值时引入的)。

  

2.1 和 where 元素等价的自定义 trim 元素

 

  rim 元素

<trim prefix="SET" suffixOverrides=","> ...</trim>

 

  

4. Choose语句

有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose标签可以解决此类问题,类似于 Java 的 switch 语句

 

  

<select id="queryBlogChoose" parameterType="map" resultType="blog"> select * from blog <where> <choose> <when test="title != null"> title = #{title} </when> <when test="author != null"> and author = #{author} </when> <otherwise> and views = #{views} </otherwise> </choose> </where></select>

 

  

5. Foreach语句

将数据库中前三个数据的id修改为1,2,3;

 

  需求:我们需要查询 blog 表中 id 分别为1,2,3的博客信息

  

<select id="queryBlogForeach" parameterType="map" resultType="blog"> select * from blog <where> <!-- collection:指定输入对象中的集合属性 item:每次遍历生成的对象 open:开始遍历时的拼接字符串 close:结束时拼接的字符串 separator:遍历对象之间需要拼接的字符串 select * from blog where 1=1 and (id=1 or id=2 or id=3) --> <foreach collection="ids" item="id" open="and (" close=")" separator="or"> id=#{id} </foreach> </where></select>

 

  

6. SQL片段

有时候可能某个 sql 语句我们用的特别多,为了增加代码的重用性,简化代码,我们需要将这些代码抽取出来,然后使用时直接调用。

 

  提取SQL片段:

  

<sql id="if-title-author"> <if test="title != null"> title = #{title} </if> <if test="author != null"> and author = #{author} </if></sql>

引用SQL片段:

 

  

<select id="queryBlogIf" parameterType="map" resultType="blog"> select * from blog <where> <!-- 引用 sql 片段,如果refid 指定的不在本文件中,那么需要在前面加上 namespace--> <include refid="if-title-author"></include> <!-- 在这里还可以引用其他的 sql 片段 --> </where></select>

注意:

 

  ①、最好基于 单表来定义 sql 片段,提高片段的可重用性

  ②、在 sql 片段中不要包括 where

  

 

  

7. Bind元素

bind 元素允许你在 OGNL 表达式以外创建一个变量,并将其绑定到当前的上下文。比如:

 

  

<select id="selectBlogsLike" resultType="Blog"> <bind name="pattern" value="% + _parameter.getTitle() + %" /> SELECT * FROM BLOG WHERE title LIKE #{pattern}</select>

 

  

附:MyBatis配置动态SQL语句

CREATE DATABASE `mybatis_study`;USE `mybatis_study`;CREATE TABLE `user`(  `user_id` INT(20) NOT NULL PRIMARY KEY,  `user_name` VARCHAR(30) DEFAULT NULL,  `password` VARCHAR(30) DEFAULT NULL)ENGINE = INNODB DEFAULT CHARSET = utf8;INSERT INTO `user` (`user_id`,`user_name`,`password`) VALUES(1, 张三, 123456),(2, admin, admin),(3, root, root);

在 MyBatis 的 SQL映射文件中,有时候需要根据一些查询条件,来选择不同的SQL语句,如果每一个场景都重写SQL,很显然效率没有很高,而 MyBatis 的动态SQL很好的解决了这种问题,根据条件动态的处理 SQL, 特别简单的说就是,写一次SQL,但是根据分支等的跳转,在多个场景下也可以使用,例如:

 

  当查询条件由于参数不同而无法确定具体是什么,可以使用<where>标签包含在 <where> 可以使用 <if test="...."> 分条件进行处理,实现动态<foreach>遍历标签,在用户中查询寻多个id,例如(12,16,17)在此之外,动态SQL同时结局了,在原生 JDBC 中需要拼接SQL语句时由于书写问题,而导致报错

  

 

  

总结

到此这篇关于Mybatis超级强大的动态SQL语句大全的文章就介绍到这了,更多相关Mybatis动态SQL语句内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: