MyBatis之动态SQL-MyBatis学习03

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 子句. 有如下功能:

  1. 如果没有条件, 不会生成 where 关键字
  2. 如果有条件, 会自动添加 where 关键字
  3. 如果第一个条件中有 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 子句. 功能如下:

  1. 满足条件时, 会自动添加 set 关键字
  2. 会去除 set 子句中多余的逗号
  3. 不满足条件时, 不会生成 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

用于在前后添加或删除一些内容

  1. prefix, 在前面添加内容
  2. prefixOverrides, 从前面去除内容
  3. su?ix, 向后面添加内容
  4. 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 查询中使用

  1. collection: 待遍历的集合
  2. open: 设置开始符号
  3. item: 迭代变量
  4. separator: 项目分隔符
  5. 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就介绍到这里了,大家可以相互交流学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值