MyBatis精品教程资料:3.动态SQL

合集下载

Mybatis中动态SQL,if,where,foreach的使用教程详解

Mybatis中动态SQL,if,where,foreach的使用教程详解

Mybatis中动态SQL,if,where,foreach的使⽤教程详解MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们⽅便的在SQL语句中实现某些逻辑。

MyBatis中⽤于实现动态SQL的元素主要有:ifchoose(when,otherwise)trimwheresetforeachmybatis核⼼对sql语句进⾏灵活操作,通过表达式进⾏判断,对sql进⾏灵活拼接、组装。

1、statement中直接定义使⽤动态SQL:在statement中利⽤if 和 where 条件组合达到我们的需求,通过⼀个例⼦来说明:原SQL语句:<select id="findUserByUserQuveryVo" parameterType ="UserQueryVo" resultType="UserCustom">select * from userwhere username = #{ername} and sex = #{userCustom.sex}</select>现在需求是,如果返回值UserCustom为空或者UserCustom中的属性值为空的话(在这⾥就是ername或者userCustom.sex)为空的话我们怎么进⾏灵活的处理是程序不报异常。

做法利⽤if和where判断进⾏SQL拼接。

<select id="findUserByUserQuveryVo" parameterType ="UserQueryVo" resultType="UserCustom">select * from user<where><if test="userCustom != null"><if test="ername != null and ername != ''"><!-- 注意and不能⼤写 -->and username = #{ername}</if><if test="userCustom.sex != null and userCustom.sex != ''">and sex = #{userCustom.sex}</if></if></where></select>有时候我们经常使⽤where 1=1这条语句来处理第⼀条拼接语句,我们可以使⽤< where > < where />来同样实现这⼀功能。

mybatis使用动态sql模糊查询写法

mybatis使用动态sql模糊查询写法

mybatis使用动态sql模糊查询写法1. 引言1.1 概述本文旨在介绍使用MyBatis进行动态SQL模糊查询的写法。

随着互联网技术的发展和数据量的增加,对数据库的模糊查询需求也越来越多。

而动态SQL是MyBatis框架提供的一种强大的查询特性,可以根据不同条件生成相应的SQL 语句,非常适用于模糊查询场景。

1.2 文章结构本文共包括五个部分。

首先,我们会简要介绍MyBatis动态SQL的概念及其作用;接着,详细介绍了动态SQL语句的分类。

然后,重点围绕动态SQL模糊查询展开讲解,包括使用like关键字和concat函数进行模糊查询两种常见写法。

之后,在示例与解析部分,我们将分别给出三个实际案例来演示如何使用动态SQL进行模糊查询,并进行详尽解析。

最后,我们将在结论与总结部分回顾文章内容,并对MyBatis动态SQL的优势和应用场景进行总结。

1.3 目的通过本文,读者将能够全面掌握使用MyBatis进行动态SQL模糊查询的写法,并了解到其在实际开发中的应用。

同时,本文还旨在引导读者深入了解MyBatis 框架的核心特性和灵活查询的技巧,从而提升数据库模糊查询的效率和准确性。

对于开发人员而言,这将是一篇实用且具有指导意义的文章。

2. MyBatis动态SQL概述2.1 MyBatis简介MyBatis是一个开源的持久化框架,它可以将数据库和Java对象之间的映射关系进行配置,并通过XML或注解方式实现对数据库的访问。

MyBatis提供了丰富的功能和灵活性,使得开发者能够更加方便地进行数据持久化操作。

2.2 动态SQL的作用动态SQL是MyBatis中一项非常重要的特性。

它允许我们根据不同条件来动态生成SQL语句,在遇到不同情况时执行不同的数据库操作。

这样可以大大提升程序的灵活性和可维护性。

2.3 动态SQL语句的分类在MyBatis中,动态SQL语句主要分为四类:- if判断:通过if标签来判断某个条件是否成立,根据条件结果来决定是否包含某部分SQL语句。

mybatis之动态sql(超详细)

mybatis之动态sql(超详细)

mybatis之动态sql(超详细)动态SQL可以根据具体的参数条件,来对SQL语句进⾏动态拼接。

⽐如在以前的开发中,由于不确定查询参数是否存在,许多⼈会使⽤类似于where 1 = 1来作为前缀,然后后⾯⽤AND拼接要查询的参数,这样,就算要查询的参数为空,也能够正确执⾏查询,如果不加1 = 1,则如果查询参数为空,SQL语句就会变成SELECT * FROM student where,SQL不合法。

mybatis⾥的动态标签主要有if<!-- ⽰例 --><select id="find"resultType="student"parameterType="student">SELECT * FROM student WHERE age >= 18<if test="name != null and name != ''">AND name like '%${name}%'</if></select>当满⾜test条件时,才会将<if>标签内的SQL语句拼接上去。

choose<!-- choose 和 when , otherwise 是配套标签类似于java中的switch,只会选中满⾜条件的⼀个--><select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><when test="author != null and != null">AND author_name like #{}</when><otherwise>AND featured = 1</otherwise></choose></select>sql<!-- List<User> findByList(List<Integer> list); --><select id="findByList"resultType="er"parameterType="java.util.List"> SELECT * FROM user<include refid="rnm"></include></select><sql id="rnm"><where><if test="list != null and list.size() > 0">AND id in<foreach collection="list"item="id"open="("separator=","close=")">#{id}</foreach></if></where></sql>trimwhere<where>标签只会在⾄少有⼀个⼦元素返回了SQL语句时, 才会向SQL语句中添加WHERE,并且如果WHERE之后是以AND或OR开头,会⾃动将其删掉。

3.mybatis动态sql执行原理

3.mybatis动态sql执行原理

MyBatis动态SQL的执行原理:灵活应对MyBatis 是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。

MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。

MyBatis 可以使用简单的XML 或注解来配置和映射原生信息,将接口和Java 的 POJOs (Plain Old Java Objects) 映射成数据库中的记录。

关于 MyBatis 动态 SQL 的执行原理,我们可以从以下几个方面来理解:1.XML 映射文件:MyBatis 的核心是它的 XML 映射文件。

这些文件描述了如何执行 SQL 查询和更新,并将结果映射回 Java 对象。

XML 文件中可以包含动态SQL,例如<if>、<choose>、<when>、<otherwise>、<foreach>等元素,这些元素可以根据提供的参数或条件动态地生成SQL 语句。

2.参数解析:当MyBatis 接收到一个查询请求时,它会首先解析提供的参数。

参数类型可以是一个单一的参数,也可以是一个参数数组。

MyBatis 会根据参数的类型和属性值来决定如何构建 SQL 语句。

3.动态 SQL:动态 SQL 是根据传入的参数或条件构建的 SQL 语句。

例如,可以根据传入的ID 来查询特定的记录,或者根据提供的多个ID 来查询多个记录。

MyBatis 的动态 SQL 功能允许开发者根据不同的条件构建不同的SQL 语句,而不需要在代码中编写多个几乎相同的 SQL 语句。

4.SQL 执行:一旦 MyBatis 构建了 SQL 语句,它就会使用 JDBC 将该语句发送到数据库执行。

执行的结果会被映射回 Java 对象,然后返回给调用者。

5.结果映射:MyBatis 使用结果映射来将数据库中的记录映射到 Java 对象。

它可以根据列名和属性名进行自动映射,也可以通过定义<resultMap>来指定如何映射列和属性。

JavaMyBatis3(8)动态SQL标签

JavaMyBatis3(8)动态SQL标签

JavaMyBatis3(8)动态SQL标签前⾔:mybatis框架中最具特⾊的便是sql语句中的⾃定义,⽽动态sql的使⽤⼜使整个框架更加灵活。

创建User表/*Table structure for table `user` */DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`username` varchar(20) NOT NULL,`age` int(3) NOT NULL,`phone` varchar(11) NOT NULL,`email` varchar(50) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4DEFAULT CHARSET=utf8;/*Data for the table `user` */insert into `user`(`id`,`name`,`username`,`age`,`phone`,`email`) values (1,'张三','zs',18,'150********','4567899@'),(2,'李四','ls',19,'150********','567657642@'),(3,'王五','ww',20,'150********','2323248@ /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;View Code标签作⽤if 单条件分⽀,相当于判断语句choose、when、otherwise多条件分⽀,相当于Java中的switch语句set、where、trim辅助条件判断,⽤于拼接语句foreach 集合进⾏遍历(尤其是在构建 IN 条件语句的时候)bind 创建⼀个变量,并将其绑定到当前的上下⽂if标签User实体package ki.ref.pojo;public class User {private int id;private String name;private String username;private int age;private String phone;private String email;//⽆参构造函数必须有,ORM框架调⽤的就是⽆参构造函数public User() {}public User(int id, String name, String username, int age, String phone, String email) {super();this.id = id; = name;ername = username;this.age = age;this.phone = phone;this.email = email;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}return age;}public void setAge(int age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", username=" + username + ", age=" + age + ", phone=" + phone+ ", email=" + email + "]";}}View CodeUserMapperpackage ki.ref.mapper;import er;import java.util.List;public interface UserMapper {public List<User> getUser(User user);}View CodeUserMapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd" ><!--⽤户mapper关系映射 --><mapper namespace="erMapper"><select id="getUser" resultType="er">select * from user where 1=1<if test="id != null">and id=#{id}</if><if test="age != null">and age=#{age}</if><if test="name != null">and name=#{name}</if></select></mapper>View CodeUserControllerpackage ki.ref.controller;import erMapper;import er;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestControllerpublic class UserController {@Autowiredprivate UserMapper UserMapper;@GetMapping("/getUser")public List<User> getUser() {User user = new User(1, "张三", null, 18, null, null);List<User> users = UserMapper.getUser(user);System.out.println(users);return users;}}View Code测试choose (when, otherwise)标签 choose标签是按顺序判断其内部when标签中的test条件出否成⽴,如果有⼀个成⽴,则 choose 结束。

Mybatis动态SQL

Mybatis动态SQL

Mybatis动态SQL⼀:动态SQL语句动态SQL可以说是Mybatis的⼀⼤特点。

在使⽤过JDBC来写SQL语句,你应该能理解不同的条件有不同的SQL语句要拼接,往往⼀个字符串被东拼西凑,特别痛苦,⽽且还得保证拼接的时候2段SQL⽚段之间要保留空格等待,利⽤动态SQL可以保证彻底摆脱这种痛苦! 其实使⽤动态SQL也不是⼀件容易的事,但借助可⽤于任何 SQL 映射语句中的强⼤的动态 SQL 语⾔,MyBatis 显著地提升了这⼀特性的易⽤性。

如果有之前在学web的时候接触过JSTL或者任何基于类XML语⾔的⽂本处理器,,或许你对动态SQL有⼀定的似曾相识感觉,在 MyBatis 之前的版本中,需要花时间了解⼤量的元素。

借助功能强⼤的基于 OGNL 的表达式,MyBatis 3 替换了之前的⼤部分元素,⼤⼤精简了元素种类,现在要学习的元素种类⽐原来的⼀半还要少。

Mybatis中⽤于实现动态SQL元素主要有if、choose、trim、where、set、foreach1:if标签动态 SQL 通常要做的事情是有条件地包含 where ⼦句的⼀部分。

简单说传来的值⽤if判断,有的话就拼接到where后⾯。

<!--根据性别和年龄查询--><!--注意:必须要带⼀个where 1=1 否则sql语句少了where语句,,if判断某个值为空就不会拼接某个⽚段 --><select id="findByAgeAndSex" parameterType="student" resultMap="studentMapper">select * from student where 1=1<if test="age!=0">and sage=#{age}</if><if test="sex!=null and sex!=''">and ssex=#{sex}</if></select>2:choose、when、otherwise标签这3个标签是⼀个整体和JSTL的⼀样,它们的本质都有点像java的switch分⽀语句,还是按照上⾯的例⼦,假设我传来年龄就按照年龄查询,传来性别就按照性别查询,年龄和性别都传来,就按照标签判断的先后顺序选择⼀个靠前的,然后下⼀个判断将不在执⾏,直接跳出,如果都不传则执⾏otherwise标签<!--根据性别和年龄的其中⼀个查询--><select id="findByAgeAndSexChoose" parameterType="student" resultMap="studentMapper"><!--基本sql语句-->select * from student where 1=1<!--switch开始--><choose><!--case :--><when test="age!=0">and sage=#{age}</when><!--case :--><when test="sex!=null and sex!=''">and ssex=#{sex}</when><!--default 如果都不成⽴则执⾏下⾯查询5条数据--><otherwise>limit 5</otherwise></choose></select>3:where、set、trim标签先说⼀下where,其实⼤家有没有发现,我前2个⽰例都有where 1=1,这是⼲嘛⽤的呢?其实这个是⼀个恒等式,加where 1=1和不加都⼀样,但是加上了,后⾯的拼接语句就可以使⽤ and xx=xx and xxx=xxx 如果没加,那么后⾯的if判断成⽴就会形成⼀个select * from student where and sage=xx;⼤家肯定发现错误了,其实Mybatis帮我们解决了where 1=1的拼接问题,我们可以不⽤⾃⼰⼿动写where属性了,我就改造⼀下第⼀个例⼦<!--根据性别和年龄查询--><!--加上where标签后就不⽤写恒等式了,就连前⾯的and也可写可不写看下⾯的2个if⾥⾯--><select id="findByAgeAndSex" parameterType="student" resultMap="studentMapper">select * from student<where><if test="age!=0">sage=#{age}</if><if test="sex!=null and sex!=''">and ssex=#{sex}</if></where></select>现在我们来聊聊trim,这个东西第⼀眼看上去特别难理解,以⾄于我都不知道是啥玩意,但是明⽩以后还是感觉不错的,就是⽤的很少,先不废话直接上代码看看<!--使⽤trim标签完成where案例trim标签有4个属性:prefix:前缀覆盖并增加其内容。

MyBatis笔记:动态SQL

MyBatis笔记:动态SQL

MyBatis笔记:动态SQL⽰例中使⽤的实体类// 省略了get、set、构造器等⽅法public class Blog {private String id;private String title;private String author;private Date createTime;private int views;}1. where和if标签where标签和if标签都可以单独使⽤,我这⾥为了⽅便演⽰,在⽰例中就放在⼀起了。

<select id="queryBlogIf" parameterType="map" resultType="Blog">select * from blog<!-- where标签会⾃动添加where语句,并将后⾯满⾜条件的if标签中的内容进⾏拼接,并且如果拼接之后检查到where之后紧接着的开始语句是and或or的的话,也会⾃动删除单词and或or,当然如果所有if都不满⾜,where语句也不会拼接到SQL⾥。

例如:如果下⾯第⼀个if没有满⾜,第⼆if满⾜了,直接拼接的话就会变成where and,这样的SQL是有问题的,所以where标签会⾃动将这个and给删除掉,当然如果两个条件都不满⾜,where语句也不会拼接到最终的SQL⾥ --><where><!-- test中是对传⼊参数的判断,这⾥的title != null表⽰是map中有key为title且不为null时才满⾜条件,通常没有传⼊该参数的话就会是null --><if test="title != null">title = #{title}</if><if test="author != null">and author = #{author}</if></where></select>2. choose,when和otherwise标签choose,when和otherwise标签类似于java的switch,case和default语句。

mybatis动态sql语法

mybatis动态sql语法

mybatis动态sql语法在使用MyBatis进行数据库操作时,使用动态SQL可以有效地处理不同查询条件下的不同SQL语句。

MyBatis提供了一套灵活的动态SQL语法,使得我们能够根据需要动态生成SQL语句,以满足各种查询需求。

本文将详细介绍MyBatis动态SQL语法的使用。

一、if语句if语句是MyBatis中最常用的动态SQL语法之一。

通过if语句,我们可以根据条件判断来生成不同的SQL片段。

示例代码如下:```<select id="getUserList" resultType="User">SELECT *FROM userWHERE 1 = 1<if test="username != null and username != ''">AND username = #{username}</if><if test="age != null">AND age = #{age}</if></select>```在上述代码中,我们使用了if语句来生成动态的WHERE子句。

首先,我们判断username字段是否为空,如果不为空,则将其加入WHERE子句;然后,我们判断age字段是否为空,如果不为空,则同样将其加入WHERE子句。

通过这种方式,我们可以根据不同的查询条件动态生成不同的SQL语句。

二、choose语句choose语句也是常用的动态SQL语法之一。

它类似于Java中的switch语句,根据条件判断来选择执行不同的分支。

示例代码如下:```<select id="getUserList" resultType="User">SELECT *FROM user<where><choose><when test="username != null and username != ''">AND username = #{username}</when><when test="age != null">AND age = #{age}</when><otherwise>AND status = 1</otherwise></choose></where></select>```在上述代码中,我们使用choose语句来生成动态的WHERE子句。

myBatis--动态SQL

myBatis--动态SQL

myBatis--动态SQL⼀、介绍动态 SQL是MyBatis强⼤特性之⼀。

极⼤的简化我们拼装SQL的操作。

动态 SQL 元素和使⽤ JSTL 或其他类似基于 XML 的⽂本处理器相似。

MyBatis 采⽤功能强⼤的基于 OGNL 的表达式来简化操作。

⼆、动态SQL1.if注意:在查询的时候有些条件没有带上,以⾄于SQL语句拼装会出现问题:①where后⾯写上 1=1 ,所有的if条件都要以 and 开头②使⽤<where>标签将所有的条件包含在标签中;但是这种⽅式只适合and或者or在语句前2.choose分⽀选择 (when, otherwise):带了break的switch-case3.trim字符串截取 (where封装查询条件, set封装修改条件)4.foreach(1)遍历(2).批量保存⽅式⼀:⽅式⼆:开启分隔多条查询三、OGNL表达式1.OGNL2.bind可以将OGNL 的值绑定在⼀个变量上,⽅便以后引⽤这个变量的值四、两个内置参数myBatis默认的两个内置参数:1. _parameter:代表整个参数如果是⼀个参数:代表这个参数本⾝如果是多个参数:例如map集合,那么急代表这个集合2. _databaseId:如果配置了DatabaseIdProvider标签,则_databaseId就是代表当前数据库的别名五、sql标签抽取可重⽤的SQL⽚段,⽅便后续的引⽤;1.SQL抽取:经常要查询或者更新的列名,抽取出来进⾏引⽤2.include标签:将抽取好的部分进⾏引⽤3.include标签还可以⾃定义字段使⽤<property>标签,要使⽤${⾃定义的参数}取值。

MyBatis精品教程资料:3.动态SQL

MyBatis精品教程资料:3.动态SQL
limit(起始位置,页面容量)
查询用户列表的方法增加2个参数
from pageSize
演示示例11:MyBatis分页功能实现-用户列表
30/37
学员操作—分页显示供应商列表和订单列表
练习 需求说明:
为供应商管理之查询供应商列表功能增加分页实现 为订单管理之查询订单列表功能增分页实现 列表结果按照创建时间降序排列
共性问题集中讲解
18/37
foreach元素 4-1
foreach
迭代一个集合,通常用于in条件 属性
item
index
collection:必须指定
list array map-key
open
separator
close
19/37
foreach元素 4-2
需求说明:
指定用户角色(1-n个),获取这些用户角色下的用户列表信息
演示示例2 :改造用户表的查询操作-if
6/37
Where元素 2-1
问题 当只传入参数:用户角色,而不传入参数:用户名称 的时候,控制台报SQL异常错误?
正确结果
分析
指定用户角色下的所有用户数据
原因
select * from smbms_user where and userRole = ?
劢态sql本章任务?完成超市订单系统用户管理功能模块劢态sql的改造?完成超市订单系统用户列表的分页实现237本章目标?熟练掌握劢态sql337劢态sql?基于ognl表达式?完成多条件查询等逻辑实现?用于实现劢态sql的元素主要有?if?trim?where?set?choosewhenotherwise?foreach437if元素21?需求说明?改造查询用户信息列表的演示示例增加查询条件?用户角色根据角色id查询?用户名称模糊查询演示示例1

mybatis中的动态SQL语句

mybatis中的动态SQL语句

mybatis中的动态SQL语句有时候,静态的SQL语句并不能满⾜应⽤程序的需求。

我们可以根据⼀些条件,来动态地构建 SQL语句。

例如,在Web应⽤程序中,有可能有⼀些搜索界⾯,需要输⼊⼀个或多个选项,然后根据这些已选择的条件去执⾏检索操作。

我们可能需要根据⽤户选择的条件来构建动态的SQL语句。

如果⽤户提供了任何⼀个条件,我们需要将那个条件添加到SQL语句的WHERE⼦句中。

!以下内容基于⾃⼰建的表和类!1.<if>标签被⽤来通过条件嵌⼊SQL⽚段,如果条件为true,则相应地SQL⽚段将会被添加到SQL语句中。

例如:假定有⼀个课程搜索界⾯,设置了讲师(Tutor)下拉列表框,课程名称(CourseName)⽂本输⼊框,开始时间(StartDate)输⼊框,结束时间(EndDate)输⼊框,作为搜索条件。

假定课讲师下拉列表是必须选的,其他的都是可选的。

当⽤户点击搜索按钮时,需要显⽰符合条件的列表数据。

对应的sql映射⽂件,如下所⽰:<!-- 独⽴的Course封装映射 --><resultMap type="Course" id="CourseResult"><id column="course_id" property="courseId"/><result column="name" property="name"/><result column="description" property="description"/><result column="start_date" property="startDate"/><result column="end_date" property="endDate"/></resultMap><!-- 查询Course的select语句,⾥⾯加⼊了if条件判断 --><select id="searchCourses" parameterType="map" resultMap="CourseResult">SELECT * FROM COURSESWHERE TUTOR_ID= #{tutorId}<if test="courseName != null">AND NAME LIKE #{courseName}</if><if test="startDate != null">AND START_DATE >= #{startDate}</if><if test="endDate != null">AND END_DATE <![CDATA[ <= ]]> #{endDate}</if></select>映射接⼝:public interface DynamicSqlMapper{List<Course> searchCourses(Map<String, Object> map);}测试⽅法:@Testpublic void test_searchCourses1(){SqlSession sqlSession = null;try {sqlSession = MyBatisSqlSessionFactory.openSession();DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class);Map<String,Object> map = new HashMap<String,Object>();map.put("tutorId", 1);map.put("courseName", "%Java%");LocalDate date = LocalDate.of(2019, 1, 10);map.put("startDate", date);List<Course> courses = mapper.searchCourses(map);courses.forEach(System.out::println);} catch (Exception e) {e.printStackTrace();}}例如,页⾯中有⼀个下拉列表,可以选择查询的类别,可以选择根据讲师查询、根据课程名查询、根据时间查询等等,选择了列表之后,再输⼊关键字进⾏查询。

mybatis教程之动态sql语句

mybatis教程之动态sql语句

mybatis教程之动态sql语句MyBatis是一个开源的持久层框架,它提供了一种将SQL语句与Java 代码解耦的方式。

在MyBatis中使用动态SQL可以根据不同的条件生成不同的SQL语句,使得SQL语句更具灵活性。

动态SQL的实现有两种方式:使用XML文件和使用注解。

使用XML文件的方式:1. 在Mapper的XML文件中,使用`<if>`元素来判断条件是否成立,如果成立则生成对应的SQL语句段。

```xml<select id="getUserByName" parameterType="string"resultMap="userResultMap">select * from user<where><if test="name != null">and name = #{name}</if><if test="age != null">and age = #{age}</if></where>```2. 使用`<choose>`、`<when>`和`<otherwise>`元素来进行多条件判断,类似于Java中的switch语句。

```xml<select id="getUserByCondition" parameterType="map" resultMap="userResultMap">select * from user<where><choose><when test="name != null">and name = #{name}</when><when test="age != null">and age = #{age}</when><otherwise>and 1=1</otherwise></where></select>```使用注解的方式:```java``````javapublic class UserSqlProviderSQL sql = new SQL(;sql.SELECT("*").FROM("user").WHERE("1=1");if(name != null)sql.AND.WHERE("name = #{name}");}return sql.toString(;}}```以上就是使用MyBatis实现动态SQL的两种方式。

mybatissql语法

mybatissql语法

mybatis sql语法MyBatis是一种持久层框架,它提供了一种将SQL语句与Java代码进行解耦的方式。

以下是MyBatis中常用的SQL语法:1. 查询语句:- SELECT:用于查询数据,可以使用WHERE子句进行条件过滤,使用ORDER BY子句进行排序。

- INSERT:用于插入数据。

- UPDATE:用于更新数据。

- DELETE:用于删除数据。

2. 参数传递:- 使用#{}来表示参数占位符,例如:SELECT * FROM table WHERE id = #{id}。

- 使用${}来表示参数替换,例如:SELECT * FROM table WHERE id = ${id}。

注意,使用${}可能存在SQL注入的风险,应尽量避免使用。

3. 动态SQL:- IF:用于条件判断,例如:SELECT * FROM table WHERE<if test="id != null">id = #{id}</if><if test="name != null">AND name = #{name}</if>- CHOOSE、WHEN、OTHERWISE:用于多条件判断,类似于Java中的switch 语句。

- FOREACH:用于循环遍历集合,例如:SELECT * FROM table WHERE id IN <foreach collection="ids" item="id" open="(" separator=","close=")">#{id}</foreach>4. 结果映射:- 使用<resultMap>标签定义结果映射关系,例如:<resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/></resultMap>- 使用<association>标签定义关联关系,例如:<association property="department" javaType="Department"><id property="id" column="department_id"/><result property="name" column="department_name"/></association>以上是MyBatis中常用的SQL语法,通过使用这些语法,可以方便地进行数据库操作。

mybatis动态sql test用法

mybatis动态sql test用法

mybatis动态sqltest用法==========概述--MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。

动态SQL则是MyBatis中的一个重要特性,它允许你在运行时构建SQL语句。

本篇文章将介绍MyBatis动态SQL的Test用法,帮助你更好地理解和使用动态SQL。

一、动态SQL的类型--------在MyBatis中,动态SQL主要由三种类型构成:1.`if`:根据条件判断,决定是否包含某个SQL片段。

2.`choose`、`when`、`otherwise`:类似于Java中的switch-case结构,根据条件执行不同的SQL片段。

3.`foreach`:用于迭代集合,生成批量插入的SQL语句。

二、Test用法详解--------Test是MyBatis提供的一个标签,用于在XML映射文件中构建动态SQL。

它的用法非常灵活,可以结合其他标签来构建复杂的SQL语句。

###1.使用Test构建条件判断可以使用Test标签结合if标签来构建条件判断的SQL语句。

例如:```xml<selectid="findActiveUsers"resultType="User">SELECT*FROMusersWHEREstatus=1<Testcondition="status==1">ANDage>30</Test></select>```在上面的例子中,如果status字段的值为1,则会在SQL语句中添加一个条件`ANDage>30`。

###2.使用Test构建循环语句可以使用Test标签结合foreach标签来构建循环语句,用于批量插入或更新数据。

例如:```xml<insertid="insertUsers"parameterType="list">INSERTINTOusers(name,age)<foreachcollection="list"item="user"index="index"separator=",">VALUES(<Test>${}</Test>,<Test>${user.age}</Test>)</foreach></insert>```在上面的例子中,foreach标签会遍历名为list的参数,并使用Test标签拼接出一个个SQL插入语句。

MyBatis动态SQL全面详解

MyBatis动态SQL全面详解

MyBatis动态SQL全⾯详解⽬录前⾔动态sql1.先看⼀下模块⽬录结构2.物理建模和逻辑建模3. 引⼊依赖4.全局配置⽂件5.sql共性抽取⽂件6.mapper接⼝if静态sql:动态sql:where⽤if标签的动态sql:where和if的动态sql:trimtrim的动态sqltrim标签:settrim的动态sql:set的动态sqlset标签的作⽤:choose、when、otherwise动态sqlforeach1.动态sql2.动态sql批量查询:foreach标签测试程序前⾔前⾯mysql都是通过静态sql进⾏查询的,但是如果业务复杂的时候,我们会遇到引号问题,或者多⼀个空格,这就使得sql代码编写错误了,所以为了解决这个问题,我们有了动态sql。

Mybatis框架的动态SQL技术是⼀种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。

具体是通过标签来实现的。

动态sql1.先看⼀下模块⽬录结构在类路径的resources下的mapper包下创建sql.xml⽂件(共性抽取)2.物理建模和逻辑建模这⾥省略物理建模步骤,要求数据库的表与pojo类要对应。

package pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class Employee {private Integer empId;private String empName;private Double empSalary;}3. 引⼊依赖把之前的log4j复制到类路径resouces下,另外我们引⼊依赖后的pom.xml如下:<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>day03-mybatis02-dynamic</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version><scope>provided</scope></dependency><!-- Mybatis核⼼ --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!-- junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.3</version><scope>runtime</scope></dependency><!-- log4j⽇志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies></project>4.全局配置⽂件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!--驼峰映射--><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!--类型别名映射--><typeAliases><package name="pojo"/></typeAliases><!--环境配置--><environments default="dev"><environment id="dev"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="username" value="root"/><property name="password" value="888888"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/><property name="driver" value="com.mysql.jdbc.Driver"/></dataSource></environment></environments><!--路径映射--><mappers><mapper resource="mapper/sql.xml"/><package name="mapper"/></mappers></configuration>注意:这⾥有驼峰映射,别名映射,路径映射和路径映射。

Mybatis之动态sql

Mybatis之动态sql

Mybatis之动态sql Mybatis之动态sql<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,作⽤就是对sql进⾏分类化管理,理解sql隔离注意:使⽤mapper代理⽅法开发,namespace有特殊重要的作⽤,namespace等于mapper接⼝地址--><mapper namespace="erMapper"><!-- 定义sql⽚段id:sql⽚段的唯⼀标识经验:是基于单表来定义sql⽚段,这样话这个sql⽚段可重⽤性才⾼在sql⽚段中不要包括 where--><sql id="query_user_where"><if test="userCustom!=null"><if test="userCustom.sex!=null and userCustom.sex!=''">and user.sex = #{userCustom.sex}</if><if test="ername!=null and ername!=''">and ername LIKE '%${ername}%'</if><if test="ids!=null"><!-- 使⽤ foreach遍历传⼊idscollection:指定输⼊对象中集合属性item:每个遍历⽣成对象中open:开始遍历时拼接的串close:结束遍历时拼接的串separator:遍历的两个对象中需要拼接的串--><!-- 使⽤实现下边的sql拼接:AND (id=1 OR id=10 OR id=16)--><foreach collection="ids" item="user_id" open="AND (" close=")" separator="or"><!-- 每个遍历需要拼接的串 -->id=#{user_id}</foreach><!-- 实现 “ and id IN(1,10,16)”拼接 --><!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=",">每个遍历需要拼接的串#{user_id}</foreach> --></if></if></sql><!-- 定义resultMap将SELECT id id_,username username_ FROM USER 和User类中的属性作⼀个映射关系type:resultMap最终映射的java对象类型,可以使⽤别名id:对resultMap的唯⼀标识--><resultMap type="user" id="userResultMap"><!-- id表⽰查询结果集中唯⼀标识column:查询出来的列名property:type指定的pojo类型中的属性名最终resultMap对column和property作⼀个映射关系(对应关系)--><id column="id_" property="id"/><!--result:对普通名映射定义column:查询出来的列名property:type指定的pojo类型中的属性名最终resultMap对column和property作⼀个映射关系(对应关系)--><result column="username_" property="username"/></resultMap><!-- ⽤户信息综合查询#{userCustom.sex}:取出pojo包装对象中性别值${ername}:取出pojo包装对象中⽤户名称--><select id="findUserList" parameterType="erQueryVo"resultType="erCustom">SELECT * FROM USER<!--where可以⾃动去掉条件中的第⼀个and--><where><!-- 引⽤sql⽚段的id,如果refid指定的id不在本mapper⽂件中,需要前边加namespace --><include refid="query_user_where"></include><!-- 在这⾥还要引⽤其它的sql⽚段 --></where></select><!-- ⽤户信息综合查询总数parameterType:指定输⼊类型和findUserList⼀样resultType:输出结果类型--><select id="findUserCount" parameterType="erQueryVo" resultType="int">SELECT count(*) FROM USER<!--where可以⾃动去掉条件中的第⼀个and--><where><!-- 引⽤sql⽚段的id,如果refid指定的id不在本mapper⽂件中,需要前边加namespace --><include refid="query_user_where"></include><!-- 在这⾥还要引⽤其它的sql⽚段 --></where></select><!-- 在映射⽂件中配置很多sql语句 --><!-- 需求:通过id查询⽤户表的记录 --><!-- 通过 select执⾏数据库查询id:标识映射⽂件中的 sql将sql语句封装到mappedStatement对象中,所以将id称为statement的idparameterType:指定输⼊参数的类型,这⾥指定int型#{}表⽰⼀个占位符号#{id}:其中的id表⽰接收输⼊的参数,参数名称就是id,如果输⼊参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 resultType:指定sql输出结果的所映射的java对象类型,select指定resultType表⽰将单条记录映射成的java对象。

mybatis dynamic sql 用法

mybatis dynamic sql 用法

mybatis dynamic sql 用法MyBatis的动态SQL用于根据不同条件动态生成SQL语句,以便进行灵活的数据库操作。

下面是MyBatis动态SQL的用法示例:1. 使用if标签使用if标签可以根据条件判断是否包含某个SQL语句片段。

```<select id="getUserList" resultMap="userResultMap">SELECT * FROM usersWHERE 1=1<if test="username != null and username != ''">AND username = #{username}</if><if test="email != null and email != ''">AND email = #{email}</if></select>```2. 使用choose、when和otherwise标签使用choose、when和otherwise标签可以根据多个条件选择执行不同的SQL语句片段。

```<select id="getUserList" resultMap="userResultMap">SELECT * FROM users<where><choose><when test="username != null and username != ''">AND username = #{username}</when><when test="email != null and email != ''">AND email = #{email}</when><otherwise>AND status = 1</otherwise></choose></where></select>```3. 使用foreach标签使用foreach标签可以根据集合进行循环,动态生成SQL语句片段。

mybatis中实现动态SQL

mybatis中实现动态SQL

mybatis中实现动态SQL 动态SQL语句,也就意味着SQL语句不在是⼀成不变的⽽是具有多样性.if if的⽤法还是跟平常差不多的(不过没有else if也没有else)<update id="modify" parameterType="User">UPDATE `smbms_user`<trim prefix="set" suffixOverrides="," suffix="where id=#{id}"><if test="userCode!=null">`userCode` = #{userCode} , </if><if test="userName!=null">`userName` = #{userName} , </if><if test="userPassword!=null">`userPassword` = #{userPassword} , </if><if test="gender!=null">`gender` = #{gender} , </if><if test="birthday!=null">`birthday` = #{birthday} ,</if><if test="phone!=null">`phone` = #{phone} , </if><if test="address!=null">`address` = #{address} , </if><if test="userRole!=null">`userRole` = #{userRole} , </if><if test="createdBy!=null">`createdBy` = #{createdBy} , </if><if test="creationDate!=null">`creationDate` = #{creationDate} , </if><if test="modifyBy!=null">`modifyBy` = #{modifyBy}</if></trim></update>如上⾯的代码,如果是空的字段则不执⾏更新操作choose(when,otherwise) choose就相当于Java中的switch,when相当于case,otherwise相当于default<select id="getBill" resultType="Bill">SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.idWHERE 1=1<choose><!-- 条件为false则继续执⾏下⾯的when,反之亦然如此 --><when test="id!=null">AND b.providerId=#{id}</when><!-- 条件为true则不会执⾏otherwise,反之亦然如此 --><when test="proName!=null">AND p.proName LIKE CONCAT('%',#{proName},'%')</when><!-- 当都不满⾜时执⾏默认值 --><otherwise>AND p.proContact LIKE CONCAT('%张%')</otherwise></choose></select>where此标签可以忽略条件中多余的and和or如下SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id<where><if test="id!=null">AND b.providerId=#{id}</if><if test="proName!=null">AND p.proName LIKE CONCAT('%',#{proName},'%')</if></where>假设id为1 proName为北京两个if都满⾜条件时就会拼凑成这样SELECT*FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id WHERE b.providerId=1AND p.proName LIKE CONCAT('%北京%')其实解决这种情况不⽤where也是可以的,只需在前⾯加上⼀个为真的条件即可SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.idwhere 1=1<if test="id!=null">AND b.providerId=#{id}</if><if test="proName!=null">AND p.proName LIKE CONCAT('%',#{proName},'%')</if>效果也是⼀样的set此标签可以忽略多余的逗号UPDATE `smbms_user`<set><if test="userPassword!=null">`userPassword` = #{userPassword},</if></set>WHERE `id` = #{id} ;trim此标签属性如下1. prefix:通过⾃动识别是否有返回值,在trim包含的内容上加上前缀2. suffix:在trim包含的内容上加上后缀3. prefixoverrides:对trim包含内容的⾸部进⾏指定内容的忽略4. suffixoverrides;对于trim包含内容的尾部进⾏指定内容的忽略栗⼦1<!-- 添加内容前⾯加上 where 并且忽略 and或者or --><trim prefix="where" prefixOverrides="and|or"><if test="userRole!=null">and userRole=#{userRole}</if><if test="userName!=null and userName!=''">and erName like CONCAT('%',#{userName},'%')</if>order by creationDate DESC limit #(from),#(pageSize)</trim>栗⼦2UPDATE `smbms_user`<!-- 在内容前加上 set 并且忽略内容最后的逗号且在内容后⾯加上查询条件 --><trim prefix="set" suffixOverrides="," suffix="where id=#{id}"><if test="userCode!=null">`userCode` = #{userCode} , </if><if test="userName!=null">`userName` = #{userName} , </if></trim>foreach此标签的属性如下1. item表⽰集合中每⼀个元素进⾏迭代时的别名2. index:指定⼀个名字,⽤于表⽰每次迭代的位置.好⽐for循环中⾃定义的 i3. open表⽰该语句以什么开始,在in条件语句中以"("开始4. separator表⽰在每次进⾏迭代之间以什么符号作为分隔符,在in条件语句中以逗号进⾏分隔5. close表⽰以什么结束。

资料:MyBatis中的动态SQL

资料:MyBatis中的动态SQL

动态 SQLMyBatis 的强大特性之一便是它的动态SQL。

如果你有使用JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接SQL 语句有多么痛苦。

拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。

利用动态SQL 这一特性可以彻底摆脱这种痛苦。

通常使用动态SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态SQL 语言来改进这种情形,这种语言可以被用在任意的SQL 映射语句中。

动态SQL 元素和使用JSTL 或其他类似基于XML 的文本处理器相似。

在MyBatis 之前的版本中,有很多的元素需要来了解。

MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。

MyBatis 采用功能强大的基于OGNL 的表达式来消除其他元素。

•if•choose (when, otherwise)•trim (where, set)•foreachif动态SQL 通常要做的事情是有条件地包含where 子句的一部分。

比如:<select id="findActiveBlogWithTitleLike" resultType="Blog">SELECT * FROM BLOGWHERE state = ‘ACTIVE’<if test="title != null">AND title like #{title}</if></select>这条语句提供了一个可选的文本查找类型的功能。

如果没有传入“title”,那么所有处于“ACTIVE”状态的BLOG都会返回;反之若传入了“title”,那么就会把模糊查找“title”内容的BLOG结果返回(就这个例子而言,细心的读者会发现其中的参数值是可以包含一些掩码或通配符的)。

如果想可选地通过“title”和“author”两个条件搜索该怎么办呢?首先,改变语句的名称让它更具实际意义;然后只要加入另一个条件即可。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
</update>
演示示例6:改造用户表的修改操作-if+trim
16/37
学员操作—改造供应商表修改操作 (if+trim) 练习 需求说明
改造供应商表的修改功能,使用动态SQL完善此功能
提示
修改SQL语句 – 使用if+trim组合
完成时间:15分钟
17/37
共性问题集中讲解 常见问题及解决办法 代码规范问题 调试技巧
4/37
if元素 2-1 需求说明
改造查询用户信息列表的演示示例,增加查询条件
用户角色(根据角色id查询) 用户名称(模糊查询)
演示示例1:改造用户表的查询操作-多条件查询
5/37
if元素 2-2 问题 当传入用户角色参数为空的时候,检索结果为空?
正确结果
分析
所有用户角色下的用户数据
动态SQL
本章任务 完成超市订单系统-用户管理功能模块动态SQL的改造 完成超市订单系统-用户列表的分页实现
2/37
本章目标 熟练掌握动态SQL
3/37
动态SQL
基于OGNL表达式 完成多条件查询等逻辑实现 用于实现动态SQL的元素主要有
if trim where set choose(when、otherwise) foreach
演示示例2 :改造用户表的查询操作-if
6/37
Where元素 2-1
问题 当只传入参数:用户角色,而不传入参数:用户名称 的时候,控制台报SQL异常错误?
正确结果
分析
指定用户角色下的所有用户数据
原因
select * from smbms_user where and userRole = ?
原因
select * from smbms_user u,smbms_role r where erRole = r.id and erName like CONCAT (‘%’, ‘’, ‘%’) and erRole = null;
如何处理
if(判断参数):实现简单的条件判断
共性问题集中讲解
18/37
foreach元素 4-1
foreach
迭代一个集合,通常用于in条件 属性
item
index
collection:必须指定
list array map-key
open
separator
close
19/37
foreach元素 4-2
需求说明:
指定用户角色(1-n个),获取这些用户角色下的用Байду номын сангаас列表信息
改造供应商表的修改功能,使用动态SQL完善此功能
提示
修改SQL语句 – 使用if+set组合
完成时间:15分钟
13/37
共性问题集中讲解 常见问题及解决办法 代码规范问题 调试技巧
共性问题集中讲解
14/37
trim元素 2-1
trim
属性
prefix suffix prefixOverrides suffixOverrides
分析 查询SQL语句含有in条件
select * from smbms_user where userRole in (参数1,参数2,参数3…);
使用foreach实现
参数:用户角色列表 参数类型:数组
演示示例7:获取指定用户角色下用户列表-foreach_array
20/37
foreach 4-3
如何处理
where 7/37
Where元素 2-2 where
简化SQL语句中where条件判断 智能处理and和or
演示示例3:改造用户表的查询操作-if+where
8/37
学员操作—改造订单表查询 (if)
需求说明
练习 改造订单表的查询功能,使用动态SQL完善此功能 查询条件
需求说明:
改造上一个演示示例,使用foreach实现,参数类型改为List
演示示例8:获取指定用户角色下用户列表-foreach_list
21/37
学员操作—获取指定供应商列表下的订单列表 练习 需求说明
指定供应商列表(1-n个),获取这些供应商下的订单列表 信息
update smbms_user <trim prefix="set" suffixOverrides="," suffix="where id = #{id}">
<if test="userCode != null">userCode = #{userCode},</if> <if test="userName!= null">userCode = #{userName },</if> <if test="userPassword!= null">userPassword=#{userPassword },</if> </trim>
更灵活地去除多余关键字 替代where和set
演示示例5:改造用户表的查询操作-if+trim
15/37
trim元素 2-2 if+trim
使用if+trim替代if+set进行更新用户表数据,效果一样
示例
<update id ="modify" parameterType="User">
11/37
set
问题 更新用户表数据时,若某个参数为null时,会导致更新错误
正确结果
分析 若某个参数为null,则不需要更新,保持数据库原值
原因
SQL语句
如何处理
if set
演示示例4:改造用户表的修改操作-if+set
12/37
学员操作—改造供应商表修改操作 (if+set) 练习 需求说明
商品名称(模糊查询) 供应商id 是否付款
查询结果列列表
订单id、订单编码、商品名称、供应商id、供应商名称、订单金 额、是否付款、创建时间
提示 修改SQL语句 – 使用if
完成时间:15分钟
9/37
学员操作—改造供应商表查询(if+where)
练习 需求说明
改造供应商表的查询功能,使用动态SQL完善此功能 查询条件
供应商编码(模糊查询) 供应商名称(模糊查询)
查询结果列列表
供应商id、供应商编码、供应商名称、联系人、联系电话、传真、 创建时间
提示 修改SQL语句 – 使用if+where组合
完成时间:15分钟
10/37
共性问题集中讲解 常见问题及解决办法 代码规范问题 调试技巧
共性问题集中讲解
相关文档
最新文档