MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
先创建一个spring项目,创建时记得勾选sql的驱动
之后我们导入mybatis plus的坐标
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.4.3version>
dependency>
之后我们来到配置文件中,写入我们的datasource
我这里用的yml文件进行配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm
username: root
password: 123456
之后创建一个我们的一个pojo的实体类,记得给出相应的getter和setter方法
public class Book {
private Long id;
private String type;
private String name;
private String description;
}
之后我们写一下我们的dao层文件
@Mapper
public interface BookDao extends BaseMapper<Book> {
}
这里一下我们不需要去写什么CURD,mp已经通过basemapper帮我们写好了
到这里原先要我们花费大量时间去写的数据层就写完了,是不是很方便,感觉啥也没写就结束了
只需要在日志中配置以下这段话就可以了
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
Book book = bookDao.selectById(2);
List<Book> books = bookDao.selectList(null);
Book book=new Book();
book.setName("123");
book.setType("123");
book.setDescription("123");
bookDao.insert(book);
bookDao.deleteById(2);
Book book=new Book();
book.setName("123");
book.setType("123");
book.setDescription("123");
bookDao.updateById(book);
先让BookService继承IService
public interface BookService extends IService<Book> {
}
之后对于BookServiceImpl我们在实现service接口的基础上,我们还要继承一下ServiceImpl,这样在Impl中就不需要将所有的方法都重写出来
@Service
public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements BookService {
}
这样之后我们简单的测试一下service中的方法
@Test
public void selectTest(){
System.out.println(bookService.getById(4));
}
要注意的是,为了避免命名的重复,mp在service对于的方法的取名有着较大的差别
@TableName("tbl_book")
public class Book {
private Long id;
private String type;
private String name;
private String description;
}
描述:表名注解,标识实体类对应的表
使用位置:实体类
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
}
描述:主键注解
使用位置:实体类主键字段
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 主键字段名 |
type | Enum | 否 | IdType.NONE | 指定主键类型 |
mp默认使用雪花算法去计算主键id的值,但是我们也可以将type的值设置成IdType.AUTO,来实现id自增
@TableId(value = "id",type = IdType.AUTO)
@TableName("sys_user")
public class User {
@TableId
private Long id;
@TableField("nickname")
private String name;
private Integer age;
private String email;
}
其的value属性,用于指定属性名和字段名的匹配
用于逻辑删除
首先我们先创建一个querywapper对象
QueryWrapper<Book> queryWrapper=new QueryWrapper<>();
之后我们看一下quertwapper提供的方法
queryWrapper.like("name","spring")
queryWrapper.between("id",1,5);
当然还有许多的方法,就不在这里一一列举了
当然我们的querywapper还支持链式编程
queryWrapper.like("name","spring")
.between("id",1,5);
将name为空的修改
UpdateWrapper<Book> updateWrapper=new UpdateWrapper<>();
updateWrapper.isNull("name");
updateWrapper.set("name","114514").set("type","1919810").set("description","123");
bookDao.update(null,updateWrapper);
对于你的字段类型做出了约束,可以有效的防止写错
LambdaQueryWrapper<Book> lambdaQueryWrapper=new LambdaQueryWrapper<>();
String name="spring";
String type=null;
lambdaQueryWrapper.like(StringUtils.isNotBlank(name),Book::getName,name)
.like(StringUtils.isNotBlank(type),Book::getType,type);
List<Book> books = bookDao.selectList(lambdaQueryWrapper);
books.forEach(System.out::println);
和上面的Lambdaquerywapper类似
首先我们先添加一个分页插件
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
创建一个page对象,传入当前的页码以及每页分有几条数据
IPage<Book> iPage=new Page(1,5);
bookDao.selectPage(iPage,null);
首先我们要给我们的表添加一个版本字段,用于记录版本号
之后再实体类中给版本号属性添加一个@version注解就可以了
最后给我们的拦截器添加一个乐观锁的插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());