3. Mybatis的XML配置文件(重点)

目录

1 Mybatis的XML配置文件

1.1 XML配置文件规范

1.2 XML配置文件实现

1.3 MybatisX的使用

2. Mybatis动态SQL

2.1 什么是动态SQL

2.2 动态SQL-if

2.2.1 条件查询

2.2.2更新

2.3 动态SQL-foreach

2.4 动态SQL-sql&include



1.mybatis入门

2.mybatis基本操作

1 Mybatis的XML配置文件

Mybatis的开发有两种方式:

  1. 注解

  2. XML

1.1 XML配置文件规范

使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。

在Mybatis中使用XML映射文件方式开发,需要符合一定的规范:

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

  2. XML映射文件的namespace属性为Mapper接口全限定名一致

  3. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

<select>标签:就是用于编写select查询语句的。

  • resultType属性,指的是查询返回的单条记录所封装的类型。

1.2 XML配置文件实现

第1步:创建XML映射文件

第2步:编写XML映射文件

xml映射文件中的dtd约束,直接从mybatis官网复制

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
 
</mapper>

配置:XML映射文件的namespace属性为Mapper接口全限定名

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">

</mapper>

配置:XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">

    <!--查询操作-->
    <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>

1.3 MybatisX的使用

MybatisX是一款基于IDEA的快速开发Mybatis的插件,为效率而生。

MybatisX的安装:

可以通过MybatisX快速定位:

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

2. Mybatis动态SQL

2.1 什么是动态SQL

SQL语句会随着用户的输入或外部条件的变化而变化,称为:动态SQL

Mybatis中提供了很多实现动态SQL的标签,整Mybatis中的动态SQL就是掌握这些动态SQL标签。

但现在一般都ai生成就行

2.2 动态SQL-if

<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。

<if test="条件表达式">
   要拼接的sql语句
</if>

2.2.1 条件查询

示例:把SQL语句改造为动态SQL方式

  • 原有的SQL语句
<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>
  • 动态SQL语句

<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>
    
        order by update_time desc
</select>

测试方法:

@Test
public void testList(){
    //性别数据为null、开始时间和结束时间也为null
    List<Emp> list = empMapper.list("张", null, null, null);
    for(Emp emp : list){
        System.out.println(emp);
    }
}

执行的SQL语句:

修改测试方法中的代码,再次进行测试,观察执行情况

@Test
public void testList(){
    //姓名为null
    List<Emp> list = empMapper.list(null, (short)1, null, null);
    for(Emp emp : list){
        System.out.println(emp);
    }
}

 结果:再次修改测试方法中的代码,再次进行测试:

@Test
public void testList(){
    //传递的数据全部为null
    List<Emp> list = empMapper.list(null, null, null, null);
    for(Emp emp : list){
        System.out.println(emp);
    }
}

执行的SQL语句:

使用<where>标签代替SQL语句中的where关键字

  • <where>只会在子元素有内容的情况下才插入where子句,会自动去除子句的开头的AND或OR

    <select id="list" resultType="com.itheima.pojo.Emp">
            select * from emp
            <where>
                 <!-- if做为where标签的子元素 -->
                 <if test="name != null">
                     and 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>

    测试方法

    @Test
    public void testList(){
        //只有性别
        List<Emp> list = empMapper.list(null, (short)1, null, null);
        for(Emp emp : list){
            System.out.println(emp);
        }
    }

    执行的SQL语句:

2.2.2更新

更新用到的sql语句 开头是update

同where     这里需要插入set关键字

  • <set>:动态的在SQL语句中插入set关键字,并会删掉额外的逗号。(用于update语句中)

总结2.2.1 /2.2.2 

  • <where>

    • where元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR

  • <set>

    • 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)

2.3 动态SQL-foreach

XML映射文件:

  • 使用<foreach>遍历deleteByIds方法中传递的参数ids集合

<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符" 
         open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>

 看下代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
    <!--删除操作-->
    <delete id="deleteByIds">
        delete from emp where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
</mapper> 

执行         

2.4 动态SQL-sql&include

在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会存在很多冗余的代码

可以对重复的代码片段进行抽取,将其通过<sql>标签封装到一个SQL片段,然后再通过<include>标签进行引用。

  • <sql>:定义可重用的SQL片段

  • <include>:通过属性refid,指定包含的SQL片段

SQL片段: 重复的代码.

看图

看下代码

<sql id="commonSelect">
 	select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp
</sql>

然后通过<include> 标签在原来抽取的地方进行引用。

代码如下:  

<select id="list" resultType="com.itheima.pojo.Emp">
    <include refid="commonSelect"/>
    <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>

相关推荐

  1. MybatisXML配置

    2024-02-04 19:48:01       38 阅读
  2. mybatis-config.xml配置

    2024-02-04 19:48:01       29 阅读
  3. 深入理解MyBatis XML配置文件

    2024-02-04 19:48:01       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-04 19:48:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-04 19:48:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-04 19:48:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-04 19:48:01       18 阅读

热门阅读

  1. KMP算法

    2024-02-04 19:48:01       33 阅读
  2. C语言中大小写字母的转化

    2024-02-04 19:48:01       31 阅读
  3. 微端服务器都需要哪些配置?

    2024-02-04 19:48:01       29 阅读
  4. css鼠标悬浮动效

    2024-02-04 19:48:01       29 阅读
  5. 蓝桥杯练习题-幸运数字

    2024-02-04 19:48:01       31 阅读
  6. 时间序列(Time-Series)Embed.py代码解析

    2024-02-04 19:48:01       21 阅读
  7. Windows 11 下如何安装QT

    2024-02-04 19:48:01       26 阅读
  8. PPYOLE

    PPYOLE

    2024-02-04 19:48:01      33 阅读
  9. 实时聊天系统

    2024-02-04 19:48:01       33 阅读
  10. 信创系统软件开发环境搭建(QT篇)

    2024-02-04 19:48:01       28 阅读