Mybatis动态SQL——if,where,trim,choose,set.foreach的用法
知识点:主要介绍mybatis中,动态sql中的if,where,trim,set,foreach的用法
自学谷粒学院mybatis学习视频,参考mybatis官方文档
java包:log4j.jar
mybatis-3.4.1jar
mysql-connector-java-5.1.37-bin.jar
实体类:
Employee.java类
package com.hand.mybatis.bean;
public class Employee {
private Integer eId;
private String eName;
private Integer gender;
private String email;
private Department dept;
public Employee() {
super();
}
public Employee(Integer eId,String eName, Integer gender, String email) {
super();
this.eId=eId;
this.eName = eName;
this.gender = gender;
this.email = email;
}
public Employee(Integer eId, String eName, Integer gender, String email, Department dept) {
super();
this.eId = eId;
this.eName = eName;
this.gender = gender;
this.email = email;
this.dept = dept;
}
public Integer geteId() {
return eId;
}
public void seteId(Integer eId) {
this.eId = eId;
}
public String getEName() {
return eName;
}
public void setEname(String ename) {
this.eName = ename;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Employee [eId=" + eId + ", ename=" + eName + ", gender=" + gender + ", email=" + email + "]";
}
}
Department.java实体类
package com.hand.mybatis.bean;
import java.util.List;
public class Department {
private Integer id;
private String departName;
private List<Employee> empList;
public Department() {
super();
}
public Department(Integer id) {
super();
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDepartName() {
return departName;
}
public void setDepartName(String departName) {
this.departName = departName;
}
public List<Employee> getEmpList() {
return empList;
}
public void setEmpList(List<Employee> empList) {
this.empList = empList;
}
@Override
public String toString() {
return "Department [id=" + id + ", departName=" + departName + "]";
}
}
EmployeeMapperDynamicSQL.java mapper接口
package com.hand.mybatis.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.hand.mybatis.bean.Employee;
public interface EmployeeMapperDynamicSQL {
//使用if
List<Employee> getEmpsByconditionIf(Employee employee);
//使用trim()
List<Employee> getEmpsByconditionTrim(Employee employee);
//使用choose
List<Employee> getEmpsByconditionChoose(Employee employee);
//跟新字段(set)
int updateEmp(Employee employee);
//根据list集合条件,查询集合(foreach遍历list集合条件)
List<Employee> getEmpsByConditionForeach(@Param("idlist") List<Integer> idlist);
//批量保存(foreach插入多条数据)
int addEmpsBatch(@Param("emps") List<Employee> emps);
}
EmployeeMapperDynamicSQL.xml 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.hand.mybatis.dao.EmployeeMapperDynamicSQL">
<!-- • if
• choose (when, otherwise):分支选择,swtich-case
如果带了eid就用eid查询,如果带了eName就用eName查询,只会进入其中一个
• trim 字符串截取(where(封装查询条件), set(封装修改条件))
• foreach -->
<!-- //使用if -->//一般if用在sql条件的多字段拼接,if判断字段不为null,"",等情况下
<!-- public List<Employee> getEmpsByconditionIf(Employee employee); -->
<!-- 查询员工,要求,携带了那个字段查询条件就带上那个字段的值 -->
<select id="getEmpsByconditionIf" resultType="com.hand.mybatis.bean.Employee">
select * from emp
<where>
<!-- where 1=1 --><!-- test,判断表达式(OGNL)
从参数中取值判断,遇见特殊符号去写转义字符
w3c: ISO 8859-1
&&,&&
"" ""-->
<if test="eId!=null">
eid=#{eId}
</if>
<if test="eName!=null && eName!= """>
and ename like #{eName} //and一般放在字段前面,《where》标签不会报错
</if>
<if test="email!=null and email.trim()!="""> //一些字符如果出错,可以ws3=>HTML ISO-8859-1参考手册里查找对应的字符,如mybatis里写
and email=#{email} 大小与号(><)出错,改成<(<)>(>)则不会报错
</if>
<!-- ognl会进行字符串与数字的转换判断“0”==0 -->
<if test="gender==0 or gender==1">
and gender=#{gender}
</if>
</where>
</select>
<!-- 使用trim -->
<!-- List<Employee> getEmpsByconditionTrim(Employee employee); -->
<select id="getEmpsByconditionTrim" resultType="com.hand.mybatis.bean.Employee">
select * from emp
<!--后面多出来的and或者or where 标签不能解决
trim标签中是整个字符串拼接后的结果
prefix="":给拼接后的整个字符串加一个前缀
prefixOverrides="":前缀覆盖,去掉整个字符串前面多余的字符
suffix="":后缀 suffix给拼接后的整个字符串加一个后缀
suffixOverrides="" 后缀覆盖,去掉整个字符串后面多余的字符-->
<!-- 自定义字符串的截取规则 -->
<trim prefix="where" suffixOverrides="and">//这里意思是在条件最前加where,去掉每个if条件里的字段后面多余的and,就不会报错
<if test="eId!=null">
eid=#{eId} and
</if>
<if test="eName!=null && eName!= """>
ename like #{eName} and
</if>
<if test="email!=null and email.trim()!=""">
email=#{email} and
</if>
<!-- ognl会进行字符串与数字的转换判断“0”==0 -->
<if test="gender==0 or gender==1">
gender=#{gender}
</if>
</trim>
</select>
<!-- //使用choose
List<Employee> getEmpsByconditionChoose(Employee employee); -->
<select id="getEmpsByconditionChoose" resultType="com.hand.mybatis.bean.Employee">
select * from emp
<where>
<!-- 如果带了eid就用eid查询,如果带了eName就用eName查询,只会进入其中一个 -->
<choose>
<when test="eId!=null">//只会选择一条路径,若同时有两个字段传入,则优先选择前面的字段
eid=#{eId}
</when>
<when test="eName!=null">
ename=#{eName}
</when>
<when test="gender!=null">
gender=#{gender}
</when>
<when test="email!=null">
email=#{email}
</when>
<otherwise>
1=1 //当所有字段都为空时,查询原表中所有记录
</otherwise>
</choose>
</where>
</select>
<!-- //跟新字段 传那个字段跟新那个字段(使用set)
void updateEmp(Employee employee); -->
<update id="updateEmp">
UPDATE emp
<set> <!-- //方法一:使用set标签去掉多余的,号 -->
<if test="eName!=null">
ename=#{eName},
</if>
<if test="gender!=null">
gender=#{gender},
</if>
<if test="email">
email=#{email}
</if>
</set>
<!-- 方法二:使用trim标签去掉多余的,号
<trim prefix="set" suffixOverrides=",">
<if test="eName!=null">
ename=#{eName},
</if>
<if test="gender!=null">
gender=#{gender},
</if>
<if test="email">
email=#{email}
</if>
</trim> -->
WHERE eid=#{eId}
</update>
<!-- //根据list集合条件,查询集合(foreach遍历list集合条件)
List<Employee> getEmpsByConditionForeach(List<Integer> idlist); -->
<select id="getEmpsByConditionForeach" resultType="com.hand.mybatis.bean.Employee">
<!-- select * from emp where eid in(101,102,103) 方法一:in(1,2,3)--> //原始传入多个id的情况,用in(1,2,3)
select * from emp where eid in
<!--
collection:指定要遍历的集合
list类型的参数会特殊处理封装在map中,map的key就是list
item:将当前遍历的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
index:索引,遍历list的时候,index就是索引,item就是当前值
遍历map的时候index表示就是map的key,item就是map的值
#{变量名}:每个元素之间的分隔符
-->
<foreach collection="idlist" item="itemid" separator=","
open="(" close=")">
#{itemid}
</foreach>
</select>
<!-- 批量保存(foreach插入多条数据两种方法)
int addEmpsBatch(@Param("emps") List<Employee> emps); -->
<!-- MySQL下批量保存,可以foreach遍历 mysql支持values(),(),()语法 --> //推荐使用
<insert id="addEmpsBatch">
INSERT INTO emp(ename,gender,email,did)
VALUES
<foreach collection="emps" item="emp" separator=",">
(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
</foreach>
</insert>
<!-- 这种方式需要数据库连接属性allowMutiQueries=true的支持 --> //在jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true
<!-- <insert id="addEmpsBatch"> 后加上allowMultiQueries=true
<foreach collection="emps" item="emp" separator=";"> 表示可以多次执行insert into语句,中间;不会错
INSERT INTO emp(ename,gender,email,did)
VALUES(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
</foreach>
</insert> -->
</mapper>
代码:https://github.com/shuaishuaihand/mybatis.git
Mybatis动态SQL——if,where,trim,choose,set.foreach的用法的更多相关文章
- MyBatis从入门到精通(第4章):MyBatis动态SQL【if、choose 和 where、set、trim】
(第4章):MyBatis动态SQL[if.choose 和 where.set.trim] MyBatis 的强大特性之一便是它的动态 SQL.MyBatis 3.4.6版本采用了功能强大的OGNL ...
- mybatis动态sql中的trim标签的使用
trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码: 1. select * from user <trim prefix="WHERE" p ...
- mybatis动态sql中的trim标签的使用(转)
trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码: 1. select * from user <trim prefix="WHERE" p ...
- mybatis中sql标签、where标签、foreach标签用法
<sql id="query_user_where"> <!-- 如果 userQueryVo中传入查询条件,再进行sql拼接--> <!-- tes ...
- mybatis 动态SQL .2
目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,otherwise) 语句 5.动态SQL:tri ...
- Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?
Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理 是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能. Mybatis 提供了 9 种动态 sql ...
- mybatis动态sql以及分页
1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 1.mybatis动态sql If.trim.foreach If 标签判断某一字段是否为空 &l ...
- MyBatis动态SQL之一使用 if 标签和 choose标签
bootstrap react https://segmentfault.com/a/1190000010383464 xml 中 < 转义 to thi tha <if test=&qu ...
- MyBatis基础入门《十九》动态SQL(set,trim)
MyBatis基础入门<十九>动态SQL(set,trim) 描述: 1. 问题 : 更新用户表数据时,若某个参数为null时,会导致更新错误 2. 分析: 正确结果: 若某个参数为nul ...
随机推荐
- mysql - json - look up subobjects or nested values directly by key or array index without reading all values
w https://dev.mysql.com/doc/refman/5.7/en/json.html
- OnePy--构建属于自己的量化回测框架
本文主要记录我构建量化回测系统的学习历程. 被遗弃的项目:Chandlercjy/OnePy_Old 新更新中的项目:Chandlercjy/OnePy 目录 1. 那究竟应该学习哪种编程语言比较好呢 ...
- linux创建lvm分区
创建LVM分区 shell> fdisk /dev/xvdb #### 选择磁盘 Command (m for help): m #### 帮助 Command action a toggle ...
- python 字符串的格式化
python字符串的格式化分为两种:1)% 方式 2)str.format() 方式. str.format() 是比 % 较新的方式, 大多数的 Python 代码仍然使用 % 操作符.但最 ...
- 22.解决 eclipse 与 AS 共用 SDK 导致 eclipse ADT 无法使用的问题
相信很多同学在从eclipse 转 AS 都会遇到这个问题,因为方便所以共用了一个sdk 目录,但是AS 会主动更新sdk,然而手贱的跟新了一夜,再打开eclipse的时候瞬间呆滞了,这一夜发生什么了 ...
- C语言中const和数组
C语言中const的用法 const:在定义变量时,如果使用关键字const,那就表示限制这个变量值不允许被改变. (1) 修饰变量 const离谁越近,谁的值就不能改变. int const ...
- [golang note] 匿名组合
匿名组合 golang也提供了继承机制,但采用组合的文法,因此称为匿名组合.与其他语言不同, golang很清晰地展示出类的内存布局是怎样的. • 非指针方式组合 ▶ 基本语法 // 基类 type ...
- Vmwaretools
先下载Vmwaretools 这一步是设置ubuntu的超级用户root的密码我设置为dong 转换为root用户操作 执行 perl程序 然后就是一路Enter,开始关机重启就行了 来自为知笔记 ...
- SqoopFlume、Flume、HDFS之间比较
Sqoop Flume HDFS Sqoop用于从结构化数据源,例如,RDBMS导入数据 Flume 用于移动批量流数据到HDFS HDFS使用 Hadoop 生态系统存储数据的分布式文件系统 Sqo ...
- 4. Median of Two Sorted Arrays(2个有序数组的中位数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...