目录
一、XML映射文件
1. 介绍
2. MyBatisX插件
二、MyBatis动态SQL
1. if
2. foreach
3. sql & include
① XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
② XML映射文件的namespace属性为Mapper接口全限定名一致。
③ XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
//mybatis中文网
使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。
官方说明:https://mybatis.net.cn/getting-started.html
① MybatisX 是一款基于IDEA的快速开发Mybatis的插件,为效率而生。
② 安装:
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为 动态SQL 。
例如我们之前编写的select语句,where条件是固定的,即使查询时没有指定,也会传递空值null进行查询。而比如我们只想通过name属性进行查询,在查询时后两个条件也会拼接但是传递的是空值null,也是查询不到数据的。
所以我们通过 动态SQL 的三个标签来解决这个问题:
①
②
③
public List getList(String name, short gender, LocalDate begin, LocalDate end);
案例练习:完善更新员工功能,修改为动态更新员工数据信息
需求:动态更新员工信息,如果更新时传递有值,则更新;如果更新时没有传递值,则不更新。
解决方案:动态SQL
//动态更新员工 --- 更新ID为18的员工 username:Tom111,name:汤姆111,gender:2
@Test
public void testUpdate2(){
//构建员工对象
Emp emp = new Emp();
emp.setId(18);
emp.setUsername("Tom111");
emp.setName("汤姆111");
emp.setGender((short)2);
emp.setUpdateTime(LocalDateTime.now());
//执行更新员工信息操作
empMapper.update(emp);
}
更新后其他值没有传参赋值所以均为空值null,这与我们预期结果不一致。
使用动态SQL解决问题:
public void update2(Emp emp);
update emp
username= #{username},
name=#{name},
gender=#{gender},
image=#{image},
job=#{job},
entrydate=#{entrydate},
dept_id=#{deptId},
update_time=#{updateTime}
where id = #{id};
在我们之前的学习和设计中,批量删除就会用
属性:
// 批量删除员工
// 实现类
@Test
public void testDeleteBuIds(){
List ids = Arrays.asList(13,14,15);
empMapper.delectByIds(ids);
}
// 接口方法
public void delectByIds(List ids);
//XML映射文件
delete from emp where id in
#{id}
问题分析:
动态条件查询和根据id查询员工信息,直接利用select * 将所有信息字段罗列出来。而且代码也存在重复冗余,代码复用性低。在Java中我们会将重复代码封装到方法中,需要代码逻辑时直接调用。而在MyBatis动态SQL我们同样可以将重复代码抽取然后在原位置重新引入。
①
②
select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time
from emp