MyBatis之动态SQL-MyBatis学习03
Mybatis框架的搭建前面两篇笔记中已经写了,这里就不写了,这里使用到了一个新的jar包,log4j,点击官网下载
下载完之后使用以下三个jar包,如图所示:
并写一个log4j.propertise
资源文件,写完之后去mybatis核心配置文件中加载一下
# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE
# log4j.rootCategory=INFO, CONSOLE, LOGFILE
#单独设置SQL语句的输出级别为DEBUG级别
#方法级别设置
#log4j.logger.com.mappers.DeptMapper.queryAll=DEBUG
#类级别
#log4j.logger.com.mappers.DeptMapper=DEBUG
#包级别
log4j.logger.com.mappers=DEBUG
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= %m%n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D:/test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l%n
mybatis.xml
在如图所示位置配置加载log4j.properties
在上一篇笔记中,因为有不同的功能,所以写了根据Id查找,查找全部等方法,使得代码略显臃肿,这里可以使用动态SQL使得一些代码共用,不用写那么多方法。
首先写好对应的员工实体类:Emp
,属性名和数据库中表的字段名一致,再写EmpMapper接口和对应的映射文件
package com.pojo;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
public class Emp implements Serializable {
private int empno;
private String ename;
private String job;
private int mgr;
private double sal;
private double comm;
private Date hiredate;
private Integer deptno;
public Emp() {
}
public Emp(int empno, String name, String job, int mgr, double sal, double comm, Date hiredate, Integer deptno) {
this.empno = empno;
this.ename = name;
this.job = job;
this.mgr = mgr;
this.sal = sal;
this.comm = comm;
this.hiredate = hiredate;
this.deptno = deptno;
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String name) {
this.ename = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public double getComm() {
return comm;
}
public void setComm(double comm) {
this.comm = comm;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
@Override
public String toString() {
return "Emp{" +
"empno=" + empno +
", name='" + ename + '\'' +
", job='" + job + '\'' +
", mgr=" + mgr +
", sal=" + sal +
", comm=" + comm +
", hiredate=" + hiredate +
", deptno=" + deptno +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Emp emp = (Emp) o;
return empno == emp.empno &&
mgr == emp.mgr &&
Double.compare(emp.sal, sal) == 0 &&
Double.compare(emp.comm, comm) == 0 &&
Objects.equals(ename, emp.ename) &&
Objects.equals(job, emp.job) &&
Objects.equals(hiredate, emp.hiredate) &&
Objects.equals(deptno, emp.deptno);
}
@Override
public int hashCode() {
return Objects.hash(empno, ename, job, mgr, sal, comm, hiredate, deptno);
}
}
EmpMapper接口代码:
public interface EmpMapper {
/**
* @Description: 查询所有的员工数据、查询指定员工的数据
* @Param: [ename, deptno]
* @Return: java.util.List<com.pojo.Emp>
**/
List<Emp> queryAll(@Param("ename") String ename,@Param("deptno") Integer deptno);
/**
* @Description: 修改员工多个字段的数据
* @Param: [emp]
* @Return: int
**/
int updateEmp(Emp emp);
}
动态SQL:if
用于进行条件判断, test 属性用于指定判断条件. 为了拼接条件, 在 SQL 语句后强行添加 1=1 的恒成立条件
<?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">
<!--命名空间,当前xml文件所在位置-->
<mapper namespace="com.mappers.EmpMapper">
<!--if进行条件判断,获取对应的数据-->
<!--查询所有的员工数据、查询指定员工的数据,通过where 1=1 恒等式解决字符串拼接问题-->
<select id="queryAll" resultType="emp">
select * from emp where 1=1
<if test="ename!=null and ename!=''">
and ename = #{ename}
</if>
<if test="deptno!=null and deptno!=0">
and deptno = #{deptno}
</if>
</select>
</mapper>
测试类调用:
//1、加载会话
SqlSession session = SessionUtils.getSession();
//2、获取EmpMapper实例对象
EmpMapper mapper = session.getMapper(EmpMapper.class);
//3、获取信息
List<Emp> emps = mapper.queryAll("", 0);
emps.forEach(System.out::println);
//4、关闭
session.close();
动态SQL:where
用于管理 where 子句. 有如下功能:
- 如果没有条件, 不会生成 where 关键字
- 如果有条件, 会自动添加 where 关键字
- 如果第一个条件中有 and, 去除之
<?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">
<!--命名空间,当前xml文件所在位置-->
<mapper namespace="com.mappers.EmpMapper">
<!--
用于管理 where 子句. 有如下功能:
1. 如果没有条件, 不会生成 where 关键字
2. 如果有条件, 会自动添加 where 关键字
3. 如果第一个条件中有 and, 去除之
-->
<select id="queryAll" resultType="emp">
select * from emp
<where>
<if test="ename!=null and ename!=''">
and ename = #{ename}
</if>
<if test="deptno!=null and deptno!=0">
and deptno = #{deptno}
</if>
</where>
</select>
</mapper>
测试类调用:
//1、加载会话
SqlSession session = SessionUtils.getSession();
//2、获取EmpMapper实例对象
EmpMapper mapper = session.getMapper(EmpMapper.class);
//3、获取信息,参数换了结果也会变,自己测试
List<Emp> emps = mapper.queryAll("", 0);
emps.forEach(System.out::println);
//4、关闭
session.close();
动态SQL:choose…when…otherwise
这是一整套标签,类似于switch case…
<?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">
<!--命名空间,当前xml文件所在位置-->
<mapper namespace="com.mappers.EmpMapper">
<!--choose标签,类似于switch case,当满足when标签内部条件时,赋值,ortherwise是不满足when条件就加载它-->
<select id="queryAll" resultType="emp">
select * from emp
<where>
<choose>
<when test="ename!=null and ename!=''">
and ename = #{ename}
</when>
<when test="deptno!=null and deptno!=0">
and deptno = #{deptno}
</when>
<otherwise>and 1=1</otherwise>
</choose>
</where>
</select>
</mapper>
动态SQL:set
用于维护 update 语句中的 set 子句. 功能如下:
- 满足条件时, 会自动添加 set 关键字
- 会去除 set 子句中多余的逗号
- 不满足条件时, 不会生成 set 关键字
在EmpMapper接口当中添加一个update方法
/**
* @Description: 修改员工多个字段的数据
* @Param: [emp]
* @Return: int
**/
int updateEmp(Emp emp);
EmpMapper.xml:
<?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">
<!--命名空间,当前xml文件所在位置-->
<mapper namespace="com.mappers.EmpMapper">
<!--
用于维护 update 语句中的 set 子句. 功能如下:
1. 满足条件时, 会自动添加 set 关键字
2. 会去除 set 子句中多余的逗号
3. 不满足条件时, 不会生成 set 关键字
-->
<update id="updateEmp" parameterType="emp">
update emp
<set>
empno = #{empno}
<if test="ename!=null and ename!=''">
ename = #{ename},
</if>
<if test="deptno!=null and deptno!=''">
deptno = #{deptno},
</if>
</set>
where empno = #{empno}
</update>
</mapper>
测试的话和之前的修改测试类一致。
动态SQL:trim
用于在前后添加或删除一些内容
- prefix, 在前面添加内容
- prefixOverrides, 从前面去除内容
- su?ix, 向后面添加内容
- su?ixOverrides, 从后面去除内容
<?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">
<!--命名空间,当前xml文件所在位置-->
<mapper namespace="com.mappers.EmpMapper">
<!--
使用trim代替where标签
用于在前后添加或删除一些内容
1. prefix, 在前面添加内容
2. prefixOverrides, 从前面去除内容
3. suffix, 向后面添加内容
4. suffixOverrides, 从后面去除内容
-->
<select id="queryAll" resultType="emp">
select * from emp
<trim prefix="where" prefixOverrides="and">
<if test="ename!=null and ename!=''">
and ename = #{ename}
</if>
<if test="deptno!=null and deptno!=0">
and deptno = #{deptno}
</if>
</trim>
</select>
</mapper>
动态SQL:bind
用于对数据进行再加工, 用于模糊查询
<?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">
<!--命名空间,当前xml文件所在位置-->
<mapper namespace="com.mappers.EmpMapper">
<!--模糊匹配-->
<select id="queryAll" resultType="emp">
select * from emp
<where>
<if test="ename!=null and ename!=''">
<bind name="ename" value="'%'+ename+'%'"/>
and ename like #{ename}
</if>
</where>
</select>
</mapper>
动态SQL:foreach
用于在 SQL 语句中遍历集合参数, 在 in 查询中使用
- collection: 待遍历的集合
- open: 设置开始符号
- item: 迭代变量
- separator: 项目分隔符
- close: 设置结束符
这个在我的上一篇博客中批量增删改数据那里出现了很多次,这里就不介绍了,有需要的自行前往:foreach使用
动态SQL:sql include
封装一段SQL语句,实现代码复用
<sql id="mySql"> id, username, password </sql>
<select id="selIn" parameterType="list" resultType="user">
select <include refid="mySql" /> from t_user where id in
<foreach collection="list" open="(" separator="," close=")" item="item">
#{item}
</foreach>
</select
动态SQL就介绍到这里了,大家可以相互交流学习。
这里就不介绍了,有需要的自行前往:foreach使用
动态SQL:sql include
封装一段SQL语句,实现代码复用
<sql id="mySql"> id, username, password </sql>
<select id="selIn" parameterType="list" resultType="user">
select <include refid="mySql" /> from t_user where id in
<foreach collection="list" open="(" separator="," close=")" item="item">
#{item}
</foreach>
</select
动态SQL就介绍到这里了,大家可以相互交流学习。