关于XML映射文件写Mybatis查询和分页查询的实现方法
XML映射文件规范
- 
XML映射文件的名称必须与 Mapper接口的名称一致,并且将XML文件和Mapper接口放置在相同包下(同包同名)
- 
XML映射文件的 namespace属性为Mapper接口的全限定类名(online.zhaozhijiong.mapper.EmpMapper)
- 
XML映射文件中 sql语句的id与Mapper接口的方法名一致,并保持相同的返回类型(ResultType)<?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="online.zhaozhijiong.mapper.EmpMapper"> //全限定类名 <select id="getSearchInfo" resultType="online.zhaozhijiong.pojo.Emp"> select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp <where> <if test="name != null"> name like concat('%', #{name}, '%') </if> <if test="gender != null"> gender = #{gender} </if> <if test="start != null and end != null"> entrydate between #{start} and #{end} </if> </where> order by create_time desc </select> </mapper>
细节
- 
在通过 @Mapper注解的方式,操作数据库时,占位符中的字段名不需要严格按照数据库设计的字段名填写,例如当有下划线的字段名时,可以直接使用驼峰命名法,如下: 在数据库中,部门编号dept_id,是以含下划线的形式命名的,但是在通过占位符解析emp对象字段名的时候,并不一定要将emp对象的属性定义为和数据库字段中相同的属性名,而是采用驼峰命名法@Update("UPDATE emp SET username = #{username}, name = #{name}, gender = #{gender}, image = #{image}, job = #{job}, entrydate = #{entrydate}, dept_id = #{deptId} WHERE id = #{id}") public void update(Emp emp);此时要在SpringBoot配置文件中加入一下配置: mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl在XMl映射文件中也是同样 <update id="update"> UPDATE emp <set> <if test="username != null"> username = #{username}, </if> <if test="name != null"> name = #{name}, </if> <if test="gender != null"> gender = #{gender}, </if> <if test="image != null"> image = #{image}, </if> <if test="job != null"> job = #{job}, </if> <if test="entrydate != null"> entrydate = #{entrydate}, </if> <if test="dept_id != null"> dept_id = #{deptId} </if> </set> WHERE id = #{id} </update>
- 
但是要记住的是,如果不是在占位符中的字段名,一定要按照数据库中的字段名填写 
动态sql
标签
| 标签 | 用法 | 
|---|---|
| <if test="Logical statement"></if> | 如果test中的条件成立,则拼接sql语句 | 
- 
<if test="Logical statement"></if><update id="update"> UPDATE emp <set> <if test="username != null"> username = #{username}, </if> <if test="name != null"> name = #{name}, </if> <if test="gender != null"> gender = #{gender}, </if> <if test="image != null"> image = #{image}, </if> <if test="job != null"> job = #{job}, </if> <if test="entrydate != null"> entrydate = #{entrydate}, </if> <if test="dept_id != null"> dept_id = #{deptId} </if> </set> WHERE id = #{id} </update>
- 
<foreach></foreach><foreach>中有常用的属性- collection:与- mapper传中递的变量名一致
- item:每一项的名称
- separator:定义分隔符
- open:在拼接前需要拼接符号
- close:在拼接之后的需要拼接的符号
 <delete id="delete2"> DELETE from emp where id in <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </delete>
- 
<compoment id=""></compoment>与 <include/>搭配使用<sql id="common_sql"> SELECT id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp </sql> <select id="getAll"> <include refid="common_sql"/> </select>
分页查询
基础写法
需要前端传递两个参数,分别为page和pageSize, 分别表示第几页和每一页多少条数据
但是在后端需要对参数page进行处理
原因:由于sql查询的机制,是通过limit start, pageSize实现但是start的含义并不是从第几页开始,而是从第几条数据开始,所以要将前端传递来的page参数进行转变,得到当前页数起始数据的索引
Integer start = (page - 1) * pageSize;
然后再通过mapper查询
@Select("select * from tails.emp limit #{start}, #{pageSize}")
List<Emp> getPage(Integer start, Integer pageSize);
并且一般会返回一个数据总数的信息
@Select("select count(*) from tails.emp")
Long getCount();
然后将数据封装再一个自定义的pageBean对象中
@Override
public PageBean page(Integer page, Integer pageSize) {
    Integer start = (page - 1) * pageSize;
    PageBean pageBean = new PageBean();
    pageBean.setTotal(empMapper.getCount());
    pageBean.setRows(empMapper.getPage(start, pageSize));
    return pageBean;
}
PageBean.java
@Data
public class PageBean {
    private Long total;
    private List<Emp> rows;
}
EmpController.java
@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page,
                   @RequestParam(defaultValue = "5") Integer pageSize,
                   String name,
                   Short gender,
                   @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                   @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
    PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);
    return Result.success(pageBean);
}
通过插件(pagehelper)编写
pom.xml
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.7</version>
</dependency>
EmpMapper.java
@Select("select * from tails.emp")    
List<Emp> list();
EmpService.java
@Override
public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {
    PageHelper.startPage(page, pageSize);
    List<Emp> empList = empMapper.list(name, gender, begin, end);
    Page<Emp> empPage = (Page<Emp>) empList;
    PageBean pageBean = new PageBean(empPage.getTotal(), empPage.getResult());
    return pageBean;
}
使用pagehelper插件时,要先调用PageHelper.startPage();将page,pageSize传入进去,然后直接查询全部数据即可完成分页,但是要将返回的数据强转为'Page'类型,通过page类型得到总数据数empPage.getTotal(),得到每一页的数据empPage.getResult()
知识回顾
关于注解
| 注解 | |
|---|---|
| @RequestParam(defaultValue = "1") | 给查询参数设置默认值 | 
| @DateTimeFormat(pattern = "yyyy-MM-dd") | 格式化时间 | 
| @PathVariable | 获取路径参数 | 
| @RequestBody | 获取请求方法的请求体 | 
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号