spring boot系列——结合mybatis-plus 学习小结
mybatis-plus基于mybatis。MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和普通的Java对象映射成数据库中的记录。相对于mybatis,mybatis-plus有许多特性是比较好用的,比如分页查询、表字段自动转换为实体类属性等。
一、mybatis-plus
1.添加pom引用
maven的引用很简单,官方已经给出starter,不需要我们考虑它的依赖关系。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3</version>
</dependency>
2.配置
官方已经提供了基于springboot的配置,将其拷贝过来放在application.yml中即可使用。其中column-underline: true特别好用,会自动将下划线格式的表字段,转换为以驼峰格式命名的属性。
mybatis-plus: global-config: db-config: id-type: auto field-strategy: not_empty #驼峰下划线转换 column-underline: true #逻辑删除配置 logic-delete-value: 0 logic-not-delete-value: 1 db-type: mysql refresh: false configuration: map-underscore-to-camel-case: true cache-enabled: false
3.使用
1.创建实体类,创建实体类与JPA特别相似,其中@TableName注解是为了指定此实体类对应数据库的哪一张表;@TableId指定的是主键,type属性指定的是该主键自增的方式,AUTO代表自增,UUID代表使用UUID增加主键;还有一个注解@TableFiled,此注解主要用在非主键实体属性上,下面是官方给出的此注解所有属性。
值 | 描述 |
---|---|
value | 字段值(驼峰命名方式,该值可无) |
update | 预处理 set 字段自定义注入 |
condition | 预处理 WHERE 实体条件自定义运算规则 |
el | 详看注释说明 |
exist | 是否为数据库表字段( 默认 true 存在,false 不存在 ) |
strategy | 字段验证 ( 默认 非 null 判断,查看 com.baomidou.mybatisplus.enums.FieldStrategy ) |
fill | 字段填充标记 ( FieldFill, 配合自动填充使用 ) |
生成一个实体类实例
@TableName("t_patrol_task") public class PatrolTaskEntity { @TableId(value = "id",type = IdType.AUTO) private Integer id; private Integer jobId; Getter… Setter…. }
2.创建mapper,与JPA有相像之处。使用@Mapper为了把mapper这个DAO交給Spring管理,且可以不再写mapper映射文件;继承BaseMapper可以方便使用mybatis-plus方法,泛型需要写对用的实体类。此处直接使用slelect * from,mybatis-plus会根据实体类自动驼峰转下划线映射到表的字段中。
@Mapper public interface PatrolTaskMapper extends BaseMapper<PatrolTaskEntity> { @Select("select * from t_patrol_task where id = #{id} and deleted_at is null") PatrolTaskEntity queryByIdAndDeletedAtIsNull(@Param(“id”) Integer id); }
4.条件构造器
1.查询单条数据,非主键查询,只要在一个实体内写入属性,然后再用mybatis-plus自带的selectOne()方法即可查询(注意:查询的限制条件必须此条数据是唯一的,不然查询后会报错)。
PatrolJobLogEntity jobLogEntity = new PatrolJobLogEntity(); jobLogEntity.setJobId(12); jobLogEntity.setTaskFinished(30); patrolJobLogMapper.selectOne(jobLogEntity);
2.查询数量,含有拼接方式查询。使用mybatis-plus条件查询需要使用到EntityWrapper构造器,它能添加查询的条件,如:.eq("job_id",13)表示查询job_id=13的记录,isNull("deleted_at")表示deleted_at必须为null。
EntityWrapper<PatrolTaskEntity> wrapper = new EntityWrapper<>().eq("job_id",13).isNull("deleted_at"); List<PatrolTaskEntity> tasks = patrolTaskMapper.selectCount(wrapper);
注意:此处查询的条件是使用的是数据库表中的字段名称
3.查询列表,与上面基本相同,只不过此处使用的是mybatis-plus的selectList()方法。
EntityWrapper<PatrolTaskEntity> wrapper = new EntityWrapper<>().eq("job_id",13).isNull("deleted_at"); List<PatrolTaskEntity> tasks = patrolTaskMapper.selectList(wrapper);
拼接sql查询方式:
查询方式 |
说明 |
setSqlSelect |
设置 SELECT 查询字段 |
where |
WHERE 语句,拼接 + WHERE 条件 |
and |
AND 语句,拼接 + AND 字段=值 |
andNew |
AND 语句,拼接 + AND (字段=值) |
or |
OR 语句,拼接 + OR 字段=值 |
orNew |
OR 语句,拼接 + OR (字段=值) |
eq |
等于= |
allEq |
基于 map 内容等于= |
ne |
不等于<> |
gt |
大于> |
ge |
大于等于>= |
lt |
小于< |
le |
小于等于<= |
like |
模糊查询 LIKE |
notLike |
模糊查询 NOT LIKE |
in |
IN 查询 |
notIn |
NOT IN 查询 |
isNull |
NULL 值查询 |
isNotNull |
IS NOT NULL |
groupBy |
分组 GROUP BY |
having |
HAVING 关键词 |
orderBy |
排序 ORDER BY |
orderAsc |
ASC 排序 ORDER BY |
orderDesc |
DESC 排序 ORDER BY |
exists |
EXISTS 条件语句 |
notExists |
NOT EXISTS 条件语句 |
between |
BETWEEN 条件语句 |
notBetween |
NOT BETWEEN 条件语句 |
addFilter |
自由拼接 SQL |
last |
拼接在最后,例如:last("LIMIT 1") |
5.分页
1.添加配置文件,此处配置文件表示开启mybatis-plus分页功能
@EnableTransactionManagement @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
2.写查询语句,此出的Pagination必须给出,不然无法完成分页功能。
@Mapper public interface BannerLogMapper extends BaseMapper<BannerLogEntity> { @Select("select * from t_pub_banner_logs") List<BannerLogEntity> queryLogByPage(Pagination page); }
3.进行分页查询代码块,只需要将要查询的第几页也页面大小写入到Page对象中,然后进行查询。
Page<BannerLogEntity> page = new Page<>(pageNo,pageSize); List<BannerLogEntity> bannerLogs = bannerLogMapper.queryLogByPage(page); page.getTotal(); page.getCurrent(); page.getPages();
查询后分页属性(当前页,总页数、总条数), 是经过插件自动回写到传入page对象中。
二、Spring Boot:简单三层架构Web应用
一个最简单的Spring Boot Web
应用分为三层:
Controller
层:负责具体业务流程的控制,调用Service
层来控制业务逻辑Service
层:业务逻辑层,真正执行业务的操作,比如获取用户信息等Dao
层:负责数据持久化,在这一层中与各种数据库,比如MySQL
、Oracle
等打交道
2.1 Controller
层
Controller
层也是入口层,一般涉及如下注解:
@Controller
:@Controller
是经典的Controller
层注解,@Controller
标识的类代表该类是控制器类@RequestMapping
:使用@RequestMapping
可以对请求进行映射,可以注解在类上或者方法上,在类上的话表示该类所有的方法都是以该地址作为父地址,在方法上就表示可以映射对应的请求到该方法上@GetMapping/@PostMapping
:这两者实际上是@RequestMapping
对应不同方法的简化版,因为@RequestMapping
有一个method
属性,如果该method
指定为GET
那么就相当于@GetMapping
,如果指定为POST
就相当于@PostMapping
@ResponseBody
:作用在方法上,将返回的数据进行可能的转换(取决于请求头,转换为JSON
或XML
等等,默认的情况下比如单纯字符串就直接返回),比如返回语句为return "success";
,如果加上了@ResponseBody
就直接返回success
,如果不加上就会跳转到success.jsp
页面@RequestParm
:处理Contrent-Type
为application/x-www-form-urlencoded
的内容,可以接受简单属性类型或者对象,支持GET
+POST
@RequestBody
:处理Content-Type
不为application/x-www-form-urlencoded
的内容(也就是需要指定Content-Type
),不支持GET
,只支持POST
@PathVariable
:可以将占位符的参数传入方法参数,比如/path/1
,可以将1
传入方法参数中@PathParm
:与@RequestParm
一样,一般使用@RequestParm
@RestController
:相当于@Controller
+@ResponseBody
2.2 Service
层
Service
层用于执行主要的业务逻辑,主要就是下面这个注解:
@Serice
:是一个增强型的@Component
,@Component
表示一个最普通的组件,可以被注入到Spring
容器进行管理,而@Service
是专门用于处理业务逻辑的注解,@Controller
类似,也是一个增强型的@Component
,专门用于Controller
层的处理
2.3 Dao
层
Dao
是数据持久层,这里进行数据持久化的操作,一般加上@Repository
即可:
@Repository
:也是一个增强型的@Component
,注解在持久层中,具有将具体数据库抛出的异常转为Spring
持久层异常的功能