mybatis-plus基本用法+简单示例

1. 入门案例

1.1 导入相关坐标

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.16</version>
</dependency>

<dependency>
     <groupId>com.mysql</groupId>
     <artifactId>mysql-connector-j</artifactId>
     <scope>runtime</scope>
</dependency>

1.2 编写配置文件

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db
    username: root
    password: root

1.3 编写实体类

package com.zky.domain;

@TableName("tbl_book") //实体类 和 数据库表名 不一致 时用此注解 指定表名
public class Book {
    private Long id;
    private String type;
    private String name;
    private String description;
	
    ...//省略toString 和 Getter Setter
}

1.4 dao层

package com.zky.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zky.domain.Book;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface BookDao extends BaseMapper<Book> {
}

2. MybatisPlus官网

MyBatis-Plus

MyBatis-Plus (baomidou.com)

3. 标准数据层开发

3.1 增删改查(CRUD)

 @Autowired
    private BookDao bookDao;

    @Test
    void testSave() {
        Book book = new Book();
        book.setName("mp测试");
        book.setType("mp测试");
        book.setDescription("mp测试");
        bookDao.insert(book);
    }

    @Test
    void testDelete(){
        bookDao.deleteById(1631922089464193025L);
    }

    @Test
    void testUpdate(){
        Book book = new Book();
        book.setName("mp测试修改");
        book.setId(1631921920366632961L);
        book.setDescription("mp测试修改");
        bookDao.updateById(book);
    }

    @Test
    void testGetById(){
        Book book = bookDao.selectById(1631921920366632961L);
        System.out.println(book);
    }

    @Test
    void testGetAll() {
        List<Book> books = bookDao.selectList(null);
        System.out.println(books);
    }

3.2 导入lombok

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
@TableName("tbl_book")
@Data  //包含了getter setter 和 tostring equlas hashcode...  不包含构造方法!!
public class Book {
    private Long id;
    private String type;
    private String name;
    private String description;
}

3.3 分页查询

3.3.1 配置拦截器

package com.zky.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// mybatis plus 分页查询

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor(){
        //1. 定义mp的拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2. 添加具体的拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}

3.3.2 测试

@Test
void testGetByPage() {
    IPage page = new Page(1, 5);
    bookDao.selectPage(page, null);//这里的 null 是查询条件
    System.out.println("当前页码值 ==> " + page.getCurrent());
    System.out.println("每页显示数 ==> " + page.getSize());
    System.out.println("一共多少页 ==> " + page.getPages());
    System.out.println("一共多少条数据 ==> " + page.getTotal());
    System.out.println("数据 ==> " + page.getRecords());
}

3.3.3 开启 mp 日志

# 开启 mp 的日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4. DQL编程控制(查)

API : 条件构造器 | MyBatis-Plus (baomidou.com)

4.1 简化控制台输出

4.1.1 创建 localback.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

</configuration>

4.1.2 application.yaml

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db
    username: root
    password: root
# 关闭 spring 头日志
  main:
    banner-mode: off 

# 开启 mp 的日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 关闭 mp 头日志
  global-config:
    banner: false

4.2 按条件查询

    @Test
    void testGetAll() {
        // 方式一:按条件查询
//        QueryWrapper qw = new QueryWrapper();
//        qw.lt("id",10);
//        List<Book> books = bookDao.selectList(qw);
//        System.out.println(books);

        // 方式二:lambda按条件查询
//        QueryWrapper<Book> qw = new QueryWrapper<Book>();
//        qw.lambda().lt(Book::getId,10);
//        List<Book> books = bookDao.selectList(qw);
//        System.out.println(books);

        // 方式三:lambda按条件查询
//        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
//        lqw.lt(Book::getId,10);
//        List<Book> books = bookDao.selectList(lqw);
//        System.out.println(books);

        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
        // 大于10 而且 小于20
//        lqw.lt(Book::getId,20).gt(Book::getId,10);
        // 小于10 或者 大于20
        lqw.lt(Book::getId,10)
            .or()
            .gt(Book::getId,20);
        List<Book> books = bookDao.selectList(lqw);
        System.out.println(books);
    }

4.3 条件查询 null 值处理

image-20230307095159967

image-20230307095212078

4.4 查询投影(as)

        // 查询投影  SELECT id,name FROM tbl_book
        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
        lqw.select(Book::getId,Book::getName);
        List<Book> books = bookDao.selectList(lqw);
        System.out.println(books);
        // 查询投影 SELECT id,name FROM tbl_book
        QueryWrapper<Book> qw = new QueryWrapper<>();
        qw.select("id","name");
        List<Book> books = bookDao.selectList(qw);
        System.out.println(books);

        // 查询投影 SELECT count(*) as count FROM tbl_book
        QueryWrapper<Book> qw = new QueryWrapper<>();
        qw.select("count(*) as count");
        List<Map<String, Object>> maps = bookDao.selectMaps(qw);
        System.out.println(maps);

        // 查询投影 SELECT count(*) as count, type FROM tbl_book GROUP BY type
        QueryWrapper<Book> qw = new QueryWrapper<>();
        qw.select("count(*) as count, type");
        qw.groupBy("type");
        List<Map<String, Object>> maps = bookDao.selectMaps(qw);
        System.out.println(maps);

4.5 查询条件(where)

    //条件查询	SELECT id,type,name,description FROM tbl_book WHERE (id = ? AND type = ?)
    LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
    //等同于 =
    lqw.eq(Book::getId,1).eq(Book::getType,"计算机理论");
    Book book = bookDao.selectOne(lqw);
    System.out.println(book);
    //条件查询	SELECT id,type,name,description FROM tbl_book WHERE (id BETWEEN ? AND ?)
    LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
    // 范围查询 le le gt ge eq between
    lqw.between(Book::getId,10,20);
    List<Book> books = bookDao.selectList(lqw);
    System.out.println(books);
    //条件查询	SELECT id,type,name,description FROM tbl_book WHERE (type LIKE ?)
    LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
    //模糊查询
    lqw.like(Book::getType,"营销");// like %营销%
    lqw.likeLeft(Book::getType,"营销"); // like %营销
    lqw.likeRight(Book::getType,"营销");// like 营销%
    List<Book> books = bookDao.selectList(lqw);
    System.out.println(books);

4.5 字段映射和表名映射

image-20230304165250155 image-20230304165342075

5. DML编程控制(增删改)

5.1 id生成策略控制

image-20230304165749865 image-20230304170134168
mybatis-plus:
  global-config:
    db-config:
    # 给 @TableId 全局配置
      id-type: assign_id
      # 给 TableName 加个前缀
      table-prefix: tbl_ 

5.2 多记录操作

@Test
void testDelete(){
    List<Long> list = new ArrayList<>();
    list.add(1631945023436132354L);
    list.add(1631945056801906690L);
    bookDao.deleteBatchIds(list);
    // selectBatchIds
}

5.3 逻辑删除

image-20230304171436967

5.3.1 数据库增加相应字段

image-20230304172147272

5.3.2 实体类增加字段

image-20230304172253812

5.3.3 全局配置删除字面值

image-20230304172331366
# 全局配置
mybatis-plus:
     db-config:
          logic-delete-value: deleted
          logic-not-delete-value: 0
          logic-delete-field: 1

5.4 乐观锁(并发)

5.4.1 数据库添加所标记字段

image-20230304173319762

5.4.2 实体类中添加字段

image-20230304173357426

5.4.3 配置乐观锁拦截器

image-20230307095119736
package com.zky.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor(){
        //1. 定义mp的拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2. 添加具体的拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //3. 添加乐观锁的拦截器
        mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mpInterceptor;
    }
}

5.4.4 必须获取version数据 !

image-20230307095041843

6. 代码生成器

6.1 导入坐标

        <!-- 代码生成器 版本兼容差 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.0</version>  
        </dependency>

        <!-- velocity模板引擎 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

6.2 配置类

package com.zky;

import com.baomidou.mybatisplus.annotation.IdType;
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;

public class CodeGenerator {
    public static void main(String[] args) {
        //1.获取代码生成器的对象
        AutoGenerator autoGenerator = new AutoGenerator();

        //设置数据库相关配置
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);

        //设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir("D:\\IdeaProject\\mybatisPlusProject\\mybatisplus_02_dql\\src\\main\\java");    //设置代码生成位置
        globalConfig.setOpen(false);    //设置生成完毕后是否打开生成代码所在的目录
        globalConfig.setAuthor("zky");    //设置作者
        globalConfig.setFileOverride(true);     //设置是否覆盖原始生成的文件
        globalConfig.setMapperName("%sDao");    //设置数据层接口名,%s为占位符,指代模块名称
        globalConfig.setIdType(IdType.ASSIGN_ID);   //设置Id生成策略
        autoGenerator.setGlobalConfig(globalConfig);

        //设置包名相关配置
        PackageConfig packageInfo = new PackageConfig();
        packageInfo.setParent("com.zky");   //设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
        packageInfo.setEntity("domain");    //设置实体类包名
        packageInfo.setMapper("dao");   //设置数据层包名
        autoGenerator.setPackageInfo(packageInfo);

        //策略设置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("tbl_book");  //设置当前参与生成的表名,参数为可变参数
        strategyConfig.setTablePrefix("tbl_");  //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名  例如: User = tbl_user - tbl_
        strategyConfig.setRestControllerStyle(true);    //设置是否启用Rest风格
        strategyConfig.setVersionFieldName("version");  //设置乐观锁字段名
        strategyConfig.setLogicDeleteFieldName("deleted");  //设置逻辑删除字段名
        strategyConfig.setEntityLombokModel(true);  //设置是否启用lombok
        autoGenerator.setStrategy(strategyConfig);
        //2.执行生成操作
        autoGenerator.execute();
    }
}
        strategyConfig.setTablePrefix("tbl_");  //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名  例如: User = tbl_user - tbl_
        strategyConfig.setRestControllerStyle(true);    //设置是否启用Rest风格
        strategyConfig.setVersionFieldName("version");  //设置乐观锁字段名
        strategyConfig.setLogicDeleteFieldName("deleted");  //设置逻辑删除字段名
        strategyConfig.setEntityLombokModel(true);  //设置是否启用lombok
        autoGenerator.setStrategy(strategyConfig);
        //2.执行生成操作
        autoGenerator.execute();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kaiyue.zhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值