04MyBatis动态sql
1.3where标签-步骤2
创建参数类domain.PUser
public class Puser{ String sex; String deptid; //这里省略对应的get、set方法 }
在app.Test中两种情况调试执行
表名department(部门信息表)
id 部门id 整型 自动递增 主键 name 部门名称 字符串 10位 非空
数据 要求mybatis框架,mysql数据库,根据用户输入的性别值 查询user表所有记录,输出用户名、对应部门名称,若用户 没有输入,则查询所有。
3
1.1if标签-分析
// 3.执行sql语句 PUser pUser = new PUser(); //情况1,有用户名 pUser.setUsername("张三"); //情况2,有部门名 pUser.setDepartName("开发一部"); //情况3,有性别 pUser.setSex("1"); List<User> list = sqlSession.selectList("findAllUser“, pUser ); // 4.输出结果 for (User user : list) { System.out.println(user.getUsername()+":"+user.getDeptid().getName()); }
id 部门id 整型 自动递增 主键 name 部门名称 字符串 10位 非空
数据 要求mybatis框架,mysql数据库,根据用户名、部门名、 或者性别值(三选一)查询user表所有记录,输出用户名和 对应部门名,若用户名没choose标签-分析
例子2分析:sql是三选一(多选一)
// 3.执行sql语句 PUser pUser = new PUser(); //情况1 pUser.setDeptid("1"); pUser.setSex("0"); //情况2 //情况3 pUser.setDeptid("1"); //情况4 pUser.setSex("0"); List<User> list = sqlSession.selectList("findAllUser",pUser); // 4.输出结果 for (User user : list) { System.out.println(user.getUsername()); }
id 部门id 整型 自动递增 主键 name 部门名称 字符串 10位 非空
数据 要求mybatis框架,mysql数据库,根据部门id、性别、查 询user表所有记录,输出用户名,注意:有几个查几个条件 ,没有条件查询所有
11
1.3where标签-分析
例子3分析:单表查询,但sql可能是以下4种之一
有输入用户名条件,比如name=“张三”
SELECT * FROM department,user where user.deptid=department.id and username=“张三”
无用户名条件,有部门条件,如name=“开发一部”
SELECT * FROM department,user where user.deptid=department.id and =“开发一部”
例子1分析:sql是二选一
有输入性别条件,比如sex=0
SELECT * FROM department,user where user.deptid=department.id and sex=0
无输入性别条件
SELECT * FROM department,user where user.deptid=department.id
5
1.1if标签-步骤2
创建参数类domain.PUser
public class Puser{ String sex; //这里省略对应的get、set方法 }
在app.Test中两种情况调试执行
// 3.执行sql语句 PUser pUser = new PUser(); pUser.setSex(“0”); //情况1,有条件 List<User> list = sqlSession.selectList("findAllUser“, pUser ); //情况2,无条件 List<User> list = sqlSession.selectList("findAllUser“); // 4.输出结果 for (User user : list) { System.out.println(user.getUsername()+":"+user.getDeptid().getNa me()); }
mybatis使用if标签能够自动进行匹配
4
1.1if标签-步骤1
在UserMapper.xml的select标签中做如下修改
<select id="findAllUser" parameterType=“domain.PUser" resultMap="resultUser"> SELECT * FROM department,user where user.deptid=department.id <if test="sex!=null"> and sex=#{sex} </if> </select> 说明:if标签的test=“sex!=null”是判断PUser.sex的 值是否为空,不为空则在上面的sql语句中加入and sex=#{sex},否则不加
no 班级编号 字符串 10位 主键 name 名称 字符串 10位 非空
要求用mybatis框架编程,mysql数据库,根据[ 学号或姓名]和班级编号两个条件查user表所有记 录,输出学生姓名。注意:学号与姓名是二选一, 学号、姓名支持模糊查,没条件查所有
15
<select id="findAllUser" parameterType=“domain.PUser" resultMap="resultUser"> SELECT * FROM department,user where user.deptid=department.id <choose> <when test="username!=null"> and ername=#{username} </when> <when test="departName!=null"> and =#{departName} </when> <otherwise> and user.sex=#{sex} </otherwise> </choose> </select> 说明:上例if标签部分在本例中变成choose标签三选一,when标签与if标签的 含义类似,otherwise标签是前面条件都不满足的最后一个默认选择
部门和性别都有,比如部门id=1,性别=0
SELECT * FROM user where deptid=1 and sex=0 SELECT * FROM user SELECT * FROM user where sex=0
无条件
只有性别条件,如sex=0
只有部门条件,如部门id=1 问题:where语句怎么写? mybatis使用where标签能够自动匹配
探讨:整型的参数这里都被弄成了字符串,为啥要这么做?
14
1.4作业
查询学生信息表student所有记录,条件查询
表名student(学生信息表)
no 学号 字符串 10位 主键 name 姓名 字符串 8位 非空 classno 班级编号 字符串 10位 外键
表名class(班级信息表)
12
SELECT * FROM user where deptid=1
1.3where标签-步骤1
在UserMapper.xml的select标签中做如下修改
<select id="findAllUser" parameterType=“domain.PUser" resultMap="resultUser"> SELECT * FROM user where user.deptid=department.id <if test="sex!=null"> and sex=#{sex} </if> </select> 说明:if标签的test=“sex!=null”是判断PUser.sex的 值是否为空,不为空则在上面的sql语句中加入and sex=#{sex},否则不加
9
1.2choose标签-步骤2
修改参数类domain.PUser
public class Puser{ String sex; String departName; String username; //这里省略对应的get、set方法 }
在app.Test中两种情况调试执行
10
1.3where标签-例子描述
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在xml中支持的几种常用标签
Mybatis中的动态SQL在xml中⽀持的⼏种常⽤标签mybatis3之后,采⽤了功能强⼤的OGNL表达式语⾔消除了许多其它繁琐的标签,现在动态SQL在xml中⽀持的⼏种标签: ifchoose(when、otherwise)trim(where、set)foreachbind⼀.if标签if标签通常⽤于where语句中,通过判断参数值来决定是否使⽤某个查询条件,它也经常⽤于UPDATE语句中判断是否更新某⼀个字段,还可以再INSERT语句中⽤来判断是否插⼊某个字段的值。
1.1 在where条件中使⽤if⽤法:含义就是当if满⾜时,就执⾏标签体中的内容。
需求:准备如下数据表,当只输⼊⽤户名的时候,就根据这个⽤户名进⾏模糊查询匹配的⽤户;当只输⼊邮箱时,就根据邮箱完全匹配⽤户胡;当两者都同时输⼊时,就需要⽤这两个条件去查询匹配的⽤户。
表格:贴下关键代码:(1)controller@PostMapping("/selectByUser")public List<SysUser> selectByUser(){SysUser sysUser=new SysUser();sysUser.setUserName("tes");return userService.selectByUser(sysUser);}说明:这⾥只传⼊了userName。
⽽userEmail为null(2)service实现类1 @Override2public List<SysUser> selectByUser(SysUser sysUser) {3return userMapper.selectByUser(sysUser);4 }View Code(3)mapper接⼝List<SysUser> selectByUser(SysUser sysUser);(4)mapper.xm<select id="selectByUser" resultType="com.example.demo.dao.SysUser"> select id, user_name userName,user_password userPassword,user_email userEmail,user_info userInfo,head_img headImg,created_time createTimefrom sys_userwhere 1=1<if test="userName!=null and userName!=''">and user_name like concat('%',#{userName},'%')</if><if test="userEmail!=null and userEmail!=''">and user_email=#{userEmail}</if></select>说明:1.if标签内有⼀个必填的属性test,test的值是⼀个符合OGNL要求的判断表达式,表达式的结果可以认为是ture或者false.2.当有多个判断条件时,可以使⽤and或者or进⾏搭配。
MyBatis执行动态SQL语句详解
MyBatis执⾏动态SQL语句详解⼤家基本上都知道如何使⽤ MyBatis 执⾏任意 SQL,使⽤⽅法很简单,例如在⼀个 XXMapper.xml 中:<select id="executeSql" resultType="map">${_parameter}</select>你可以如下调⽤:sqlSession.selectList("executeSql", "select * from sysuser where enabled = 1");或者你可以在 XXMapper.java 接⼝中定义如下⽅法:List<Map> executeSql(String sql);然后使⽤接⼝调⽤⽅法:xxMapper.executeSql("select * from sysuser where enabled = 1");上⾯这些内容可能都会,下⾯在此基础上再复杂⼀点。
假如像上⾯SQL中的enabled = 1我想使⽤参数⽅式传值,也就是写成 enabled = #{enabled},如果你没有遇到过类似这种需求,可能不明⽩为什么要这么写,举个例⼦,要实现⼀种动态查询,可以在前台通过配置 SQL,提供⼀些查询条件就能实现⼀个查询的功能(为了安全,这些配置肯定是开发或者实施做的,不可能让⽤户直接操作数据库)。
针对这个功能,使⽤ MyBatis 实现起来相当容易。
配置 SQL 肯定要执⾏,⽤上⾯讲的这种⽅式肯定可以执⾏ SQL,如何提供参数呢?参数就是enabled = #{enabled}中的#{enabled}部分。
如果再多⼀些条件,⼀个配置好的 SQL 如下:select * from sysuserwhere enabled = #{enabled}and userName like concat('%',#{userName},'%')这种情况下,该怎么⽤ MyBatis 实现呢?⾸先 XML 中修改如下:<select id="executeSql" resultType="map">${sql}</select>接⼝中的⽅法修改为:List<Map> executeSql(Map map);然后调⽤⽅法:Map map = new HashMap();//这⾥的 sql 对应 XML 中的 ${sql}map.put("sql", "select * from sysuser "+ " where enabled = #{enabled} "+ " and userName like concat('%',#{userName},'%')");//#{enabled}map.put("enabled", 1);//#{userName}map.put("userName", "admin");//接⼝⽅式调⽤List<Map> list = xxMapper.executeSql(map);//sqlSession⽅式调⽤sqlSession.selectList("executeSql", map);有了这个SQL之后,就可以将 enabled 和 userName 作为条件提供给⽤户。
mybatis的动态sql中修改的用法
mybatis的动态sql中修改的用法MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
在MyBatis中,动态SQL是一个非常实用的功能,可以用来生成复杂的SQL语句。
动态SQL包括动态SQL过滤器和动态SQL 映射文件。
本文将重点介绍MyBatis中动态SQL的修改用法。
一、动态SQL的用法MyBatis允许我们在XML映射文件中使用#{...}来创建动态SQL。
#{...}是一个变量占位符,可以用来插入变量或者表达式的结果。
通过使用#{...},我们可以动态地构建SQL语句,从而实现根据不同的条件来生成不同的查询语句。
二、修改动态SQL的方法1.使用#{}替代${}:${}将会被替换成Java代码字符串,而#{}则允许插入变量或表达式的结果。
使用#{...}可以避免SQL注入攻击,因为它只允许特定类型的字符被插入。
2.使用OGNL(Object-GraphNavigationLibrary)表达式:OGNL 表达式允许我们使用Java代码来访问对象的属性和方法。
在MyBatis 中,我们可以使用OGNL表达式来动态地访问对象的属性或调用方法,从而生成复杂的SQL语句。
3.使用SQL片段和动态SQL过滤器:MyBatis提供了一些内置的SQL片段,如SELECT、INSERT、UPDATE和DELETE等。
我们可以通过在XML映射文件中使用这些SQL片段来构建基本的动态SQL语句。
此外,MyBatis还支持自定义SQL过滤器,我们可以使用这些过滤器来扩展MyBatis的动态SQL功能。
三、修改动态SQL的示例下面是一个使用#{}和OGNL表达式来修改动态SQL的示例:假设我们有一个用户表,其中包含id、name和email三个字段。
我们想要根据不同的条件来查询用户数据。
首先,在XML映射文件中定义一个查询语句:```xml<selectid="selectUsers"resultType="er">SELECT*FROMuserWHERE1=1<iftest="name!=null">ANDname=#{name}</if><iftest="email!=null">ANDemail=#{email}</if></select>```在上述示例中,我们使用了#{...}来代替字符串插入,并且使用了OGNL表达式来访问用户的name和email属性。
MyBatis动态SQL————MyBatis动态SQL标签的用法
MyBatis动态SQL————MyBatis动态SQL标签的⽤法1.MyBatis动态SQLMyBatis 的强⼤特性之⼀便是它的动态 SQL,即拼接SQL字符串。
如果你有使⽤ JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。
拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。
利⽤动态 SQL 这⼀特性可以彻底摆脱这种痛苦。
通常使⽤动态 SQL 不可能是独⽴的⼀部分,MyBatis 当然使⽤⼀种强⼤的动态 SQL 语⾔来改进这种情形,这种语⾔可以被⽤在任意的 SQL 映射语句中。
动态 SQL 元素和使⽤ JSTL 或其他类似基于 XML 的⽂本处理器相似。
在 MyBatis 之前的版本中,有很多的元素需要来了解。
MyBatis 3 ⼤⼤提升了它们,现在⽤不到原先⼀半的元素就可以了。
MyBatis 采⽤功能强⼤的基于 OGNL 的表达式来消除其他元素。
2.动态SQL标签:if,choose (when, otherwise),trim (where, set),foreach2.1 if标签:直接上代码<select id="queryByIdAndTitle"resultType="Blog">SELECT * FROM BLOGWHERE 1=1<if test="id!= null and title!=null">AND id=#{id} and title=#{title}</if></select>注:if标签⼀般⽤于⾮空验证,如上例,若id为空,if标签⾥的代码,将不会执⾏,反之,则会执⾏。
2.2 choose(when,otherwise)标签:直接上代码<select id="queryBy"resultType="Blog">SELECT * FROM BLOG WHERE 1=1<choose><when test="title != null">AND title like #{title}</when><otherwise>AND id= 1</otherwise></choose></select>注:choose(when,otherwise)标签相当于switch(case,default) ,如上例,若title 为空,when标签⾥的代码,将不会执⾏,默认执⾏otherwise 标签⾥⾯的代码。
MyBatis动态Sql语句
MyBatis动态Sql语句MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法MyBatis中用于实现动态SQL的元素主要有:ifchoose(when,otherwise)trimwheresetforeach1、if对属性进行判断,如果不为空则执行判断条件[html] view plain copy<select id="selectByCriteria" parameterType="com.mucfc.dto.Student" resultMap="BaseResultMap">select * from t_studentwhere<if test="stuId != null and stuId !=''">STU_ID = #{stuId}</if><if test="stuName != null and stuName !=''" >and STU_NAME = #{stuName}</if><if test="stuClass != null and stuClass !=''">and STU_CLASS = #{stuClass}</if><if test="stuSex != null and stuSex !=''">and STU_SEX=#{stuSex}</if><if test="stuAge != null and stuAge !=''">and STU_AGE=#{stuAge}</if></select>来看看结果:这是从web页面输入的参数这是输出的结果这是打印出来的Sql语句从结果可以看出,只有在条件不为空的时候,属性才会赋值。
MyBatis 动态批量插入sql语句方法
MyBatis 动态批量插入sql语句方法MyBatis实现动态批量插入的SQL语句可以采用foreach标签,具体方法如下:XML映射文件:xml<insert id="batchInsert">insert into USER (NAME, AGE)<foreach collection="list" item="item" separator="union all">(#{},#{item.age})</foreach></insert>Java代码:javaList<User> list = new ArrayList<>();list.add(new User("John", 20));list.add(new User("Tom", 25));list.add(new User("Jack", 30));SqlSession session = sqlSessionFactory.openSession();UserMapper mapper = session.getMapper(UserMapper.class);mapper.batchInsert(list);mit();最后生成的SQL语句为:sqlinsert into USER (NAME, AGE)values('John', 20)union allvalues('Tom', 25)union allvalues('Jack', 30)通过foreach标签,动态拼接了多条insert语句,并使用union all连接,最终实现了批量插入。
主要特点:1. 将需要批量插入的数据封装在List集合中2. 在foreach标签内,使用#{item.属性}的方式访问集合中的每条记录3. 使用separator属性,指定union all连接多条insert语句4. 将封装好的List集合,作为参数传入mapper方法,执行批量插入批量插入能有效减少数据库交互次数,提高插入效率。
mybatis 动态 sql 注解方式
mybatis 动态sql 注解方式MyBatis是一个支持动态SQL的持久层框架,你可以使用注解方式来编写动态SQL。
以下是使用MyBatis注解进行动态SQL的一些示例:1. @SelectProvider注解:通过该注解可以指定一个Provider类,Provider类中定义了动态SQL的逻辑。
```java@SelectProvider(type = UserSqlProvider.class, method = "getUserById")User getUserById(@Param("id") int id);```2. Provider类:在Provider类中,你可以使用`@ProviderMethod`注解来定义动态SQL的方法。
```javapublic class UserSqlProvider {public String getUserById(int id) {return new SQL() {{SELECT("*");FROM("user");WHERE("id = #{id}");}}.toString();}}```3. @UpdateProvider、@InsertProvider、@DeleteProvider注解:用于更新、插入、删除操作的动态SQL。
```java@UpdateProvider(type = UserSqlProvider.class, method = "updateUser")int updateUser(User user);``````javapublic class UserSqlProvider {public String updateUser(User user) {return new SQL() {{UPDATE("user");SET("username = #{username}");WHERE("id = #{id}");}}.toString();}}```这里的`SQL`类是MyBatis提供的一个辅助类,用于构建SQL语句。
mybatis动态sql语句if基本语法
mybatis动态sql语句if基本语法MyBatis是一款流行的Java持久层框架,它提供了许多强大的功能,其中包括动态SQL语句的支持。
在MyBatis的动态SQL语句中,if 语句是非常常用的一个元素。
本文将介绍MyBatis动态SQL语句中if语句的基本语法。
1. 简单的if语句最基本的if语句是通过在SQL语句中使用if标签来实现的。
if 标签的使用格式如下:```<if test="条件">SQL语句</if>```这里的条件是一个表达式,如果表达式为true,则执行if标签内的SQL语句。
2. if-else语句在MyBatis的动态SQL语句中,我们还可以使用if-else语句来实现条件判断。
if-else语句的使用格式如下:```<if test="条件">SQL语句1</if><otherwise>SQL语句2</otherwise>```如果条件为true,则执行SQL语句1;否则执行SQL语句2。
3. 嵌套if语句在MyBatis的动态SQL语句中,我们可以使用嵌套if语句来进行多重条件判断。
嵌套if语句的使用格式如下:```<if test="条件1">SQL语句1<if test="条件2">SQL语句2</if></if>```如果条件1为true,则执行SQL语句1;如果条件2也为true,则执行SQL语句2。
4. if语句中使用参数在MyBatis的动态SQL语句中,我们可以使用参数来动态地构建SQL语句。
参数的使用格式如下:```<if test="参数 != null">SQL语句</if>```如果参数不为null,则执行if标签内的SQL语句。
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插入语句。
