lombok插件
只需要在pom.xml中配上这么短短几行, 就能省去手动写pojo类的麻烦
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
代码示例 ->
package com.itheima.domain;
import lombok.Data;
@Data
public class Book {
private Long id;
private String type;
private String name;
private String description;
}
因为这个插件不需要参与打包~
MyBatis-Plus导入
idea中并没有集成MyBatis-Plus, 因此需要我们手动加入坐标
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
然后...pojo写成这样就可以了...
@Mapper
public interface BookDao extends BaseMapper<Book> {
}
分页查询
分页查询稍微麻烦一丢丢...
- 在config下配置拦截器
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
//1.定义mp拦截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//2.加入分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
开始分页查询
@Test void testGetByPages(){ IPage page = new Page(1, 2);//分页查询的配置, 结果都存储在IPage类中 bookDao.selectPage(page, null); System.out.println("当前页码值: " + page.getCurrent() ); System.out.println("一共多少页: " + page.getPages()); System.out.println("每页显示数: " + page.getSize()); System.out.println("总数据条数" + page.getTotal()); System.out.println("数据: " + page.getRecords()); }
条件查询
- 简单的条件查询
LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<Book>();
wrapper.le(Book::getId, 10L).ge(Book::getId, 1L);//链式编程
List<Book> books = bookDao.selectList(wrapper);
System.out.println(books);
- 稍微复杂的条件查询(判断是否为null)
首先创建一个*Query类 extends 需要查询的pojo类
package com.itheima.query;
import com.itheima.domain.Book;
import lombok.Data;
@Data
public class BookQuery extends Book {
private Long id2;
}
然后..通过这条语句判断值是否为null
wrapper.le(null != bq.getId2(), Book::getId, bq.getId2());
完整代码如下:
//null值处理
@Test
void testCheckNull(){
BookQuery bq = new BookQuery();
bq.setId(1L);
//bq.setId2(5L);
LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<Book>();
wrapper.le(null != bq.getId2(), Book::getId, bq.getId2());
wrapper.ge(null != bq.getId(), Book::getId, bq.getId());
List<Book> books = bookDao.selectList(wrapper);
System.out.println(books);
}
查询投影
- 查询pojo类中已存在的属性:
LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<>();
wrapper.select(Book::getId, Book::getName);//投影
wrapper.le(Book::getId, 2L).ge(Book::getId, 1L);
List<Book> books = bookDao.selectList(wrapper);
System.out.println(books);
- 查询pojo内不存在的属性: 那就不能用Lambda了
QueryWrapper<Book> wrapper = new QueryWrapper<>();
wrapper.select("count(*) as count, type");
wrapper.groupBy("type");
List<Map<String, Object>> maps = bookDao.selectMaps(wrapper);
System.out.println(maps);
equls
LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Book::getId, 1L).eq(Book::getName, "Spring实战 第5版");
Book book = bookDao.selectOne(wrapper);
System.out.println(book);
between
LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<Book>();
wrapper.between(Book::getId, 1L, 5L);
List<Book> books = bookDao.selectList(wrapper);
System.out.println(books);
like
注意: likeLeft(__)相当于只在左边加了%
"%j"查不出jerry, 因为jerry不是以j结尾!
LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<>();
wrapper.like(Book::getName, "实战");
List<Book> books = bookDao.selectList(wrapper);
System.out.println(books);
更多映射
//映射表名
@TableName("tbl_book")
//映射字段名, 是否select
@TableField(value = "name", select = false)
//设置字段名在数据库中不存在
@TableField(exist = false)
id生成策略
在pojo类头上加上注解 @TableId(__)
@TableId(type = IdType.ASSIGN_ID) private Long id;
全局配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: assign_id #全局配id生成方式
table-prefix: tbl_ #配表前缀, 就不用加@TableName("tbl_book")注解映射表名了
批量操作
- 批量删除
List<Long> list = new ArrayList<>();
list.add(1846495959000645633L);
list.add(1846496014864556034L);
int i = bookDao.deleteBatchIds(list);
System.out.println("影响了" + i + "行");
逻辑删除
开启逻辑删除功能需要加上这个注解
@TableLogic(value = "0", delval = "1")
或者在yaml中添加全局变量
logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0
MP启动乐观锁
- 表中加入 version 字段, 用来标记当前修改数据的版本
在对应的pojo类中同样加入version, 并挂上@Version注解(表示这个数据挂上了乐观锁)
@Version private Integer version;
在MyBatis的拦截器config中加入乐观锁拦截器
//3.加入乐观锁拦截器 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
并发模拟
//并发模拟 @Test void testModify(){ Book book = bookDao.selectById(3L); Book book1 = bookDao.selectById(3L); book.setName("Spring 5 设计模式--小金著"); book1.setName("Spring 5 设计模式--小牛著"); bookDao.updateById(book); bookDao.updateById(book1); }
代码生成器
没啥好说的, 直接看完整代码就好
public static void main(String[] args) {
AutoGenerator autoGenerator = new AutoGenerator();
//设置数据源
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/ssm_db");
dataSource.setUsername("root");
dataSource.setPassword("123456");
autoGenerator.setDataSource(dataSource);
//设置全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir") + "/mp_02_generator/src/main/java");
globalConfig.setOpen(false);//生成完要不要打开文件夹
globalConfig.setAuthor("黑马程序员");
globalConfig.setFileOverride(true);
globalConfig.setMapperName("%sDao");//设置数据层接口名
globalConfig.setIdType(IdType.ASSIGN_ID);//设置ID生成策略(雪花算法)
autoGenerator.setGlobalConfig(globalConfig);
//软件包相关配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.aaa");//设置父包
packageConfig.setEntity("domain");//设置实体类包名
packageConfig.setMapper("dao");//设置dao层软件包的名字
autoGenerator.setPackageInfo(packageConfig);
//策略设置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("tbl_book");//设置参与生成的表名
strategy.setTablePrefix("tbl_");//设置表的前缀不参与生成
strategy.setRestControllerStyle(true);//使用rest开发风格
strategy.setEntityLombokModel(true);//打开实体类Lombok模式
strategy.setVersionFieldName("version");//设置乐观锁字段名
strategy.setLogicDeleteFieldName("deleted");//设置逻辑删除字段名
autoGenerator.setStrategy(strategy);
autoGenerator.execute();
}
System.getProperty("user.dir")
可以直接定位到当前的项目名, 从模块名往下写就可以了
This message is used to verify that this feed (feedId:68985902220024832) belongs to me (userId:68596786972812288). Join me in enjoying the next generation information browser https://follow.is.