lombok插件

只需要在pom.xml中配上这么短短几行, 就能省去手动写pojo类的麻烦

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

代码示例 ->

package com.itheima.domain;



import lombok.Data;

@Data
public class Book {
    private Long id;
    private String type;
    private String name;
    private String description;

}

需要设置成provided
因为这个插件不需要参与打包~

MyBatis-Plus导入

idea中并没有集成MyBatis-Plus, 因此需要我们手动加入坐标

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

然后...pojo写成这样就可以了...

@Mapper
public interface BookDao extends BaseMapper<Book> {

}

分页查询

分页查询稍微麻烦一丢丢...

  1. 在config下配置拦截器
@Configuration
public class MpConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        //1.定义mp拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //2.加入分页拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
  1. 开始分页查询

     @Test
     void testGetByPages(){
         IPage page = new Page(1, 2);//分页查询的配置, 结果都存储在IPage类中
         bookDao.selectPage(page, null);
         System.out.println("当前页码值: " + page.getCurrent() );
         System.out.println("一共多少页: " + page.getPages());
         System.out.println("每页显示数: " + page.getSize());
         System.out.println("总数据条数" + page.getTotal());
         System.out.println("数据: " + page.getRecords());
     }

条件查询

  1. 简单的条件查询
        LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<Book>();
        wrapper.le(Book::getId, 10L).ge(Book::getId, 1L);//链式编程
        List<Book> books = bookDao.selectList(wrapper);
        System.out.println(books);
  1. 稍微复杂的条件查询(判断是否为null)

首先创建一个*Query类 extends 需要查询的pojo类

package com.itheima.query;

import com.itheima.domain.Book;
import lombok.Data;

@Data
public class BookQuery extends Book {
    private Long id2;
}

然后..通过这条语句判断值是否为null

wrapper.le(null != bq.getId2(), Book::getId, bq.getId2());

完整代码如下:

    //null值处理
    @Test
    void testCheckNull(){
        BookQuery bq = new BookQuery();
        bq.setId(1L);
        //bq.setId2(5L);

        LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<Book>();
        wrapper.le(null != bq.getId2(), Book::getId, bq.getId2());
        wrapper.ge(null != bq.getId(), Book::getId, bq.getId());

        List<Book> books = bookDao.selectList(wrapper);
        System.out.println(books);
    }

查询投影

  1. 查询pojo类中已存在的属性:
        LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(Book::getId, Book::getName);//投影
        wrapper.le(Book::getId, 2L).ge(Book::getId, 1L);
        List<Book> books = bookDao.selectList(wrapper);
        System.out.println(books);
  1. 查询pojo内不存在的属性: 那就不能用Lambda了
        QueryWrapper<Book> wrapper = new QueryWrapper<>();
        wrapper.select("count(*) as count, type");
        wrapper.groupBy("type");
        List<Map<String, Object>> maps = bookDao.selectMaps(wrapper);
        System.out.println(maps);

equls

        LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Book::getId, 1L).eq(Book::getName, "Spring实战 第5版");
        Book book = bookDao.selectOne(wrapper);
        System.out.println(book);

between

        LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<Book>();
        wrapper.between(Book::getId, 1L, 5L);
        List<Book> books = bookDao.selectList(wrapper);
        System.out.println(books);

like

注意: likeLeft(__)相当于只在左边加了%
"%j"查不出jerry, 因为jerry不是以j结尾!

        LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(Book::getName, "实战");
        List<Book> books = bookDao.selectList(wrapper);
        System.out.println(books);

更多映射

//映射表名
@TableName("tbl_book")

//映射字段名, 是否select
@TableField(value = "name", select = false)

//设置字段名在数据库中不存在
@TableField(exist = false)

id生成策略

  1. 在pojo类头上加上注解 @TableId(__)

     @TableId(type = IdType.ASSIGN_ID)
     private Long id;

全局配置

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: assign_id #全局配id生成方式
      table-prefix: tbl_ #配表前缀, 就不用加@TableName("tbl_book")注解映射表名了

批量操作

  1. 批量删除
        List<Long> list = new ArrayList<>();
        list.add(1846495959000645633L);
        list.add(1846496014864556034L);
        int i = bookDao.deleteBatchIds(list);
        System.out.println("影响了" + i + "行");

逻辑删除

  1. 开启逻辑删除功能需要加上这个注解

    @TableLogic(value = "0", delval = "1")
  2. 或者在yaml中添加全局变量

       logic-delete-field: deleted
       logic-delete-value: 1
       logic-not-delete-value: 0

MP启动乐观锁

  1. 表中加入 version 字段, 用来标记当前修改数据的版本
  2. 在对应的pojo类中同样加入version, 并挂上@Version注解(表示这个数据挂上了乐观锁)

    @Version
    private Integer version;
  3. 在MyBatis的拦截器config中加入乐观锁拦截器

    //3.加入乐观锁拦截器
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  4. 并发模拟

     //并发模拟
     @Test
     void testModify(){
         Book book = bookDao.selectById(3L);
         Book book1 = bookDao.selectById(3L);
    
         book.setName("Spring 5 设计模式--小金著");
         book1.setName("Spring 5 设计模式--小牛著");
    
         bookDao.updateById(book);
         bookDao.updateById(book1);
    
     }

代码生成器

没啥好说的, 直接看完整代码就好

    public static void main(String[] args) {
        AutoGenerator autoGenerator = new AutoGenerator();

        //设置数据源
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/ssm_db");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        autoGenerator.setDataSource(dataSource);

        //设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir") + "/mp_02_generator/src/main/java");
        globalConfig.setOpen(false);//生成完要不要打开文件夹
        globalConfig.setAuthor("黑马程序员");
        globalConfig.setFileOverride(true);
        globalConfig.setMapperName("%sDao");//设置数据层接口名
        globalConfig.setIdType(IdType.ASSIGN_ID);//设置ID生成策略(雪花算法)
        autoGenerator.setGlobalConfig(globalConfig);

        //软件包相关配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.aaa");//设置父包
        packageConfig.setEntity("domain");//设置实体类包名
        packageConfig.setMapper("dao");//设置dao层软件包的名字
        autoGenerator.setPackageInfo(packageConfig);

        //策略设置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("tbl_book");//设置参与生成的表名
        strategy.setTablePrefix("tbl_");//设置表的前缀不参与生成
        strategy.setRestControllerStyle(true);//使用rest开发风格
        strategy.setEntityLombokModel(true);//打开实体类Lombok模式
        strategy.setVersionFieldName("version");//设置乐观锁字段名
        strategy.setLogicDeleteFieldName("deleted");//设置逻辑删除字段名
        autoGenerator.setStrategy(strategy);

        autoGenerator.execute();
    }

System.getProperty("user.dir") 可以直接定位到当前的项目名, 从模块名往下写就可以了

This message is used to verify that this feed (feedId:68985902220024832) belongs to me (userId:68596786972812288). Join me in enjoying the next generation information browser https://follow.is.