Mybatis —小白了解这几个核心功能,基本能满足开发中9.9成的需求,通俗讲解Mybatis
---------作为一家小软件公司的实习生,在参与了几个月的商业项目开发之后总结出来的心得。(这些商业项目的特点:企业内部使用,使用者少,无并发负载等要求,只部署一台服务器)
-----在这里我介绍的是Mybatis-Plus,属于Mybatis的增强版,详情请到官方手册去看官方手册点这里
-
第一个介绍的是代码生成器:“想想看,你的数据库有一张叫做Student的表,然后你需要围绕这个表展开你的故事,建立一个Student的模块,对它进行增删改查,怎么整才能做到代码写得少,可维护性高?”
直接用JDBC连接上去然后写sql语句对其增删改查?不行,这可不是在学校的课程设计那种图书管理项目了,你在公司里面,得参与多人协作了,得符合规范了,你得符合MVC架构,得分层,得把一个模块分成controller,service,dao等等几层。如此脱裤子放屁的活,Mybatis-Plus的代码生成器可以帮我们直接完成。
手册中的代码生成器点这里 完了以后,一键帮我们生成围绕Student的controller,service,dao等等几层,包括entity层,而且里面Student表的字段也会在entity一一出现。 -
第二个介绍CRUD接口。在我的视野里,会用CRUD接口和下面第三点我说的条件构造器,基本可以解决九成单表操作的CRUD了。(看清楚!是单表操作的CRUD,多表关联的不是。)
我了解的CRUD接口就是:不用你写一句sql语句,你要什么增删改查,直接像调用自带方法一样拿来即用就行,我们来看看Mybatis-Plus给我们准备了什么接口:
这些CRUD接口,怎么去用呢?假设我们刚才以一个Student表为基础用代码生成器生成了controller,service,dao(Mapper)层,那么CRUD接口可以在service层使用,也可以在dao(Mapper)层使用。
比如你在其他层调用dao(Mapper)层时,直接就dao.XXX就行,XXX就是CRUD接口。比如我直接使用这个:studentDao.deleteById(studentId);
首先这个studentDao是实例化的一个dao(Mapper)层,但是我没在studentDao中定义过这个deleteById()方法,我也可以拿来即用,因为这个deleteById()方法是Mybatis-Plus给我们自动生成的CRUD接口。请到官方手册中看crud接口 -
条件构造器:前面的crud接口确实提供了对数据库的单表进行增删改查的操作,但是我们如果要有条件进行CRUD怎么办?我们要Select XXX from XXX where XXX = XXX的时候,或者我们要insert XXX where XXX between XXX ,这种带条件的操作就要用到条件构造器了。看官方文档给出的:
请点击手册的条件构造器观看具体实现
使用条件构造器有多种方法,包括继承Wrapper或者使用entity的builder()方法。
完成条件构造以后丢到CRUD接口 里面就行了,依旧不用写一句sql语句,美滋滋 -
有了 CRUD接口 和条件构造器仍不足以完成所有对于单表的操作,因为有时查询结果很多,我们需要分页,这时就要用到分页插件。
点击手册的分页插件观察实现
其他人的博客说明怎样实现分页查询
- 遇到多表关联的,就要乖乖自己到xml文件中去写sql了,下面用我实习中的一个实例给大家说明:
@Data
public class OrderStatisticsVo {
//工程师名字
private String nickname;
//未响应数量
private Integer noResponse;
//进行中数量
private Integer processing;
//已完成数量
private Integer done;
//作废数量
private Integer invalid;
//满意度(小数形式)
private Double satisfaction;
//满意度(概率)
@TableField(exist = false)
private String satisfactProportion;
}
看上面这个OrderStatisticsVo类,它是一个实体类,作用就是用来接收查询出来的结果的,@Data注解作用是为了不用写setXXX()和getXXX()方法,@TableField(exist = false)代表这个satisfactProportion可以为空,可以不接收结果。
public List<OrderStatisticsVo> orderStatistics(TbOrderQuery query) {
Page<OrderStatisticsVo> page = new Page<>(query.getPage(), query.getLimit());
List<OrderStatisticsVo> queryOrderPageList = tbOrderDao.orderStatistics(page, query);
return queryOrderPageList;
}
上面这个orderStatistics方法是我写在controller层的方法,用一个List 列表来接收查询出来的结果,那这东西是怎么查询出来的呢,就是tbOrderDao.orderStatistics(page, query);这个写在Mapper层的方法查询出来的。那么我们的Dao层又应该写什么呢?全写接口就行,看下面代码:
@Mapper
public interface TbOrderDao extends BaseMapper<TbOrderEntity> {
List<OrderPageListVo> queryOrderPageList(Page page, TbOrderQuery query);
int queryOrderPageListCount(TbOrderQuery query);
List<responseTimeStatisticsVo> responseTimeStatistics(Page<responseTimeStatisticsVo> page, TbOrderQuery query);
List<OrderStatisticsVo> orderStatistics(Page<OrderStatisticsVo> page, TbOrderQuery query);
}
上面就是我的Dao(mapper),是不是看到刚才我在controller调用的orderStatistics方法,这个方法的具体实现写在XML文件就行,下面我们看XML
<select id="orderStatistics" resultType="com.qunzhi.office.modules.cms.vo.OrderStatisticsVo">
SELECT
nickname,
satisfied / ( satisfied + dissatisfied ) AS satisfaction,
no_response,
processing,
done,
invalid
FROM
(
SELECT
participant_id,
count( IF ( order_status = 0, TRUE, NULL ) ) AS no_response,
count( IF ( order_status = 2, TRUE, NULL ) ) AS processing,
count( IF ( order_status = 3, TRUE, NULL ) ) AS done,
count( IF ( order_status = 4, TRUE, NULL ) ) AS invalid,
count( IF ( ( customer_satisfied = 0 OR customer_satisfied = 1 ), TRUE, NULL ) ) AS satisfied,
count( IF ( customer_satisfied = 2, TRUE, NULL ) ) AS dissatisfied
FROM
(
SELECT
id AS order_id,
assign_id AS participant_id,
customer_satisfied,
order_status,
create_time,
company_id
FROM
tb_order
UNION ALL
SELECT
a.order_id,
a.participant_id,
b.customer_satisfied,
b.order_status ,
b.create_time,
b.company_id
FROM
( SELECT order_id, user_id AS participant_id FROM tb_order_assistant ) AS a
LEFT JOIN tb_order AS b ON a.order_id = b.id
) c
WHERE
create_time BETWEEN #{query.startTime} AND #{query.endTime}
<if test="query.companyId != null">
AND company_id = #{query.companyId}
</if>
GROUP BY
participant_id
) AS d
INNER JOIN tb_user ON d.participant_id = tb_user.id
</select>
看这个
<select id="orderStatistics"resultType=“com.qunzhi.office.modules.cms.vo.OrderStatisticsVo”>,
id=”XXX“,里面写的就是Dao(mapper)层接口的方法名,
resultType="XXX”,里面写的就是用来接收返回结果的实体类,
就是我刚才写的那个OrderStatisticsVo,这里要写全路径。
接着,我们就可以在标签下面写sql语句。
至于标签是用来构建动态sql语句的。
总结就是多表关联时,**要写一个接收结果的实体类,一个只写查询方法接口的Dao(mapper)类,一个写该接口具体实现和sql语句的XML,**然后就可以直接调用那个查询方法了。
我认为会用我上面说到的这几个功能后,算是掌握mybatis最常用的部分了,也可以应对商业项目的开发了,当然了这只是我的小小见解,这个博客也只是面对小白,希望对大家有所帮助