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 mapperPUBLIC "-//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_timefrom 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">DELETEfrom empwhere 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_timefrom 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 | 获取请求方法的请求体 |