mybatis-puls

Mybatis-Plus是一个Mybatis的扩展,旨在简化操作,提供了主键生成策略、日志配置、自动填充、乐观锁等功能。文章通过创建SpringBoot工程,配置数据库,展示了如何使用Mybatis-Plus进行增删改查、条件查询、分页查询以及逻辑删除等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是mybatis-plus


升级版的mybatis,目的是让mybatis更易于使用, 用官方的话说“为简化而生”

官网:

Redirect

2. 初体验


  1. 首先准备一个测试用的数据库,数据库建库脚本:
DROP TABLE IF EXISTS user;

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
);DELETE FROM user;INSERT INTO user (id, name, age, email) VALUES(1, 'Jone', 18, 'test1@baomidou.com'),(2, 'Jack', 20, 'test2@baomidou.com'),(3, 'Tom', 28, 'test3@baomidou.com'),(4, 'Sandy', 21, 'test4@baomidou.com'),(5, 'Billie', 24, 'test5@baomidou.com');
  1. 创建springboot工程,加入必要的依赖

创建springboot工程需要指定parent

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.1</version>
        <relativePath/>
    </parent>

依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.4</version>
        </dependency>
  1. 编写项目配置文件,项目名称,数据库配置
spring.application.name=mpdemo

server.port=8080

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mp_db?useSSL=false&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
  1. 启动类,指定mapper接口的位置
@SpringBootApplication
@MapperScan("com.zking.mpdemo.**")
public class MpdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MpdemoApplication.class, args);
    }

}
  1. 生成实体类
import lombok.Data;

@Data
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String email;

}

  1. 编写mapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zking.mpdemo.model.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> {

}
  1. 测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MpdemoApplication.class)
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testList() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        Assert.assertEquals(5, userList.size());
        userList.forEach(System.out::println);
    }

}

运行测试

3. 日志


application.properties

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在开发中将sql语句打印到控制台,以便于调试

4. 主键生成策略


  • 雪花算法,默认的主键生策略,如果需要保存的实体对象中没有指定的主键值,则默认使用雪花算法来生成(可以保障主键按照顺序增长,递增)
  • 好处/特点:就算在分布式的数据库下面他依然能够保证我们的全局唯一,也能保证顺序上的要求,对索引是比较好的
  • 自增ID
    • 数据库的字段必须是配置了自增
    • 对应的实体的主键字段加入自增注解: @TableId(type = IdType.AUTO)
  • 其他类型:(切换就行了)

 

public enum IdType {
    AUTO(0),
      //自动增长    NONE(1),      //未(不)设置主键
    INPUT(2),     //
手动输入    ASSIGN_ID(3),  //
雪花算法    ASSIGN_UUID(4); //
排除到下划线的UUID,32位长度
    private final int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}

5. 更新


  1. 通过主键更新
    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(6);
        //ID用于定位sql,其他的列段设置几个就修改几个,没有设置的则保留原来的值
        user.setName("Rose");
        user.setAge(20);
        int i = userMapper.updateById(user);
        System.out.println(i);
    }

6. 自动填充


在数据表的设计中,经常需要加一些字段,如:创建时间,最后修改时间等,此时可以使用mybatis-plus来帮我们进行自动维护

在自动填充有两种方式:

一: 通过数据库完成自动填充(数据库勾选)

@Data
public class User {

    @TableId(type = IdType.AUTO)
    private int id;
    private String name;
    private Integer age;
    private String email;

	//在代码中同步加入创建时间和最后修改时间的维护
    private Date createTime;
    private Date lastModifiedTime;

}

完成后可以通过新增或更新

二:使用程序完成自动填充

将数据库中的自动维护功能取消:

第一步:实体类中加入注解

    //表明在插入时自动维护字段
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    //表明在插入和更新时自动维护字段
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date lastModifiedTime;

第二步:编写处理类

// 不要忘了处理器是spring的组件@Component
public class AutoFillHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(), metaObject);
        this.setFieldValByName("lastModifiedTime",new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //this.setFieldValByName("createTime",new Date(), metaObject);
        this.setFieldValByName("lastModifiedTime",new Date(), metaObject);
    }
}

完成后可以通过新增或更新

7. 乐观锁


当要更新一条记录的时候,希望这条记录没有被别人更新

乐观锁实现方式(来自官方文档):

取出记录时,获取当前version

更新时,带上这个version

执行更新时, set version = newVersion where version = oldVersion

如果version不对,就更新失败

配置示例:

  1. 在数据库表中加入version字段,表示数据版本号

 

  1. 修改实体类,在使用类中加入对应的version字段,并使用是乐观锁
    //乐观锁
    @Version
    private int version;
  1. 配置乐观锁
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }

}
  1. 测试
    //测试乐观锁
    @Test
    public void testLock01() {
        User user01 = userMapper.selectById(7L);
        User user02 = userMapper.selectById(7L);

        user01.setName("leguansuo01");
        userMapper.updateById(user01);

        user02.setName("leguansuo02");
        userMapper.updateById(user02);

    }

8. 条件查询


  1. 批量查询多个对象
    @Test
    public void testSelectList() {
		//一次查询多个ID        List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
        users.forEach(t -> {
            System.out.println(t);
        });
    }

    @Test
    public void testSelectByMap() {
		//使用map进行查询        Map<String, Object> map = new HashMap<>();
        map.put("name", "Tom");
        map.put("age", 28);
        List<User> users = userMapper.selectByMap(map);
        users.forEach(t-> System.out.println(t));
    }

9. 分页查询


  1. 分页配置
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        //乐观锁
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

        //分页
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        return interceptor;
    }

}

  1. 分页演示
    @Test
    public void testSelectPage() {
        PageDTO<User> page = new PageDTO<>();
        page.setCurrent(1);
        page.setSize(5);
        PageDTO<User> pageDTO = userMapper.selectPage(page, null);

        System.out.println(pageDTO.getTotal());
        List<User> records = pageDTO.getRecords();
        records.forEach(t-> System.out.println(t));
    }

注:dto是数据传输对象,通过这个对象给前端数据

10. 逻辑删除


物理删除使用起来比较简单,仿照查询功能即可,不再赘述。

什么是逻辑删除?

即:标记删除,并不是真的从数据库中删除,而是做个删除标记,在查询时,过滤掉标记为删除的记录即可。

  1. 数据库表结构调整

 

  1. 修改实体类
    //标记该字段为逻辑删除字段
    @TableLogic
    private int deleted;
  1. 在application.properties (或application.yml)中加入如下配置,
#逻辑删除字段名
mybatis-plus.global-config.db-config.logic-delete-field=deleted
# 1表示逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
# 0 表示未删除
mybatis-plus.global-config.db-config.logic-not-delete-value=0
  1. 测试
    @Test
    public void testDeleteLogic() {
        int i = userMapper.deleteById(1L);
        System.out.println(i);
    }

11. Wrapper


用于构造查询条件

    @Test
    public void testWrapperLike() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.likeRight("name", "T")
                .eq("age", 28);

        List<User> users = userMapper.selectList(wrapper);
        users.forEach(t-> System.out.println(t));
    }    @Test
    public void testUpdateWrapper() {
        UpdateWrapper u = new UpdateWrapper();
        //u.set("name", "TT");
        u.eq(true, "id", 6L);

        User user = userMapper.selectById(6L);
        //user = new User();
        user.setName("TTT");

        userMapper.update(user, u);
    }

12. 在Mybatis-plus中使用xml配置


mybatis-plus是mybatis的升级版,所以在mybatis-plus中使用xml的配置比较简单

  1. 在application.properties配置文件中加入如下配置
mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml
  1. 定义mapper接口,继承BaseMapper接口,以便于使用mybatis-plus提供的方法
@Repository
public interface UserMapperXml extends BaseMapper<User> {

    List<User> list();
}
  1. 根据接口生成xml配置文件,IDE一般有辅助的插件,例如IDEA中的Free Mybatis plugin
<?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.zking.mpdemo.mapper.UserMapperXml">

    <select id="list" resultType="com.zking.mpdemo.model.User">
        select * from user;
    </select>

</mapper>

也可以不使用xml配置文件,使用注解来定义sql语句

public interface UserMapperXml extends BaseMapper<User> {

    @Select("select * from user")
    List<User> list();

}
  1. 测试
@RunWith(SpringRunner.class)@SpringBootTest(classes = MpdemoApplication.class)public class UserMapperXmlTest {    @Autowired    private UserMapperXml userMapperXml;    //使用xml配置的方法    @Test    public void list() {        List<User> list = userMapperXml.list();        list.forEach(t-> System.out.println(t));    }    //mybatis-plus提供的方法    @Test    public void testSelectByID() {        User user = userMapperXml.selectById(2L);        System.out.println(user);    }}

 

 

 

### MyBatis-Plus 使用教程与示例代码 #### 集成 MyBatis-Plus 到 Spring Boot 项目 为了在 Spring Boot 中集成 MyBatis-Plus,需完成以下依赖引入和基础配置: 1. **Maven 依赖** 在 `pom.xml` 文件中添加如下依赖: ```xml <!-- MyBatis-Plus 核心依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency> <!-- 数据库驱动 (以 MySQL 为例) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` 2. **application.yml 配置文件** 设置数据源连接信息以及 MyBatis-Plus 的相关参数: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath:mapper/*.xml ``` --- #### 自动代码生成器的使用 MyBatis-Plus 提供了一个强大的代码生成工具,能够快速生成实体类、Mapper 接口、Service 层和服务实现层等代码。 1. **创建代码生成器类** 下面是一个简单的代码生成器示例: ```java package com.example.demo; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; public class CodeGenerator { public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor("Your Name"); gc.setOpen(false); mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("root"); mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.example.demo"); pc.setModuleName(null); // 不设置模块名则默认为空 mpg.setPackageInfo(pc); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); strategy.setInclude("table_name"); // 替换为实际表名 mpg.setStrategy(strategy); mpg.execute(); } } ``` 上述代码会根据指定的数据表生成对应的 Java 类[^2]。 --- #### 实体类中的逻辑删除功能 MyBatis-Plus 支持逻辑删除机制,在不真正从数据库中移除记录的情况下标记其状态。以下是具体实现方式: 1. **修改实体类** 添加 `@TableLogic` 注解到需要逻辑删除的字段上: ```java @Data public class User { private Long id; private String name; private Integer age; /** 删除标志 */ @TableLogic private Integer deleted; // 默认值为 0 表示未删除,1 表示已删除 } ``` 2. **全局配置逻辑删除规则** 修改 `application.yml` 文件,增加逻辑删除的相关配置: ```yaml mybatis-plus: global-config: db-config: logic-delete-value: 1 # 已删除的状态值 logic-not-delete-value: 0 # 未删除的状态值 ``` 当执行删除操作时,MyBatis-Plus 将自动更新该字段而不是物理删除记录[^4]。 --- #### 基于 UI 的代码生成工具 如果希望拥有更直观的操作体验,可以选择使用 `mybatis-plus-generator-ui` 这款图形界面化的代码生成工具。它提供了丰富的自定义选项,并兼容多种数据库类型[^3]。 安装步骤可参考官方文档或 GitHub 地址:https://github.com/mybatis-plus/generator-ui。 --- ### 总结 以上介绍了如何将 MyBatis-Plus 集成至 Spring Boot 项目中,包括环境搭建、代码生成器的使用方法、逻辑删除功能的应用场景,以及推荐的一款可视化代码生成工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值