SpringBoot项目使用mybatis plus
Mybatis-Plus(简称MP)是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改变,MyBatis-Plus支持所有Mybatis原生的特性,所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。MyBatis 增强工具包,简化 CRUD 操作。启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。
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();
}
}
标签:
SpringBoot
, Mybatis Plus
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战