Mybatis基础---常用SQL映射标签、多参数设置、resultMap(自定义映射)
程序员文章站
2022-04-03 08:04:13
...
一、if 元素
如果什么 …..那么什么…….. ——->通常用于判断参数,进行sql语句的动态拼接
1、 传入的参数是一个 实体对象 :
<select id="selectUserLike" resultType="entity.User" parameterType="entity.User">
select * from user where 1=1
<!-- parameterType指传入的参数类型 这里传入的是一个实体类 -->
<!-- if判断时需要保证你 test="loginName!=null and loginName!=''" 中判断的条件一定是实体类的属性-->
<!-- 即loginName 是 实体entity.User 中的一个属性 -->
<if test="loginName!=null and loginName!=''">
and loginName =#{loginName}
</if>
<if test="userId!=null">
<!--1.处理特殊字符 CDATA节中的内容不会做特殊处理 -->
<!--2.处理特殊字符(<是< 号的意思) and userid<#{userId} -->
<![CDATA[and userid<#{userId}]]>
</if>
</select>
2、 传入的参数是一个或多个 参数(参数注解 @param) :
<!-- 根据id 查询一个用户 -->
<select id="selectUserById" resultType="entity.User">
select * from user where 1=1
<if test="id!=null">
and userid=#{id}
</if>
</select>
转换成使用接口的方式——->接口( UserMapper.xml 对应的接口 ) 中的方法为
/**
*根据用户id 查询用户
*/
public User selectUserById(@param("id") int userId);
//映射的sql 语句中并未表明入参类型 且 判断的变量是 id , 此时接口中的变量使用的是 userId(语义化更强)
//为了避免出现异常情况 此时应当使用注解 (@param("id"))---->注解的变量名和sql映射中判断的变量名要相同
//注解相当于 为接口中的参数设置了一个key 这个key和对应sql映射中的if 判断的变量(id)相同
//当然多个参数也可使用 注解(@param(" ")) 的方式
3、 多参数 —–>Map(集合) :
<!-- 入参是map集合 模糊查询名字 和 id在一定范围的 用户 -->
<!-- parameterType="map"表示入参是map集合 那么 if 元素判断的条件就是map的key -->
<select id="getByIds2" resultType="entity.User" parameterType="map">
select * from user
<where>
<!-- name表示 传入的map集合中 如果有key为name的键值对的话 进行判断 然后进行字符串拼接 -->
<!-- #{name}------取map集合中 key为name 的值 -->
<if test="name!=null and name!=''">
loginName like concat('%',#{name},'%')
</if>
<!-- 表示传入的map参数中 key为list 对应的值是一个list集合 -->
<if test="list!=null and list.size()>0">
and userid
<!-- 对集合进行遍历 -->
<!-- foreach元素的属性 collection="list"表示遍历的是集合
item="tempId" 表示 遍历到的元素
open="(" 表示对遍历结果进行拼接 开头是 "("
close=")" 结尾是 ")"
separator="," 每个元素之间是 ","
<foreach collection="list" item="tempId" open="(" close=")"
separator=",">
#{tempId}
</foreach>
</if>
</where>
</select>
需要注意的地方——->如果你想传入什么参数 : 那么你map 中的key 一定要和 if 判断的名称一样
并且key 对应的参数也是需要注意的地方
二、choose,when, otherwise 元素
有时候我们不想应用所有的条件,而是想从多个选项中选择一个。与java 中的多重选择语句相似,MyBatis 提供了一个choose 元素 这时when起判断的作用, 如果成立进行sql语句拼接不成立进行下一个选项判断
//与java 中的多重选择语句相似
if(...){
...
}else if(...){
...
}else if(...){
...
}else{
...
}
<select id="findActiveBlogLike" parameterType="entity.user" resultType="entity.user">
SELECT * FROM user WHERE 1 = 1
<choose>
<when test="loginName != null">
AND loginName = #{loginName}
</when>
<when test="pwd != null">
AND pwd = #{pwd}
</when>
<otherwise>
AND userid = 1
</otherwise>
</choose>
</select>
一次只能选择一个条件, 即—->如果第一个when满足条件,那么就会结束判断进行sql语句拼接,如果第一个条件不满足, 继续进行后面的判断直到满足为止,如果都不满足,则会进行”<otherwise>”的内容
三、Foreach 元素
动态SQL 经常使用到的功能是集合迭代,通常用在IN 条件句。
<!-- 参数类型是list 储存了用户的id集合 -->
<select id="getByIds" resultType="entity.User" parameterType="list">
select * from user
<where>
<!-- 对集合进行判断 如果不为空 并且 集合中元素数量>0的话 进行遍历和sql语句拼接 -->
<if test="list!=null and list.size()>0">
userid in
<!--foreach 的collection属性 表示遍历的集合类型 item="id"为遍历到的元素-->
<!--open="(" separator="," close=")" 表示在开头和元素之间以及结尾添加的字符串-->
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</where>
</select>
select、Insert、update、delete 元素
对应数据库的 差、增、改、删 操作
四、resultMap 元素
代表返回的结果类型是自定义映射
1、resultMap : 自定义映射对象属性中的—->实体类型的属性
上图是这次要映射的实体类
<!-- UserMapper.xml 文件的sql语句和resultMap映射 -->
<!-- resultMap 的type属性表示你要映射的是哪一个实体类***** 写完全限定名或别名 -->
<!-- resultMap 的id 属性表示当前的 resultMap 在Mapper.xml文件中的代号(唯一)-->
<resultMap type="entity.User" id="temp1">
<!-- property表示映射的是"entity.User"实体类的id属性 -->
<!-- column表示查询语句的结果======>uid列 进行对实体类id属性的映射 -->
<id property="id" column="uid" />
<result property="name" column="uname" />
<!-- association 通常用于映射对象属性中 属性类型为另一个实体类型的 属性 即上图的role属性(角色类型Role) -->
<!-- javaType属性表示 association 得到的对象的类型(必须) (这里是实体类: 角色类) -->
<association property="role" javaType="entity.Role">
<!-- association 标签内的 id或result标签的property属性映射的就是javaType指向的实体类的属性 -->
<result property="name" column="rname" />
</association>
</resultMap>
<!-- 根据用户id 查询角色信息 自定义映射属性-->
<!-- 使用association 映射用户属性中的 role信息(role属性是一个对象) -->
<select id="getUserAuth" resultMap="temp1" parameterType="entity.User">
SELECT u.id uid,u.name uname,r.name rname FROM `user` u,role r WHERE u.rid=r.id AND u.id=#{id}
</select>
2、resultMap : 自定义映射对象属性中的—->集合类型的属性
<!-- 根据区县id 查询该区县下的所有街道信息 -->
<!-- District对象有一个集合类型的属性 "private List<Street> list" -->
<!-- 此时需要 使用collection标签 进行集合映射 -->
<resultMap type="entity.District" id="map1">
<id property="id" column="did" />
<result property="name" column="dname" />
<!-- property="list"表示映射"District"类型的list属性 -->
<!-- ofType="entity.Street" 表示集合中的数据类型 -->
<collection property="list" ofType="entity.Street">
<id property="id" column="sid"/>
<result property="name" column="sname" />
</collection>
</resultMap>
<select id="getStreetsByid" resultMap="map1" parameterType="entity.District">
SELECT d.`id` did,d.`name` dname,s.`id` sid,s.`name` sname FROM
district d,street s WHERE d.`id`=s.`did` AND d.`id`=#{id}
</select>
关于resultMap标签中子标签 association和collection 的总结
1): association在resultMap标签中通常用于映射 JavaBean的某个"复杂类型"属性,即JavaBean内部嵌套一个复杂数据类型(另一个JavaBean)属性,需要注意的地方是---->association仅处理一对一的关联关系
---------注意---->association用 javaType属性 映射结果类型
2):collection在resultMap标签中通常用于映射 JavaBean的某个复杂属性,这个属性是一个集合列表,
---------注意---->collection用 ofType属性 映射集合中每一个元素的数据类型
上一篇: hibernate 映射