SpringBoot项目使用mybatis plus

Mybatis-Plus(简称MP)是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改变,MyBatis-Plus支持所有Mybatis原生的特性,所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。MyBatis 增强工具包,简化 CRUD 操作。启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。

官方文档:https://baomidou.com/

MybatisPlus使用入门

引入相关依赖

<!-- JDBC -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- MySQL 驱动包-->
<!--MySQL Server 版本为 8.x时,mysql-connector-java使用5.1.35时会报错-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

<!-- mybatis plus 及代码生成器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>

application.yml配置

server:
  port: 9999

spring:
  datasource:
    #通用配置
    driver-class-name: com.mysql.jdbc.Driver
    password: root
    username: root
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&charcterEncoding=UTF-8&useSSL=false
    #数据源连接池配置
    hikari:
      minimum-idle: 10
      maximum-pool-size: 20
      idle-timeout: 500000
      max-lifetime: 540000
      connection-timeout: 60000
      connection-test-query: select 1

# mybatis-plus配置
mybatis-plus:
  # xml扫描,告诉 Mapper 所对应的 XML 文件位置
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  configuration:
    # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
    map-underscore-to-camel-case: true
    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

常用的MyBatis-plus配置:

####################  mybatis-plus配置  ###################
mybatis-plus:
  #外部化xml配置 (configuration 不能和 config-location 同时存在)
  #config-location: classpath:mybatis-config.xml
  #指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署
  #configuration-properties: classpath:mybatis/config/properties
  #xml扫描,多个目录用逗号或者分号分割(告诉 Mapper 所对应的 XML 文件位置)
  mapper-locations: classpath:mapper/*.xml
  #MyBatis 别名包扫描路径,通过该属性可以给包中的类注册别名,多个路径用逗号分割
  type-aliases-package: com.wongoing.sys.model
  #如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象
  type-aliases-super-type: java.lang.Object
  #枚举类 扫描路径,如果配置了该属性,会将路径下的枚举类进行注入,让实体类字段能够简单快捷的使用枚举属性
  #type-enums-package: com.wongoing.sys.model
  #项目启动会检查xml配置存在(只在开发时打开)
  check-config-location: true
  #SIMPLE:该执行器类型不做特殊的事情,为每个语句的执行创建一个新的预处理语句,REUSE:改执行器类会复用预处理语句,BATCH:该执行器类型会批量执行所有的更新语句
  default-executor-type: REUSE
  configuration:
	# 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
	map-underscore-to-camel-case: true
	# 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true
	cache-enabled: true
	#懒加载
	aggressive-lazy-loading: true
	#none:不启用自动映射 partial:只对非嵌套的 resultMap 进行自动映射 full:对所有的 resultMap 都进行自动映射
	auto-mapping-behavior: partial
	#none:不做任何处理 (默认值)warning:以日志的形式打印相关警告信息 failing:当作映射失败处理,并抛出异常和详细信息
	auto-mapping-unknown-column-behavior: none
	#如果查询结果中包含空值的列,则 MyBatis 在映射的时候,会不会映射这个字段
	call-setters-on-nulls: true   #允许在resultType="map"时映射null值
	#这个配置会将执行的sql打印出来,在开发或测试的时候可以用
	log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
	#是否允许映射结果为多个数据集
	multiple-result-sets-enabled: false
  global-config:
	db-config:
	  #表名下划线命名默认为true
	  table-underline: false
	  #id类型: 0  # 0:数据库ID自增   1:用户输入id  2:全局唯一id(IdWorker)  3:全局唯一ID(uuid)
	  id-type: auto
	  #是否开启大写命名,默认不开启
	  capital-mode: false
	  #逻辑已删除值,(逻辑删除下有效) 需要注入逻辑策略LogicSqlInjector 以@Bean方式注入
	  logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
	  #逻辑未删除值,(逻辑删除下有效)
	  logic-delete-value: 1 # 逻辑已删除值(默认为 1)

启动类

@SpringBootApplication
//org.mybatis.spring.annotation.MapperScan,扫描Mapper接口所在位置
@MapperScan("com.harvey.demo.dao.mapper")
public class DemoApp {

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

注:必须添加@MapperScan,否则不能正常使用

实体类、Mapper接口

User.java

@TableName("tb_user")
public class User {

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @TableField(value = "name")
    private String name;

    @TableField(value = "age")
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

}

更多的注解参考官方文档:https://baomidou.com/pages/223848/

UserMapper.java

public interface UserMapper extends BaseMapper<User> {

}

MybatisPlus配置

分页插件配置:

@Configuration
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        //数据库类型, 单一数据库类型建议设置
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        //溢出总页数后是否进行处理, 默认false,不处理
        paginationInnerInterceptor.setOverflow(true);
        //单页分页条数限制, 默认无限制
        paginationInnerInterceptor.setMaxLimit(10000L);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

参考官方文档:https://baomidou.com/pages/97710a/

测试验证

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApp.class)
public class WebSpringTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testMybatisPlus() {
        //插入数据
        User user = new User();
        user.setName("王羲之");
        user.setAge(55);
        userMapper.insert(user);
        System.out.println("user id = " + user.getId());

        //查询
        QueryWrapper queryWrapper = new QueryWrapper();
        List<User> userList = userMapper.selectList(queryWrapper);
        for (User userInfo : userList) {
            System.out.println("id = " + userInfo.getId() + ", name = " + userInfo.getName() + ", age = " + userInfo.getAge());
        }
        //分页查询
        QueryWrapper pageQueryWrapper = new QueryWrapper();
        for (int i = 0; i < 10; i++) {
            IPage iPage = new Page();
            iPage.setCurrent(i); //当前页
            iPage.setSize(1); //每页大小
            userMapper.selectPage(iPage, pageQueryWrapper);
            List<User> users = iPage.getRecords();
            for (User userInfo : users) {
                System.out.println("id = " + userInfo.getId() + ", name = " + userInfo.getName() + ", age = " + userInfo.getAge());
            }
        }
    }
}

实际开发中我们不会直接使用XxxMapper,而是调用service服务层。MybatisPlus也提供了IService接口和ServiceImpl类帮我们简化增删改查的操作:

//服务接口
public interface UserService extends IService<User> {
}

//服务接口实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

我们只要按照上面操作,UserServiceImpl就自动拥有针对单表的增删改查功能。

MybatisPlus不同版本的分页插件

从MybatisPlus 3.4.0 版本开始, PaginationInterceptor 分页过期失效。替代的是PaginationInnerInterceptor。

老版本的分页配置:

@Configuration
public class MybatisPlusConfig {
 
    //3.4.0 之前分页的bean
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
 
    /**
     * 防止 修改与删除时对全表进行操作
     * @return
     */
    @Bean
    public BlockAttackInnerInterceptor blockAttackInnerInterceptor(){
        return new BlockAttackInnerInterceptor();
    }
}

新版本分页配置:

@Configuration
public class MybatisPlusConfig {
 
    /**
     * 防止 修改与删除时对全表进行操作
     * @return
     */
    @Bean
    public BlockAttackInnerInterceptor blockAttackInnerInterceptor(){
        return new BlockAttackInnerInterceptor();
    }
 
 
    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
 
 
    /**
     * ConfigurationCustomizer,这里引用的是MyBatisPlus自定义的一个和MyBatis同名的接口,com.baomidou.mybatisplus.spring.boot.starter.ConfigurationCustomizer,
     * 因此必须使用MyBatisPlus的ConfigurationCustomizer才行
     * @return
     */
    public ConfigurationCustomizer configurationCustomizer(){
        return new ConfigurationCustomizer() {
            @Override
            public void customize(MybatisConfiguration configuration) {
                configuration.setCacheEnabled(true);
                configuration.setMapUnderscoreToCamelCase(true);
                configuration.setCallSettersOnNulls(true);
                configuration.setJdbcTypeForNull(JdbcType.NULL);
            }
        };
    }
 
}

MybatisPlus代码生成器

这里只演示新版的代码生成器(mybatis-plus-generator 3.5.1 及其以上版本)。

引入依赖

<!-- JDBC -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- MySQL 驱动包-->
<!--MySQL Server 版本为 8.x时,mysql-connector-java使用5.1.35时会报错-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

<!-- mybatis plus 及代码生成器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>
<!-- freemarker模板 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

生成代码

public class CodeGenerator {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&charcterEncoding=UTF-8&useSSL=false";
        String username = "root";
        String password = "root";
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    builder.author("harvey") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("D://MP"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.harvey.demo") // 设置父包名
                            .moduleName("user") // 设置父包模块名,user下会生成对应的controller、entity、mapper、service目录
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://MP/mapperXml")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("tb_user") // 设置需要生成的表名
                            .addTablePrefix("tb_", "c_"); // 设置过滤表前缀,这里设置了tb_,表示会将表中的tb_前缀去掉,只保留user,最后会生成UserController等
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板, 需要引入对应的依赖starter
                .execute();

    }
}

 

posted @ 2022-04-23 17:12  残城碎梦  阅读(245)  评论(0编辑  收藏  举报