Mybatis是是一款优秀的持久层框架(持久化是程序数据在瞬时状态和持久状态间转换的过程。),在dao层大量使用,使sql语句封装在配置文件中,降低程序的耦合度。
一、优势:
1、不用再考虑公共问题,专心在业务实现上结构统一,易于学习、维护。
2、动态sql,小巧灵活,简单易学。
二、下面我们具体介绍元素的使用:
1、mapper:他的属性namespace与接口完全限定名保存一致。下图的UserDao.xml的mapper应为:
<mapper namespace="com.bdqn.jiankang.mapper.UserDao">
2、select:
(1)单一表查询,只需要根据实体类的字段进行即可。
1. <select id="query" resultType="User"> 2. select * from user 3. </select>
(2)多表查询,一个实体类里有其他实体类作为属性,这是我们无法通过一个实体类输出所有的字段,必须进行手动映射,使用ResultMap。ResultMap进行手动映射也解决了字段信息与对象属性不一致的情况,在复杂联合查询中自由控制映射结果。
<resultMap type="RegRum" id="reg"> <id property="patientid" column="patientid" /> <result property="patientname" column="patientname"></result> <result property="sex" column="sex" /> <result property="cardtype" column="cardtype" /> <result property="cardid" column="cardid" /> <result property="socalnum" column="socalnum" /> <result property="phone" column="phone" /> <result property="age" column="age" /> <result property="position" column="position" /> <result property="status" column="status" /> <result property="remark" column="remark" /> <result property="date" column="date" /> <association javaType="Doctor" property="doctor" resultMap="doctor"> </association> </resultMap>
assocation是连接实体类javabean属性的,javaType指定类型,property是RugRum的实体属性,resultMap是外部引用的resultMap。
<resultMap id="doctor" type="Doctor"> <id property="doctorid" column="doctorid"></id> <result property="dname" column="dname"></result> <result property="subroomname" column="subroomname"></result> </resultMap>
这是为了达到代码重用,我们也可以将该外部的代码之间写入association中。
(3)多表复杂数据联合查询如果有集合类型的数据,我们就需要用到collection了。
<resultMap type="User" id="querybyname1"> <id property="uid" column="uid" /> <result property="uname" column="uname"></result> <result property="upwd" column="upwd" /> <collection property="roles" ofType="Role"> <id property="rid" column="rid"></id> <result column="rname" property="rname"></result> <collection property="permissions" ofType="Permission"> <id property="pid" column="pid"></id> <result column="pname" property="pname"></result> </collection> </collection> </resultMap>
oftype的值是该属性的类型,id是数据库表中的唯一字段,将唯一字段值用id表示,而不是result,可以提高查询效率。
(4)有时我们需要根据条件进行查询,多条件组合查询,这时有两种方式:
where-if组合
<select id="querySelect" resultMap="reg"> select * from doctor as d left join regnum as r on r.doctorid = d.doctorid left join subjectroom as s on s.subroomid=d.subroomid <where> <if test="patientid!=null and patientid!=''"> and patientid=#{patientid} </if> <if test="dname != null and dname!=''"> and dname like '%${dname}%' </if> <if test="subjectroom != null and subjectroom!=''"> and s.subroomname like '%${subjectroom}%' </if> <if test="starttime != null and starttime!=''"> <!-- and date > #{starttime} --> and date <![CDATA[ <=]]> #{starttime} </if> <if test="endtime != null and endtime!=''"> <!-- and date < #{endtime} --> and date >= #{endtime} </if> </where> </select>
trim-if组合
<select id="querySelect2" resultMap="reg"> select * from doctor as d left join regnum as r on r.doctorid = d.doctorid left join subjectroom as s on s.subroomid=d.subroomid <trim prefix="where" prefixOverrides="and|or"> <if test="patientid!=null and patientid!=''"> and patientid=#{patientid}, </if> <if test="dname != null and dname!=''"> and dname like '%${dname}%', </if> <if test="subjectroom != null and subjectroom!=''"> and s.subroomname like '%${subjectroom}%', </if> <if test="starttime != null and starttime!=''"> <!-- and date > #{starttime} --> and date <![CDATA[ <=]]> #{starttime}, </if> <if test="endtime != null and endtime!=''"> <!-- and date < #{endtime} --> and date >= #{endtime}, </if> </trim>
在trim中,要注意prifix为where,同时注意第一个if条件为and或者or的时候,要用prefixOverrides去除。