MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
本文环境
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!--mybatis-plus代码生成-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<!--mybatis plus默认的模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
注:MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖 mybatis-plus-generator
直接贴上最简单的配置
server:
port: 8080
spring:
application:
name: mybatis_plus
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/user?characterEncoding=utf8&useSSL=false
username: root
password: root
mybatis-plus:
type-aliases-package: top.mybatis_plus.user.entity
mapper-locations: classpath:top/mybatis_plus/user/mapper/xml/*.xml
AutoGenerator autoGenerator = new AutoGenerator();
//全局配置
GlobalConfig globalConfig = new GlobalConfig();
String projectPath = System.getProperty("user.dir");//项目路径
globalConfig.setOutputDir(projectPath + "/src/main/java")
.setAuthor("wwh")
.setOpen(false)
.setFileOverride(true)//生成的文件是否覆盖
.setIdType(IdType.INPUT)//ID类型
.setActiveRecord(false);//不支持ActiveRecord
autoGenerator.setGlobalConfig(globalConfig);
//数据源配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL)
.setUrl("jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=false&serverTimezone=UTC")
.setDriverName("com.mysql.jdbc.Driver")
.setUsername("root")
.setPassword("root");
autoGenerator.setDataSource(dataSourceConfig);
//包配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("top.mybatis_plus.user")
.setController("controller")
.setService("service")
.setServiceImpl("service.impl")
.setEntity("entity")
.setMapper("mapper")
.setXml("mapper.xml");
autoGenerator.setPackageInfo(packageConfig);
// 策略配置
StrategyConfig strategyConfig = new StrategyConfig()
.setNaming(NamingStrategy.underline_to_camel)
.setColumnNaming(NamingStrategy.underline_to_camel)
.setEntityLombokModel(true)//lombok模式的实体类
.setRestControllerStyle(true)//RestController
.setControllerMappingHyphenStyle(true)
.setInclude("user");//这里输入要生成的表名
autoGenerator.setStrategy(strategyConfig);
autoGenerator.execute();
执行这段代码就可以生成文件,当然数据库连接要配成自己的。
注:mapper文件要加上注解@Mapper注解
一般我们都会重新写service层,因为service层和业务相关,自动生成的文件带上父类反而不好用(也可能是我没找到service生成的方法)
上面已经生成成功文件,下面进行简单的CRUD操作
controller层
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/selectUserById/{id}")
public User selectUserById(@PathVariable("id") int id){
return userService.selectUserById(id);
}
@PostMapping("/saveUser")
public void saveUser(User user){
userService.saveUser(user);
}
@PostMapping("/updateUser")
public void UpdateUser(User user){
userService.updateUser(user);
}
@PostMapping("/deleteUser/{id}")
public void deleteUser(@PathVariable("id") int id) {
userService.deleteUser(id);
}
}
service层
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User selectUserById(int id) {
return userMapper.selectOne(new QueryWrapper<User>().eq("id",id));
}
@Override
public void saveUser(User user) {
userMapper.insert(user);
}
@Override
public void updateUser(User user) {
userMapper.updateById(user);
}
@Override
public void deleteUser(int id) {
userMapper.deleteById(id);
}
}
dao层
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
实体类
//生成get,set方法
@Data
//生成equals和hashcode方法,默认不管父类继承的属性
@EqualsAndHashCode(callSuper = false)
//生成的set方法默认返回本实体类
@Accessors(chain = true)
public class User implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.INPUT)
private Integer id;
/**
* 用户名
*/
private String name;
/**
* 手机号
*/
private String phone;
/**
* 状态 0 已删除 1 正常
*/
@TableLogic
private Integer status;
}
1、Mybatis-plus插入、修改时,属性为null时,该属性不会改变
原因:mybatis plus的字段策略默认为非null,也就是说当字段属性为null时,该字段不会被更新。
mybatis plus有三种字段策略:
解决办法:
(1)修改全局的验证策略
mybatis-plus:
global-config:
db-config:
insert-strategy: ignored
update-strategy: ignored
注:字段验证策略 3.1.2之后使用这三个insertStrategy,updateStrategy,whereStrategy
(2)调整字段验证注解
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String name;
(3)使用 UpdateWrapper(基本上没用过)
userMapper.update(user,new UpdateWrapper<User>()
.set("name",null).eq("id",user.getId()));
2、逻辑删除
有一次查找数据时怎么都查不到数据,最后找了半天发现是逻辑删除值没有配置,每次查找的时候都会带上status=0(逻辑未删除值默认是0)
什么是逻辑删除
逻辑删除是为了方便数据恢复和保护数据本身价值的一种方案,逻辑删除不是针对删除数据,而是将数据的状态设置为已删除状态,查询的时候会自动查询状态为未删除的数据。
逻辑删除配置
mybatis-plus:
global-config:
db-config:
logic-delete-value: 0 #逻辑删除状态
logic-not-delete-value: 1 #逻辑未删除状态
在实体类字段加上注解@TableLogic
@TableLogic
private Integer status;
删除时 UPDATE user SET status=0 WHERE id=? AND status=1
查找时 select * from user where status=1