关于XML映射文件写Mybatis查询和分页查询的实现方法

XML映射文件规范

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

  2. XML映射文件的namespace属性为Mapper接口的全限定类名(online.zhaozhijiong.mapper.EmpMapper)

  3. XML映射文件中sql语句的idMapper接口的方法名一致,并保持相同的返回类型(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>
    

细节

  1. 在通过@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>
    
  2. 但是要记住的是,如果不是在占位符中的字段名,一定要按照数据库中的字段名填写

动态sql

标签

标签 用法
<if test="Logical statement"></if> 如果test中的条件成立,则拼接sql语句
  1. <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>
    
  2. <foreach></foreach>

    <foreach>中有常用的属性

    1. collection:与mapper传中递的变量名一致
    2. item :每一项的名称
    3. separator:定义分隔符
    4. open:在拼接前需要拼接符号
    5. close:在拼接之后的需要拼接的符号
    <delete id="delete2">
        DELETE
        from emp
        where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
    
  3. <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 获取请求方法的请求体
posted @ 2025-03-31 02:19  静香还需努力  阅读(151)  评论(0)    收藏  举报