MybatisPlus的使用(一)

本文详细介绍MybatisPlus的常用注解,包括实体类映射、主键生成策略、增删改查操作、条件构造器使用、自定义SQL、分页插件配置等核心功能,帮助开发者快速掌握并提升开发效率。

一、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);
        }
    }

 

MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,可简化开发、提高效率。以下是其使用般步骤: ### 快速入门 - **添加依赖**:在项目的`pom.xml`文件中添加 MyBatis-Plus 的依赖,示例如下: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> ``` - **配置**:需要创建配置文件,具体配置内容根据项目实际情况而定。 ### 完整使用流程 - **创建测试数据库和表**:根据业务需求设计并创建数据库和对应的表。 - **创建项目和添加依赖**:创建个新的项目,并按照上述方式添加 MyBatis-Plus 依赖。 - **创建配置文件**:配置数据源、MyBatis-Plus 相关设置等。 - **编写代码**: - **实体类**:创建与数据库表对应的实体类。 - **Mapper 接口**:创建 Mapper 接口,可继承`BaseMapper`接口,以使用 MyBatis-Plus 提供的基本 CRUD 方法。 - **Service 层**: - **创建 service**:定义业务接口。 - **创建 service 实现类**:实现业务接口,并调用 Mapper 接口的方法。 - **方法调用测试**:编写测试代码来验证 Service 层方法的正确性。 ### 实现 CRUD 操作 - **插入操作**:使用`insert`方法将数据插入数据库。 - **主键策略**:MyBatis-Plus 提供了多种主键策略,如自增、UUID 等。 - **根据 Id 更新操作**:使用`updateById`方法根据主键更新记录。 - **分页查询**:使用`IPage`和`Page`类进行分页查询。 - **根据 id 删除记录**:使用`deleteById`方法根据主键删除记录。 - **批量删除**:使用`deleteBatchIds`方法批量删除记录。 - **逻辑删除**:通过设置逻辑删除字段,实现数据的逻辑删除。 ### 条件构造器 - **QueryWrapper 使用**:用于构建 SQL 查询条件。 - **LambdaQueryWrapper 使用**:通过 Lambda 表达式构建查询条件,提高代码的可读性。 ```java import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; // 项目示例代码 @Service public class UserService { @Autowired private UserMapper userMapper; // 插入操作 public int insertUser(User user) { return userMapper.insert(user); } // 分页查询 public IPage<User> getUserPage(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); return userMapper.selectPage(page, null); } // LambdaQueryWrapper 查询 public List<User> getUsersByAge(int age) { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getAge, age); return userMapper.selectList(wrapper); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值