Mybatis-动态SQL

发布于:2024-04-29 ⋅ 阅读:(29) ⋅ 点赞:(0)

黑马程序员JavaWeb开发教程


借用之前的根据条件查询用户 五 5.演示根据条件查询

一、Mybatis-XML映射文件

1、XML映射文件

(1)规范

  1. XML应和文件的形成与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下

    • 在src.main.resources包右键 new Driectory,创建目录com.itheima.mapper,注意:使用/的方式进行创建,不能使用.的方式进行创建
      在这里插入图片描述
    • 在新创建的目录上右键 new File,创建EmpMapper.xml(其中EmpMapper和mapper包下的接口同名)
      在这里插入图片描述
  2. XML映射文件的namespace属性为Mapper接口全限定名一致

    • 在EmpMapper.xml中填写以下配置,其中namespace中填写的是EmpMapper接口的全限定名,按照下图即可copy到
      在这里插入图片描述
<?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.itheima.mapper.EmpMapper">

</mapper>
  1. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
    在这里插入图片描述

在这里插入图片描述

EmpMapper接口中的代码

    public List<Emp> list(@Param("name") String name, @Param("gender") Short gender, @Param("begin") LocalDate begin, @Param("end") LocalDate end);

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">
<mapper namespace="com.itheima.mapper.EmpMapper">
<!--    resultType:单挑记录所封装的类型-->
    <select id="list" resultType="com.itheima.pojo.Emp">
        select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and
            entrydate between #{begin}  and #{end}  order by update_time desc
    </select>
</mapper>

(2)MybatisX

  1. MybatisX是一款基于IDEA的快速开发Mybatis的插件,安装步骤如下,并且安装完成之后,会看到xml文件中有相应的图标。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句

二、Mybatis-动态SQL-if

1、动态SQL

  1. 随着用户的输入或为外部条件的变化而变化的SQL语句,我们称为动态SQL

2、 标签<if><where>

  1. <if>:用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL
  2. <where>:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句开头的and或者 or
  3. <set>:动态的在行首插入SET关键字,并会删除掉额外的逗号(用在update语句中)

3、示例

  1. 将之前的select语句使用以上连个标签改写一下
<select id="list" resultType="com.itheima.pojo.Emp">
        select * from emp
        <where>
            <if test="name!=null">
                name like concat('%',#{name},'%')
            </if>
            <if test="gender !=null">
                and gender=#{gender}
            </if>
            <if test="begin!=null and end!=null">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>

三、Mybatis-动态SQL-foreach

根据 id 批量删除员工

1、SQL语句

delete  from emp where id in(18,19,20);

2、接口方法

 //根据id批量删除员工
    public void deleteByIds(@Param("ids") List<Integer> ids);

3、EmpMapper.xml 映射文件

  1. foreach标签中的几个常用属性:
    • collection:遍历的集合(和方法中传递的参数名一致即可)
    • item:遍历出来的元素
    • separator:分隔符
    • open:遍历开始前拼接的SQL片段
    • close:遍历节后后拼接的SQL片段
    <!--    根据ID量删除员工-->
<!--    collection:遍历的集合(和方法中传递的参数名一致即可)
        item:遍历出来的元素
        separator:分隔符
        open:遍历开始前拼接的SQL片段
        close:遍历节后后拼接的SQL片段
-->
    <delete id="deleteByIds">
        delete from emp where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

4、 测试

 @Test
    public void testDeleteByIds(){
        List<Integer> ids= Arrays.asList(18,19);
        empMapper.deleteByIds(ids);
    }

四、Mybatis-动态SQL-sql&include

  1. 优势忽悠一些经常使用的SQL 代码片段,这是我们可以将这写代码片段进行抽取,使用<sql>标签,然后在相应的地方使用<include>标签进行引用
  2. <sql>:定义可重用的SQL片段
  3. <include>:通过属性refid,指定包含的sql片段
 <sql id="commonSql">
        select id,
               username,
               password,
               name,
               gender,
               image,
               job,
               entrydate,
               dept_id,
               create_time,
               update_time
        from emp
    </sql>
    <!--    resultType:单条记录所封装的类型-->
    <select id="list" resultType="com.itheima.pojo.Emp">
        <include refid="commonSql"></include>
        <where>
            <if test="name!=null">
                name like concat('%',#{name},'%')
            </if>
            <if test="gender !=null">
                and gender=#{gender}
            </if>
            <if test="begin!=null and end!=null">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>