mybatis常用技巧(mapper文件)

2 mapper文件篇

本篇总结一下编写mapper文件常用的技巧。

2.1 基本select

基本结构如下:
<select id="" parameterType="" resultType="">
</select>
parameterType就是查询参数类型
resultType就是查询结果的类型
这些类型都是完整的类名,如

<select id="listPlanInstanceStatus" parameterType="int" resultType="com.navinfo.imp.task.bean.TskPlanInstanceStatusCountBean">
		SELECT
		count(*) AS count ,STATUS AS status,STATUS_NAME AS statusName
		FROM
		TSK_INSTANCE
		WHERE
		PLAN_ID = #{planId, jdbcType=INTEGER}
		GROUP BY
		PLAN_ID,STATUS;
</select>

Mapper.xml的文件名要和对应的Mapper.java名一致。

id字段就是Mapper.java中方法的名字。例如上面例子中,对应的java接口中的方法名为

public List<TskPlanInstanceStatusCountBean> listPlanInstanceStatus(Integer id);

2.2 查询参数为java bean

如果查询条件为java bean,那么可以使用@Param注解声明将要在mapper.xml文件中使用的参数对象的名字。

public List<TskPlan> getPlanByFilter(@Param("bean")TskPlanFilterBean bean);
在mapper.xml中,可以直接用bean.name, bean.id等引用参数对象中的字段的值。

<select id="getPlanByFilter" parameterType="com.navinfo.imp.task.framework.bean.search.TskPlanFilterBean" resultType="com.navinfo.imp.task.bean.TskPlan">
	select 
		p.ID AS id,
		p.NAME AS name,
		p.PLAN_TYPE AS planType,
		p.PLAN_TYPE_NAME AS planTypeName,
		p.EST_START_TIME AS estStartTime,
		p.EST_END_TIME AS estEndTime,
		p.START_TIME AS startTime,
		p.END_TIME AS endTime,
		p.EST_WORKLOAD AS estWorkload,
		p.WORKLOAD AS workLoad,
		p.WORKLOAD_UNIT AS workloadUnit,
		p.CREATE_USER_ID AS createUserId,
		p.CREATE_USER_NAME AS createUserName,
		p.CREATE_TIME AS createTime,
		p.UPDATE_TIME AS updateTime,
		p.STATUS AS status,
		p.STATUS_NAME AS statusName,
		p.REMARK AS remark,
		p.PID AS pid
	from TSK_PLAN p left join TSK_TASK tt on tt.PLAN_ID = p.ID left join TSK_TASK_ASSIGN tta on tta.TASK_ID = tt.ID
	<where>
		<if test="bean.planStatus != null and bean.planStatus != ''">
			AND p.STATUS = '${bean.planStatus}'
		</if>
		<if test="bean.taskStatus != null and bean.taskStatus != ''">
			AND tt.STATUS LIKE '%${bean.taskStatus}%'
		</if>
		<if test="bean.taskType != null and bean.taskType != ''">
			AND tt.TASK_TYPE LIKE '%${bean.taskType}%'
		</if>
		<if test="bean.assigneeId != null">
			AND tta.ASSIGNEE_ID = ${bean.assigneeId}
		</if>
	</where>
	ORDER BY p.ID,p.START_TIME ASC
	</select>
在<where>元素中,bean被视为一个对象,可以用bean.xxx获取其中的字段的值。

2.3 字符串模糊查询

回到刚才的例子中,字符串的模糊查询通常用like语句。在mapper.xml中,我们用'%${bean.taskType}%'来构造一个模糊查询的条件。
另一种写法就是
concat('%',concat(#{projectName}, '%'))
使用了concat函数构造了一个模糊查询条件,但是第一个方法会更简洁。

2.4 返回结果

返回结果通常有两种方式,一种是用resultType,另一种是用resultMap.

2.4.1 resultType

mybatis首先从数据库中查询出多条记录,将记录转换为resultMap对象,然后检查resultType所对应的类型,将resultMap对象映射为resultType所指类型的对象。

2.4.2 resultMap

resultMap和resultType的最大区别是,resultMap是要引用当前mapper.xml文件内部的一个<resultMap>的id,这个id就是resultMap的名字,唯一表示这个resultMap。resultType是一个java类的名字。
因为resultMap允许用户定义和配置,所以这赋予了resultMap更强大的灵活性。
 1、resultMap属性:type为java实体类;id为此resultMap的标识
 2、resultMap的子元素:
        id – 一般对应到数据库中该行的ID,设置此项可以提高Mybatis性能.
        result – 映射到JavaBean 的某个“简单类型”属性,String,int等.
        association – 映射到JavaBean 的某个“复杂类型”属性,其他JavaBean类.
        collection –复杂类型集合

下面介绍一下resultMap在不同应用场景下的使用方法。
2.4.2.1 简单查询
<resultMap id="gridtaskResultMap" type="com.navinfo.imp.cms.bean.GridtaskReport">
		<result column="code" jdbcType="VARCHAR" property="code" />
		<result column="meshId" jdbcType="VARCHAR" property="meshId" />
		<result column="TaskType" jdbcType="INTEGER" property="taskType" />
		<result column="TaskID" jdbcType="INTEGER" property="taskid" />
		<result column="TaskName" jdbcType="VARCHAR" property="taskName" />
		<result column="DataVersion" jdbcType="VARCHAR" property="dataVersion" />
		<result column="WorkLoad" jdbcType="DOUBLE" property="workLoad" />
		<result column="Starttime" jdbcType="VARCHAR" property="starTime" />
		<result column="EndTime" jdbcType="VARCHAR" property="endTime" />
	</resultMap>
而对应的类型定义为
public class GridtaskReport {
	private String code;
	private String meshId;
	private String taskTypeName;
	private int taskType;
	private double workLoad;
	@DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" )
	private Date startTime;
	@DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" )
	private Date endTime;
	private String dataVersion;
	private int taskid;
	private String taskName;
}

个人认为在这种情况下,resultMap纯属多余,用resultType就够了。
2.4.2.2 联合查询
使用association属性,用来关联复杂类型字段。
2.4.2.3 集合查询
使用collection属性,用来关联复杂类型的集合字段。如List<User>属性。
参考文献https://www.cnblogs.com/xuerong/p/5000233.html


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值