Mybatis ---小白了解这几个核心功能,基本能满足开发中9.9成的需求,通俗讲解Mybatis

Mybatis —小白了解这几个核心功能,基本能满足开发中9.9成的需求,通俗讲解Mybatis

---------作为一家小软件公司的实习生,在参与了几个月的商业项目开发之后总结出来的心得。(这些商业项目的特点:企业内部使用,使用者少,无并发负载等要求,只部署一台服务器)

-----在这里我介绍的是Mybatis-Plus,属于Mybatis的增强版,详情请到官方手册去看官方手册点这里

  1. 第一个介绍的是代码生成器:“想想看,你的数据库有一张叫做Student的表,然后你需要围绕这个表展开你的故事,建立一个Student的模块,对它进行增删改查,怎么整才能做到代码写得少,可维护性高?”
    直接用JDBC连接上去然后写sql语句对其增删改查?不行,这可不是在学校的课程设计那种图书管理项目了,你在公司里面,得参与多人协作了,得符合规范了,你得符合MVC架构,得分层,得把一个模块分成controller,service,dao等等几层。如此脱裤子放屁的活,Mybatis-Plus的代码生成器可以帮我们直接完成。
    手册中的代码生成器点这里 完了以后,一键帮我们生成围绕Student的controller,service,dao等等几层,包括entity层,而且里面Student表的字段也会在entity一一出现。

  2. 第二个介绍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接口

  3. 条件构造器:前面的crud接口确实提供了对数据库的单表进行增删改查的操作,但是我们如果要有条件进行CRUD怎么办?我们要Select XXX from XXX where XXX = XXX的时候,或者我们要insert XXX where XXX between XXX ,这种带条件的操作就要用到条件构造器了。看官方文档给出的:
    在sql语法中的很多关键字,函数,条件都有
    请点击手册的条件构造器观看具体实现
    使用条件构造器有多种方法,包括继承Wrapper或者使用entity的builder()方法。
    完成条件构造以后丢到CRUD接口 里面就行了,依旧不用写一句sql语句,美滋滋

  4. 有了 CRUD接口条件构造器仍不足以完成所有对于单表的操作,因为有时查询结果很多,我们需要分页,这时就要用到分页插件

点击手册的分页插件观察实现
其他人的博客说明怎样实现分页查询

  1. 遇到多表关联的,就要乖乖自己到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最常用的部分了,也可以应对商业项目的开发了,当然了这只是我的小小见解,这个博客也只是面对小白,希望对大家有所帮助

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值