
好几把炫酷
入门案例
导入坐标
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency>
|
yml配置
1 2 3 4 5 6 7
| spring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: root url: jdbc:mysql:///db1?serverTimezone=UTC type: com.alibaba.druid.pool.DruidDataSource
|
数据层接口
接口继承一个mybatisplus写好的mapper。
1 2 3
| @Mapper public interface BookDao extends BaseMapper<Book> { }
|
注意,这里搜索的数据库表是按泛型中的类名来搜索的,比如这里就是连接的db1下的book表,如果要更改,要到实体类上添加注解。
1 2
| @TableName("tb_book") public class Book {
|
完成
mybatisplus会自动写好一些sql语句
1 2 3 4 5 6 7 8 9 10 11 12
| @SpringBootTest class MybatisPlusApplicationTests { @Autowired private BookDao bookDao;
@Test void contextLoads() { List<Book> books = bookDao.selectList(null); System.out.println(books); }
}
|
标准CRUD制作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| @SpringBootTest class MybatisPlusApplicationTests { @Autowired private BookDao bookDao;
@Test void testSave(){ Book book = new Book("111","aaa","ddd"); bookDao.insert(book); }
@Test void testDelete(){ bookDao.deleteById(5); }
@Test void testUpdate(){ Book book = new Book(); book.setId(1); book.setName("999999"); bookDao.updateById(book); }
@Test void testGetById(){ Book book = bookDao.selectById(1); System.out.println(book); }
|
注意,改操作是一个动态sql语句,可以随意更改。
分页查找
1 2 3 4 5 6 7 8 9 10
| @Test void testGetByPage() { IPage page = new Page(1, 2); bookDao.selectPage(page, null); System.out.println("当前页码值" + page.getCurrent()); System.out.println("每页显示数: " + page.getSize()); System.out.println("一共多少页: " + page.getPages()); System.out.println("一共多少条数据: " + page.getTotal()); System.out.println("数据: " + page.getRecords()); }
|
需要配置mybatisplus拦截器
1 2 3 4 5 6 7 8 9 10 11
| @Configuration public class MpConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mybatisPlusInterceptor; } }
|
DQL编程控制
条件查询
需要封装wrapper对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @Test void testByCondition(){
LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.lt(Book::getId,2).or().gt(Book::getId,3); List books = bookDao.selectList(lambdaQueryWrapper); System.out.println(books); }
|
条件查询NULL判定
可在lt,gt方法中添加condition变量,,略过,,
查询投影
1 2 3 4 5
| QueryWrapper<Book> queryWrapper = new QueryWrapper<Book>(); queryWrapper.select("count(*) as count,description"); queryWrapper.groupBy("description"); List<Map<String, Object>> maps = bookDao.selectMaps(queryWrapper); System.out.println(maps);
|
查询条件设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.like(Book::getType,"2"); List<Book> books = bookDao.selectList(lambdaQueryWrapper); System.out.println(books);
|
字段映射和表名映射
在实体类中用@TableField注解中的属性Value来映射。列名和表名都可以。
属性exist可以去除数据库中实际没有的属性。
属性select可以使该属性不参与查询,例如密码。
DML编程控制
id生成策略
使用@TableId注解定义里面的type属性。
还可以在配置文件yml中全局配置。
多记录删除
传入一个list集合即可。
逻辑删除
在数据库(要有默认值)和实体类中添加一个状态字段,表示数据是否可用。
在实体类状态属性上添加一个注解@TableLogic,其中的value属性表示可用,delval表示不可用。
也可以在配置文件中全局配置 logic-delete-field, logic-delete-value。
之后所有的数据库操作都会带上and deleted=0这个条件。
乐观锁
在配置中添加一个拦截器。
1
| mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
|
在实体类中version属性添加注解@version。