代码地址:https://gitee.com/lin8081/springboot_mybatisplus_demo.git
1.准备
准备一个springboot框架项目,然后进行引入mybatisPlus
2.引入依赖
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
3.配置修改
1.配置文件添加以下配置
mybatis-plus:
mapper-locations: classpath*:mapper/**/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.huajia.entity
typeEnumsPackage: com.huajia.*
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 2
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 1
#驼峰下划线转换
db-column-underline: false
#刷新mapper 调试神器
refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
#序列接口实现类配置
key-generator: com.baomidou.mybatisplus.incrementer.H2KeyGenerator
#逻辑删除配置(下面3个配置)
logic-delete-value: 0
logic-not-delete-value: 1
# SQL 解析缓存,开启后多租户 @SqlParser 注解生效
sql-parser-cache: true
4.Mapper层修改
1.Mapper接口需要继承BaseMapper<T>
public interface UserMapper extends BaseMapper<User> {
}
5.service层修改
1.service接口需要继承IService<T>
public interface IUserService extends IService<User> {
}
2.service业务类需要继承ServiceImpl<mapper, T>
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
6.实体类修改
1.添加@TableName注解,@TableField注解,@TableId注解
@Data
@TableName("user")
public class User {
@TableId(value = "user_id", type = IdType.AUTO)
private Integer userId;
@TableField(value = "user_name")
private String userName;
@TableField(value = "password")
private String password;
@TableField(value = "sex")
private Integer sex;
@TableField(value = "age")
private Integer age;
@TableField(value = "create_by")
private String createBy;
@TableField(value = "create_date")
private Date createDate;
@TableField(value = "update_by")
private String updateBy;
@TableField(value = "update_date")
private Date updateDate;
}
7.添加pageHealper分页
1.mybatisplus自带分页插件,依赖无需添加分页依赖,添加mybatisPlus配置文件
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//向Mybatis过滤器链中添加分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
8.测试
1.前端控制器Controller
@PostMapping("/addUser")
public Result<?> addUser(@RequestBody User user) {
return userService.addUser(user);
}
@PostMapping("/getUserList")
public Result<?> getUserList(@RequestBody User user) {
return userService.getUserList(user);
}
2.服务类Service接口
Result<?> addUser(User user);
Result<?> getUserList(User user);
3.服务实现类ServiceImpl
@Override
public Result<?> addUser(User user) {
int result = userMapper.insert(user);
if (result == 1) {
return Result.success("新增用户成功");
}
return Result.fail("新增用户失败");
}
@Override
public Result<?> getUserList(User user) {
try {
LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(User::getUserName, user.getUserName());
queryWrapper.eq(User::getState,1);
IPage<User> page = new Page<User>(1, 10);
// 分页查询
IPage<User> userIPage = this.baseMapper.selectPage(page, queryWrapper);
return Result.data(userIPage);
} catch (Exception e) {
e.printStackTrace();
}
return Result.fail("查询失败");
}
4.运行结果
9.配置日志
在配置文件yml或properties配置
# 配置日志 (系统自带的,控制台输出)
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
10.mybatisPlus常用注解
1.@Tablename注解
1.说明
@Tablename注解用来将指定的数据库表和 JavaBean进行映射。多用于项目中entity包下实体类中
2.测试代码
@Tablename("user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
2.@Tableld注解
1.说明
@TableId注解用来指定主键字段
2.写法
@TableId(value=“数据库主键字段”,type = IdType.六种类型之一)
@TableId里的属性值:
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
value | string | “” | 主键字段名 |
type | Enum | IdType.NONE | 主键类型 |
type的类型:
值 | 描述 |
---|---|
Auto | 数据库自增 |
Input | 自行输入 |
ID_Worker | 分布式全局唯一ID 长整型类型 |
UUID | 32位UUID字符串 |
NONE | 无状态 |
ID_WORKER_STR | 分布式全局唯一ID 字符串类型 |
3.测试代码
@TableId(value = "id", type = IdType.UUID)
private String id;
3.@TableField注解
1.说明
主要用来解决实体类的字段名与数据库中的字段名不匹配的问题(数据库user_addr,字段useraddr未驼峰)
2.写法
@TableField(value = "数据库字段")
@TableField里的属性值
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 数据库字段名(如果开启了驼峰映射,这个值可不填) |
exist | boolean | 否 | true | 是否为数据库表字段(true为数据库字段,false为自定义字段) |
condition | String | 否 | “” | 字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s} |
update | String | 否 | “” | 字段 update set 部分注入,例如:当在version字段上注解update="%s+1" 表示更新时会 set version=version+1 (该属性优先级高于 el 属性) |
nsertStrategy | Enum | 否 | FieldStrategy.DEFAULT | 举例:NOT_NULL insert into table_a(column) values (#{columnProperty}) |
updateStrategy | Enum | 否 | FieldStrategy.DEFAULT | 举例:IGNORED update table_a set column=#{columnProperty} |
whereStrategy | Enum | 否 | FieldStrategy.DEFAULT | 举例:NOT_EMPTYwhere <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if> |
fill | Enum | 否 | FieldFill.DEFAULT | 字段自动填充策略 |
select | boolean | 否 | true | 是否进行 select 查询 |
keepGlobalFormat | boolean | 否 | false | 是否保持使用全局的 format 进行处理 |
jdbcType | JdbcType | 否 | JdbcType.UNDEFINED | JDBC 类型 (该默认值不代表会按照该值生效) |
typeHandler | Class<? extends TypeHandler> | 否 | UnknownTypeHandler.class | 类型处理器 (该默认值不代表会按照该值生效) |
numericScale | String | 否 | “” | 指定小数点后保留的位数 |
3.测试代码
@TableField(value = "open_id")
private String openId;
4.@TableLogic注解
1.说明
逻辑删除注解: 一般用于项目中的逻辑删除字段上添加该注解
效果:在字段上加上这个注解再执行BaseMapper的删除方法时,删除方法会变成修改
加@TableLogic的情况下,执行delete就会变成修改
sql:UPDATE 表名 SET deleted=2 WHERE id=? AND deleted=0
不加@TableLogic的情况下,执行delete就直接删除
走 delete from 表名 where id=值
2.写法
@TableLogic(value="原值",delval="改值")
@TableLogic的属性值
value:未删除的值,默认值为0
delval:删除后的值,默认值为1
3.测试代码
@TableField(value = "state")
@TableLogic(value="1",delval="0")
private Integer state;
注意,如果没有设置值,state默认值0,查询时只会查到state=0的值