什么是Mybatis-plus(简介)
- MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率.
- 跟之前整合MyBatis相比,你会发现我们不需要在DAO接口中编写方法和SQL语句,只需要继承 BaseMapper接口即可,整体来说简化很多。
-
mybatis-plus的特性是:1. 无侵入:只做增强不做改变,不会对现有工程产生影响 2. 强大的 CRUD 操作:内置通用 Mapper ,少量配置即可实现单表 CRUD 操作 3. 支持 Lambda :编写查询条件无需担心字段写错 4. 支持主键自动生成5. 内置分页插件········
- 关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网
关于Springboot整合Mybatis-plus 的案例
1.创建数据库mybatisplus_db
create table movie(
id INT(10) PRIMARY key auto_increment,
name varchar(32) not null,
author varchar(32) not null,
type varchar(32) not null ,
time date not null
);
insert into movie values(1,'封神','乌尔善','神话、动作','2023-7-22');
insert into movie values(2,'孤注一掷','申奥','剧情、犯罪','2023-08-08');
insert into movie values(3,'第八个嫌疑人','李子俊','悬疑、犯罪','2023-09-09);
insert into movie values(4,'学爸','苏亮','剧情、喜剧','2023-08-08');
2.pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springboot_mybatis_plus_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_mybatis_plus_demo</name>
<description>springboot_mybatis_plus_demo</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<!-- 包含spirng Mvc ,tomcat的包包含requestMapping restController 等注解-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis-plus核心库-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- druid 依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- jdbc升级版 除了基础的数据库连接功能,还额外提供了 CrudRepository-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!-- jdbc基础版 提供基础的 Spring 抽象类,包括 DataSource 等,帮助你在 Spring 框架下链接数据库。同时支持使用 JdbcTemplate 连接数据库、执行 SQL 语句。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- lombok是开源的代码生成库,通过简单注解方式可以简化java中的模版化代码,是一款非常实用的小工具-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.添加MP的相关配置信息
resources
默认生成的是
properties
配置文件,可以将其替换成
yml
文件,并在文件中配置数据库
连接的相关信息
:
application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
username: root
password: 1234
4.根据数据库表创建实体类
@Data
@TableName("movie")
public class Movie {
/**
* 序号
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 电影名称
*/
@TableField(value = "name")
private String name;
/**
* 导演
*/
@TableField(value = "author")
private String author;
/**
* 电影类型
*/
@TableField(value = "type")
private String type;
/**
* 上映时间
*/
@TableField(value = "time")
private Date time;
}
关于Lombok的了解和学习
代码写到这,我们会发现DAO接口类的编写现在变成最简单的了,里面什么都不用写。
看看模型类的编写都需要哪些内容:
- 私有属性
- setter...getter...方法
- toString方法
- 构造函数
虽然这些内容不难,同时也都是通过
IDEA
工具生成的,但是过程还是必须得走一遍,那么对于模型类 的编写有没有什么优化方法?就是的引入Lombok
Lombok的概念:
Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发。
Lombokd的使用:
- 添加lombok依赖
- 安装Lombok的插件
- 模型类上添加注解
@Data:是个组合注解,包含以下的注解的功能
- @Setter:为模型类的属性提供setter方法
- @Getter:为模型类的属性提供getter方法
- @ToString:为模型类的属性提供toString方法
- @EqualsAndHashCode:为模型类的属性提供equals和hashcode方法
@NoArgsConstructor: 提供一个无参构造函数@AllArgsConstructor: 提供一个包含所有参数的构造函数 (更多的使用就要再去查找资料了)
关于映射匹配兼容性的学习
问题1:表字段与编码属性设计不同步:
当表的列名和模型类的属性名发生不一致,就会导致数据封装不到模型对象,这是需要其中一 方做出修改,但是如果前提是两边都不能改又该如何解决?
MP
给我们提供了一个注解
@TableField
,
使用该注解可以实现模型类属性名和表的列名之间的映射关系
问题2:编码中添加了数据库中未定义的属性
当模型类中多了一个数据库表不存在的字段,就会导致生成的
sql
语句中在
select
的时候查询了数据
库不存在的字段,程序运行就会报错,错误信息为
:
Unknown column '
多出来的字段名称
' in 'field list'
使用@TableField
注解,它有一个属性叫
exist
,设置该字段是否在数据库表
中存在,如果设置为
false
则不存在,生成
sql
语句查询的时候,就不会再查询该字段了。
问题3:采用默认查询开放了更多的字段查看权限
查询表中所有的列的数据,就可能把一些敏感数据查询到返回给前端,这个时候我们就需要限制哪些 字段默认不要进行查询。
解决方案是@TableField注解的一个属性叫
select
,该属性设置默认是否需要查询该字段的值,true(
默认值
)
表示默认查询该字段,
false
表示默认不查询该字段
问题4:表名与编码开发设计不同步
该问题主要是表的名称和模型类的名称不一致,导致查询失败,这个时候通常会报如下错误信息
Table 'databaseName.tableNaem' doesn't exist
,
翻译过来就是数据库中的表不存在。
解决方案是使用
MP
提供的另外一个注解
@TableName
来设置表与模型类之间的对应关系。
id生成策略控制的学习
- 设置生成策略为AUTO (常用):AUTO的作用是使用数据库ID自增,在使用该策略的时候一定要确保对应的数据库表设置了ID主键自增,否则无效
- NONE: 不设置id生成策略
- INPUT:用户手工输入id
- ASSIGN_ID:雪花算法生成id(可兼容数值型与字符串型)
- ASSIGN_UUID:以UUID生成算法作为id生成策略
5.编写Mybatis_plus_config
@Configuration
public class Mybatis_Plus_Config {
/**
* mybatis-plus SQL执行效率插件
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
6.SpringBoot启动类
@SpringBootApplication
@MapperScan(basePackages = "com/example/springboot_mybatis_plus_demo/dao")
public class SpringbootMybatisPlusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisPlusDemoApplication.class, args);
}
}
7.dao层
@Mapper
public interface MovieDao extends BaseMapper<Movie> {
}
8.service层
public interface MovieDaoService extends IService<Movie> {
}
9.service实现类层
@Service
public class MovieDaoServiceImpl extends ServiceImpl<MovieDao, Movie> implements MovieDaoService {
}
10.controller控制层
@RestController
@RequestMapping("/movie")
public class MovieController {
@Autowired
private MovieDaoService movieDaoService;
/**
* 根据id获取用户信息
* default T getById(Serializable id) {
* return this.getBaseMapper().selectById(id);
* }
* @RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
* @param id
* @return
*/
@RequestMapping("/getInfo")
public Movie getInfo(@RequestParam Integer id){
Movie movie = movieDaoService.getById(id);
return movie;
}
/**
* 获取全部信息
* default List<T> list() {
* return this.list(Wrappers.emptyWrapper());
* }
* @return
*/
@RequestMapping("/getList")
public List<Movie> getList(){
List<Movie> movieList=movieDaoService.list();
return movieList;
}
/**
* 分页查询全部数据
* default IPage<T> page(IPage<T> page) {
* return this.page(page, Wrappers.emptyWrapper());
* }
* @return
*/
@RequestMapping("/getInfoListPage")
public IPage<Movie> getInfoListPage(){
//需要在Config配置类中配置分页插件
IPage<Movie> page = new Page<>();
page.setCurrent(5); //当前页
page.setSize(1); //每页条数
page = movieDaoService.page(page);
return page;
}
/**
* 根据指定字段查询信息集合
*Collection<T> listByMap(Map<String, Object> columnMap);
* @return
*/
@RequestMapping("/getListMap")
public Collection<Movie> getListMap(){
Map<String,Object> map = new HashMap<>();
//kay是字段名 value是字段值
map.put("author","乌尔善");
Collection<Movie> userInfoEntityList = movieDaoService.listByMap(map);
return userInfoEntityList;
}
/**
* 新增一个电影信息
* boolean save(T entity);
*/
@RequestMapping("/saveInfo")
public void saveInfo(){
Movie movie = new Movie();
movie.setId(5);
movie.setName("敢死队4");
movie.setAuthor("斯沃特·沃");
movie.setType("动作、冒险");
movie.setTime(new Date(System.currentTimeMillis()));
movieDaoService.save( movie);
}
/**
* 批量添加电影信息
* default boolean saveBatch(Collection<T> entityList) {
* return this.saveBatch(entityList, 1000);
* }
*/
@RequestMapping("/saveInfoList")
public void saveInfoList(){
//创建对象
Movie yk = new Movie();
yk.setId(6);
yk.setName("假面骑士");
yk.setAuthor("骑士导演");
yk.setType("奇幻、冒险");
yk.setTime(new Date(System.currentTimeMillis()));
Movie ty= new Movie();
ty.setId(7);
ty.setName("奥特曼");
ty.setAuthor("圆古");
ty.setType("外星、战斗");
ty.setTime(new Date(System.currentTimeMillis()));
//批量保存
List<Movie> list =new ArrayList<>();
list.add(yk);
list.add(ty);
movieDaoService.saveBatch(list);
}
/**
* 更新用户信息
* boolean updateById(T entity);
*/
@RequestMapping("/updateInfo")
public void updateInfo(){
//根据实体中的ID去更新,其他字段如果值为null则不会更新该字段,参考yml配置文件
Movie movie = new Movie();
movie.setId(12);
movie.setName("活佛济公");
movie.setAuthor("大师");
movie.setType("喜剧,搞笑");
movie.setTime(new Date(System.currentTimeMillis()));
movieDaoService.updateById(movie);
}
/**
* 根据ID删除电影信息
* boolean removeById(Serializable id);
*/
@RequestMapping("/deleteInfo")
public void deleteInfo(Integer Id){
movieDaoService.removeById(Id);
}
/**
* 根据指定字段删除电影信息
* boolean removeByMap(Map<String, Object> columnMap);
*/
@RequestMapping("/deleteInfoMap")
public void deleteInfoMap(){
//kay是字段名 value是字段值
Map<String,Object> map = new HashMap<>();
map.put("name","学爸");
map.put("type","剧情、喜剧");
movieDaoService.removeByMap(map);
}
}
11.结果展示
1.根据id获取电影信息
2.获取全部信息
3.根据指定字段查询信息集合
4.分页查询全部数据
5. 新增一个电影信息
6.批量添加电影信息
7. 更新电影信息
8.删除一条电影信息
结语:
今天就到这,关于分页查询和条件查询构建,了解Mybatis-plus的代码生成器就在下一个补充吧