黑马程序员JavaWeb开发教程
文章目录
- 一、Mybatis-XML映射文件
- 1、XML映射文件
- (1)规范
- (2)MybatisX
- 二、Mybatis-动态SQL-if
- 1、动态SQL
- 2、 标签`<if><where>`
- 3、示例
- 三、Mybatis-动态SQL-foreach
- 根据 id 批量删除员工
- 1、SQL语句
- 2、接口方法
- 3、EmpMapper.xml 映射文件
- 4、 测试
- 四、Mybatis-动态SQL-sql&include
借用之前的根据条件查询用户 五 5.演示根据条件查询
一、Mybatis-XML映射文件
1、XML映射文件
(1)规范
-
XML应和文件的形成与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下
- 在src.main.resources包右键 new Driectory,创建目录com.itheima.mapper,
注意:使用/的方式进行创建,不能使用.的方式进行创建
- 在新创建的目录上右键 new File,创建EmpMapper.xml(其中EmpMapper和mapper包下的接口同名)
- 在src.main.resources包右键 new Driectory,创建目录com.itheima.mapper,
-
XML映射文件的namespace属性为Mapper接口全限定名一致
- 在EmpMapper.xml中填写以下配置,其中namespace中填写的是EmpMapper接口的全限定名,按照下图即可copy到
- 在EmpMapper.xml中填写以下配置,其中namespace中填写的是EmpMapper接口的全限定名,按照下图即可copy到
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"></mapper>
- 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 mapperPUBLIC "-//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} andentrydate between #{begin} and #{end} order by update_time desc</select>
</mapper>
(2)MybatisX
- MybatisX是一款基于IDEA的快速开发Mybatis的插件,安装步骤如下,并且安装完成之后,会看到xml文件中有相应的图标。
- 使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句
二、Mybatis-动态SQL-if
1、动态SQL
- 随着用户的输入或为外部条件的变化而变化的SQL语句,我们称为动态SQL
2、 标签<if><where>
<if>
:用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL<where>
:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句开头的and或者 or<set>
:动态的在行首插入SET关键字,并会删除掉额外的逗号(用在update语句中)
3、示例
- 将之前的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 映射文件
- 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、 测试
@Testpublic void testDeleteByIds(){List<Integer> ids= Arrays.asList(18,19);empMapper.deleteByIds(ids);}
四、Mybatis-动态SQL-sql&include
- 优势忽悠一些经常使用的SQL 代码片段,这是我们可以将这写代码片段进行抽取,使用
<sql>
标签,然后在相应的地方使用<include>
标签进行引用 <sql>
:定义可重用的SQL片段<include>
:通过属性refid,指定包含的sql片段
<sql id="commonSql">select id,username,password,name,gender,image,job,entrydate,dept_id,create_time,update_timefrom 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>