一、MybatisPlus常用注解



代码示例:
@Data
@TableName("tbl_employee") //数据库中该实体类对应的表名为:tbl_employee
public class Employee {
@TableId(value = "employee_id",type = IdType.AUTO) //数据库中的主键名为:employee_id,主键生成策略为:自增
private Integer id;//编号
@TableField("employee_name") //数据库中的列名为:employee_name
private String name;//用户名
private String email;//邮箱
private Integer gender;//性别
private Integer age;//年龄
@TableField(exist = false) //忽略该属性,表示数据库表中没有字段与之相关联
private Integer status;
private LocalDateTime createTime;
@TableField(value = "update_time",update = "now()") //自动修改更新时间
private LocalDateTime updateTime;
}
注:① 在使用不同的主键生成策略时,要注意实体类属性类型与生成策略及数据库字段类型的适配问题。
② 主键生成策略的配置除了可以通过注解的方式设置,还可以通过application.yml进行全局配置:
mybatis-plus:
type-aliases-package: com.hemu.learn.mybatisplus.entity #扫描实体类所在的包(xml映射文件中可以直接写实体类的类名,前面就不用加一大长串包名了)
mapper-locations: classpath:/mappers/*.xml #指定映射文件的存放位置
global-config:
db-config:
id-type: uuid #配置全局的主键生成策略
如果主键同时配置了全局生成策略和@TableId(value,type)注解,则@TableId注解中配置的type生效。
二、增删改查操作中需要注意的点:
1.新增(insert)
- MybatisPlus的insert在执行后会返回影响的行数,并且会直接将生成的主键重新赋值到对象中。例:
int count = employeeMapper.insert(employee);
if (count == 1){
System.out.println("新增用户成功!");
System.out.println("返回的主键id为:"+employee.getId());
}else{
System.out.println("新增用户失败!");
}
2.删除(delete)
- 在使用deleteByMap进行删除时,注意 map(key->value)中的key值要与数据库的列名一致,而不是与实体类的属性名一致,并且可以同时根据不同的字段进行删除。
@Test
public void deleteByMap(){
Map<String,Object> map = new HashMap<>();
map.put("employee_id",1);
map.put("employee_name","hemu");
int count = employeeMapper.deleteByMap(map);
if (count > 1){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
}
控制台打印的sql: DELETE FROM tbl_employee WHERE employee_id = ? AND employee_name = ?
- Mapper.deleteBatchIds(List<T> list):根据主键批量删除。例:
@Test
public void deleteByBatchIds(){
List list = new ArrayList();
list.add(3);
list.add(4);
int count = employeeMapper.deleteBatchIds(list);
if (count > 1){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
}
控制台打印的SQL: DELETE FROM tbl_employee WHERE employee_id IN ( ? , ? )
- Mapper.detele(Wrapper<T> wrapper):根据条件构造器删除。
条件构造器详解,见标题三.
3.修改(update)
-
Mapper.updateById(T entity):根据entity中的ID值,去更新entity中所赋值的属性的值。
-
Mapper.update(T entity,Wrapper<T> updateWrapper):entity----set 的属性值,可以为 null;updateWrapper----where的条件语句,可以为null。
@Test
public void updateByWrapper(){
QueryWrapper<Employee> employeeQueryWrapper = new QueryWrapper<>();
employeeQueryWrapper.eq("gender",0);
Employee employee = new Employee();
employee.setEmail("135@163.com");
int count = employeeMapper.update(employee,employeeQueryWrapper);
if (count > 1){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
}
控制台打印的SQL:UPDATE tbl_employee SET email=? WHERE gender = ?
4.查询(select)
-
Mapper.selectById(Serializable id):根据ID去查询。
-
Mapper.selectOne(Wrapper<T> queryWrapper):根据条件查询一条记录。
-
List<T> selectList(Wrapper<T> queryWrapper):根据条件查询全部记录,返回List。
-
Integer selectCount(Wrapper<T> queryWrapper):根据条件查询总的记录数量。
-
List<T> selectBatchIds(List<T> idList):根据主键的List批量查询。
-
List<T> selectByMap(Map<String, Object> columnMap):根据 columnMap的条件查询全部记录。
三、条件构造器
- MybatisPlus 通过 QueryWrapper(简称 QW,MP 封装的一个查询条件构造器)来让用户自由的构建查询条件,简单便捷,没有额外的负担, 能够有效提高开发效率
- 实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等
注意: 使用的是数据库表字段,不是 Java 属性!

四、MybatisPlus中自定义SQL
MybatisPlus在进行单表操作的时候,功能十分强大,但是对于联表查询,或者复杂SQL查询的时候,还是需要自定义SQL查询。
-
注解方式(当遇到属性名与列名不一致的情况,在SQL语句中给数据库列名定义一个别名)
public interface EmployeeMapper extends BaseMapper<Employee> {
@Select("select employee_id id,employee_name name,age,gender,email from tbl_employee") //括号里面可以自定义复杂的sql语句
List<Employee> findAll(); //查询所有的employee
}
-
XML方式
(1)通常我们将mapper的xml文件放在Resource文件夹下,因此我们需要在application.yml文件中进行如下的配置:(如果Mapper接口和映射的XML文件在同一路径下,则不需要配置)
mybatis-plus:
type-aliases-package: com.hemu.learn.mybatisplus.dao #扫描实体类所在的包(xml映射文件中可以直接写实体类的类名,前面就不用加一大长串包名了)
mapper-locations: classpath:/mappers/*.xml #指定映射文件的存放位置
(2)mapper接口:
public interface EmployeeMapper extends BaseMapper<Employee> {
List<Employee> findAll(); //查询所有的employee
}
匹配的XML映射文件:
<?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="com.hemu.learn.mybatisplus.dao.EmployeeMapper">
<resultMap id="BaseResultMap" type="com.hemu.learn.mybatisplus.pojo.Employee" >
<id column="employee_id" property="id" jdbcType="INTEGER" />
<result column="employee_name" property="name" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
<result column="gender" property="gender" jdbcType="INTEGER" />
<result column="email" property="email" jdbcType="VARCHAR" />
</resultMap>
<select id="findAll" resultMap="BaseResultMap">
select employee_id,employee_name,age,gender,email from tbl_employee
</select>
</mapper>
(3)属性名与数据库列名不一致的两种解决方法:
①使用reslutMap进行映射:
<resultMap type="User" id="userResultMap" autoMapping="true">
<!-- id标签:配置主键映射,column:表中的字段名称,property:属性名称 -->
<id column="id" property="id"/>
<!-- 可以用来配置普通类型字段和属性映射(非复杂类型) -->
<result column="user_name" property="userName"/>
</resultMap>
<!--
select:查询的statement,用来编写查询语句。
id:语句的唯一标识,使用动态代理之后,必须和mapper接口中的方法名称一致。
resultType:配置返回的结果集类型
parameterType:参数类型,可以省略。
-->
②在Sql语句中给数据库列名定义一个别名,别名和实体类中属性名一致:
<select id="findAll" resultType="com.hemu.learn.mybatisplus.pojo.Employee">
select employee_id id,employee_name name,age,gender,email from tbl_employee
</select>
五、分页插件
MybatisPlus中提供的selectPage()分页方法是内存分页,它先将所有符合条件的数据查询出来之后,再根据分页条件进行显示。这种方式查询效率低,因此我们使用分页插件进行分页操作。
使用步骤:
(1)编写分页插件配置类(springboot方式)
@EnableTransactionManagement //开启事务管理器
@Configuration //表示该类是一个配置类
@MapperScan("com.hemu.learn.mybatisplus.dao") //扫描mapper接口所在的包
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor(){ //分页拦截器
return new PaginationInterceptor();
}
}
还有一种配置方式是使用spring的xml配置文件中配置,具体方法见官方文档。
(2)mapper中编写分页查询的接口方法
public interface EmployeeMapper extends BaseMapper<Employee> {
List<Employee> findAll(); //查询所有的employee
IPage<Employee> findListByPage(Page page); //分页查询
}
(3)映射文件xml
<!--查询全部记录-->
<select id="findAll" resultMap="BaseResultMap">
select employee_id,employee_name,age,gender,email from tbl_employee
</select>
<!--分页查询-->
<select id="findListByPage" resultMap="BaseResultMap">
select employee_id,employee_name,age,gender,email from tbl_employee
</select>
通过对比上面的xml文件中编写的两个sql可以看到,所有的分页逻辑都交给插件去处理了。
(4)测试类
@Test
public void findListByPage(){ //分页查询测试
Page<Employee> employeePage = new Page<>(2,2);
IPage<Employee> employeeIPage = employeeMapper.findListByPage(employeePage);
System.out.println("当前页码:"+employeeIPage.getCurrent());
System.out.println("总页数:"+employeeIPage.getPages());
System.out.println("每页显示的记录数:"+employeeIPage.getSize());
System.out.println("总记录数:"+employeeIPage.getTotal());
for (Employee emp:employeeIPage.getRecords()) { //获取本页所有的记录
System.out.println(emp);
}
}
本文详细介绍MybatisPlus的常用注解,包括实体类映射、主键生成策略、增删改查操作、条件构造器使用、自定义SQL、分页插件配置等核心功能,帮助开发者快速掌握并提升开发效率。
365

被折叠的 条评论
为什么被折叠?



