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