基本介绍
MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,简化开发、提高效率
增强:
自动生成增删改查
主键的生成策略(自增长、UUID、19位数字、19位字符串)
数据的逻辑删除
数据的自动填充
离线乐观锁
SQL性能分析
条件构建
代码实现
导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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.0.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
全局配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: root
url: jdbc:mysql:///data-test
driver-class-name: com.mysql.jdbc.Driver
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.buliyat.qcy.pojo
global-config:
db-config:
table-prefix: t_
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
AppConfig
@SpringBootConfiguration
@ComponentScan(basePackages = {"com.buliyat.qcy"})
@MapperScan(basePackages = {"com.buliyat.qcy.mapper"})
public class AppConfig {}
启动类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Mapper
@Component
public interface UserMapper extends BaseMapper<User> {}
测试
@SpringBootTest(classes = {Application.class})
@RunWith(SpringRunner.class)
public class Test {
@Autowired
private UserMapper userMapper;
@Test
public void testList(){
List<User> userList=userMapper.selectList(null);
System.out.println("全表查询:"+userList);
}
@Test
public void testFindUserById(){
User user=userMapper.selectById(4);
System.out.println("条件查询:"+user);
}
}
数据添加
19位字符串
// 数据表中 数据类型为 varchar 19
@TableId(type = IdType.ID_WORKER_STR)
private String id;
19位数字
// 数据表中 数据类型为 bigint 19
@TableId(type = IdType.ID_WORKER)
private Long id;
自增
// 数据表中 该字段需添加自动增长
@TableId(type = IdType.AUTO)
private Integer id;
输入主键
@TableId(type = IdType.INPUT)
private Integer id;
UUID
// 数据表中 数据类型为 varchar 40
@TableId(type = IdType.UUID)
private String id;
无主键
@TableId(type = IdType.NONE)
private Integer id;
数据更新
id更新
public void updateById(int id) {
User user = userMapper.selectById(id);
if(null!=user){
user.setUsername("xxx");
user.setPassword("111");
userMapper.updateById(user);
}
}
条件更新
public void updateByCondition() {
User user = new User();
user.setUsername("china");
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("username","buliyat"); // 等于
// wrapper.ge() // 大于等于
// wrapper.le() // 小于等于
// wrapper.allEq() // 所有等于
// wrapper.and() // 构建一个and关系
// wrapper.in() // 构建一个in的关系
// wrapper.setSql() // 直接设置SQL语句
userMapper.update(user, wrapper);
}
数据自动填充
// 实体
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill =FieldFill.INSERT_UPDATE)
private Date updateTime;
// Handler
@Component
public class MyObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
离线乐观锁
// 实体
@Version
private Integer version;
// 插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
数据删除
id删除
public void deleteById() {
// 通过id 删除数据
// userMapper.deleteById("123");
// 通过多id 删除数据
//List<String> idList = Arrays.asList("1", "2", "3");
//userMapper.deleteBatchIds(idList);
// 通过多个相等的条件 删除数据
Map<String,Object> idMap=new HashMap<>();
idMap.put("id","123");
idMap.put("username","buliyat");
userMapper.deleteByMap(idMap);
}
条件删除
public void deleteByCondition() {
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("username", "buliyat");
wrapper.or()
.like("username", "buli")
.or()
.eq("password", "111")
.in("id","12","23","34");
userMapper.delete(wrapper);
}
逻辑删除
// 实体
@TableLogin
private Integer deleted;
// 插件
@Bean
public ISqlInjector iSqlInjectot(){
return new LoginSqlInjector();
}
数据查询
id查询
public void selectById(){
User user = userMapper.selectById("106d1aed049d47b8a287ac6e567650ae");
System.out.println("id查询:"+user);
}
条件查询(单条数据)
public void selectOne(){
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("id","106d1aed049d47b8a287ac6e567650ae");
User user = userMapper.selectOne(userQueryWrapper);
System.out.println("条件查询:"+user);
}
条件查询(多条数据)
public void selectList(){
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("id","106d1aed049d47b8a287ac6e567650ae");
userQueryWrapper.eq("username","xiaobobo");
List<User> userList = userMapper.selectList(userQueryWrapper);
System.out.println("条件查询:"+userList);
}
分页查询
public void selectPage(){
IPage<User> page=new Page<>();
page.setCurrent(1);
page.setSize(2);
IPage<User> result = userMapper.selectPage(page,null);
long pages = result.getPages();
long total = result.getTotal();
long current = result.getCurrent();
long size = result.getSize();
List<User> records = result.getRecords();
}
性能分析
@Bean
@Profile({"dev","test"}) // 在什么环境生效
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
// 若运行时间大于2毫秒 报错
performanceInterceptor.setMaxTime(100);
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
字段对应
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_user")
public class User {
@TableField(exist = false) // 该字段在数据库中 不对应
private Integer age;
}