Mybatis-Plus框架的学习

Updated on with 0 views and 0 comments

Mybatis-Plus框架的学习

Mybatis-Plus框架

MyBatis-Plus 介绍

  1. 简介

    MyBatis-Plus(简称 MP)是一个 MyBati的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

  2. 特性

    • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
    • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
    • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
    • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
    • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
    • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
    • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
    • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
    • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
    • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
    • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
    • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
  3. 框架结构

    image-20210802104511689

MyBatis-Plus CRUD Mapper 接口使用

yml 配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///mybatis?characterEncoding=utf8
    username: root
    password: admin

# 在控制台显示 SQL
logging:
  level:
    com:
      bh:
        mybatis:
        dao: debug

dao 接口 继承 BaseMapper<实体类> mp 封装好的 方法接口

有特殊需求 自己追加 方法

主启动类增加 MapperScan 扫描注解

pojo 对象 需要 指定 映射表 主键字段

@TableName(value = "t_user")// 匹配表名和实体类名不一致
public class User implements Serializable {
    @TableId(type = IdType.AUTO)// 主键和主属性对应匹配 必须配置 mybatis是auto_increment,mp是 雪花算法
    private Integer uid;
    // @TableField // 非主键和非主属性匹配
    private String uname;
    private String upwd;
}

接近全 ORM 的实现

插入操作

// 插入操作 -- 获取id
@Test
void contextLoads() {

    User user = new User(0,"炳汉","0022");

    userDao.insert(user);

    System.out.println(user.getUid());
}

删除操作

// 删除操作 -- 一组 id 删除
@Test
void delBtIds() {
    // 方式一
    // userDao.deleteBatchIds(Arrays.asList(20,19));
    // 方式二
    List<Integer> list = new ArrayList<>();
    list.add(19);
    list.add(20);
    userDao.deleteBatchIds(list);
}

修改操作

// 修改操作 -- 主键修改
@Test
void updateByPrimaryKey() {

    User user = new User(18,"卧龙先生","5577");

    userDao.updateById(user);
}

查询操作

// 查询操作 -- 三大类 实体类对象封装、 统计个数、 Map 对象封装 (以及带分页,封装条件有Map 和 queryWrapper)

// 一组 id 查询
@Test
void selectByIds() {
    List<User> users = userDao.selectBatchIds(Arrays.asList(16, 17, 18));
    System.out.println(users);
}

// 使用 Map 封装查询条件 -- 精确查询 不支持模糊查询 =
@Test
void selectByMap() {
    Map<String,Object> map = new HashMap<>();
    map.put("uname","张三");
    List<User> users = userDao.selectByMap(map);
    System.out.println(users);
}

// 使用 queryWrapper 封装查询条件 -- 查询一个结果
@Test
void selectByWrapper() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("uid",18);
    wrapper.eq("upwd","5577");
    User user = userDao.selectOne(wrapper);
    System.out.println(user);
}

// 查询 -- 统计个数\
@Test
void selectByCount() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    // 模糊查询
    // 全模糊
    // wrapper.like("uname","张");
    // 右模糊
    wrapper.likeRight("uname","张");
    // 或者
    wrapper.or();
    wrapper.likeRight("uname","孙");
    // 方法连用也支持 方法 返回值就是本类对象
    // wrapper.likeRight("uname","张").or().likeRight("uname","孙");
    Integer integer = userDao.selectCount(wrapper);
    System.out.println(integer);
}


// 查询操作 -- 排序
@Test
void order() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.orderByDesc("upwd","uname");
    List<User> users = userDao.selectList(wrapper);
    System.out.println(users);
}

// 向 Map 集合保存数据
@Test
void selectToMap() {
    List<Map<String, Object>> maps = userDao.selectMaps(null);
    System.out.println(maps);
}

不管是向Map还是对象封装数据对于前端来说格式都是通过字符串传输转回的对象,无本质区别,使用都是xx.xx

Page 分页

分页操作

// 分页测试
@Test
void Page() {
    Page<User> page = new Page<>(1,5);// 页码 和 页容量
    Page<User> userPage = userDao.selectPage(page, null);
    System.out.println("当前页号"+userPage.getCurrent());
    System.out.println("总页数"+userPage.getPages());
    System.out.println("总行数"+userPage.getTotal());
    System.out.println("当前页数据:");
    List<User> records = userPage.getRecords();
    System.out.println(records);
}

因为没有配置文件了 所以需要配置类

需要配置分页拦截器 MybatisPlusInterceptor

放到哪个位置都可以 只要IoC容器管理即可

// 分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
}

Object 接收数据

// 采用 Object 接收数据
@Test
void selectToObject() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.select("uname");
    List<Object> objects = userDao.selectObjs(wrapper);
    System.out.println(objects);
}

需要自定义的 增加即可 不影响

MyBatis-Plus CRUD Service 接口使用

业务层 也通过继承封装好的实现了 npmp

接口:UserService

extends IService

public interface UserService extends IService<User> {
}

接口实现类:UserServiceImpl

extends ServiceImpl<userDao,User>

implement UserService

@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
}

只针对单表 多表需要自己根据业务添加

测试

@SpringBootTest
public class ServiceTest {

    @Autowired
    private UserService userService;

    // 测试增加操作
    @Test
    public void testSave() {
        userService.save(new User(0,"天使","983"));
    }

    // 测试修改操作
    @Test
    public void testUpdate() {
        userService.updateById(new User(21,"白天使","987"));
    }

    // 测试查询操作
    @Test
    public void testSelect() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.likeRight("uname","张");
        List<User> list = userService.list(wrapper);
        System.out.println(list);
    }
}

MyBatis-Plus 代码生成器使用

  • pom 依赖

    <dependencies>
        <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>
        <!-- mp 的 pom 包米豆的 若只需要mp 则mybatis的启动器可以不用-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <!-- 代码生成器包-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!-- 基于 Java 的模板引擎 velocity 可以实现彻底的前后端-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
  • 全局配置 项目路径、作者

    getSwagger 相当于浏览器请求测试(相当于Postman)

  • 数据源配置

  • 指定生成位置的路径

  • 生成内容的策略配置

@Test
void contextLoads() {
    // 代码生成
    // 全局配置 项目路径、作者

    // 代码生成器
    AutoGenerator mpg = new AutoGenerator();

    // 全局配置
    GlobalConfig gc = new GlobalConfig();
    // 项目路径
    String projectPath = System.getProperty("user.dir");
    // 生成内容全局路径
    gc.setOutputDir(projectPath+"/src/main/java");
    gc.setAuthor("lbh");// 设置作者
    gc.setOpen(false);// 生成后是否打开资源管理器
    gc.setFileOverride(false);// 重新生成文件是否覆盖
    // 业务层接口名称 格式为去掉下划线改为大写
    gc.setServiceName("%sService");
    // gc.setSwagger2(true); 实体属性 Swagger2 注解

    mpg.setGlobalConfig(gc);

    //数据源配置
    DataSourceConfig dsc = new DataSourceConfig();
    dsc.setUrl("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useSSL=false&characterEncoding=utf8");
    // dsc.setSchemaName("public");
    dsc.setDriverName("com.mysql.cj.jdbc.Driver");
    dsc.setUsername("root");
    dsc.setPassword("admin");
    //指定哪种数据库
    dsc.setDbType(DbType.MYSQL);

    mpg.setDataSource(dsc);

    //指定生成内容的路径
    // 包配置
    PackageConfig pc = new PackageConfig();
    pc.setModuleName(null);
    pc.setParent("com.bh");
    pc.setController("controller");
    pc.setEntity("pojo");
    pc.setService("service");
    pc.setMapper("dao");
    mpg.setPackageInfo(pc);

    //生成内容的根据
    //策略配置
    StrategyConfig strategy = new StrategyConfig();
    strategy.setInclude("t_user","t_user_base");//对那一张表生成代码
    strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略 下换线2驼峰
    strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀

    strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
    strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作

    strategy.setRestControllerStyle(true); //restful api风格控制器
    strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符

    mpg.setStrategy(strategy);

    //执行生成操作
    mpg.execute();
}

注意: 不要用 SpringBootTest 整合测试 单独运行


标题:Mybatis-Plus框架的学习
作者:HB2Ocean
地址:http://future-hb.top:8080/articles/2021/08/03/1627923416674.html