欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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.处理特殊字符(&lt是< 号的意思) and userid&lt;#{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 : 自定义映射对象属性中的—->实体类型的属性

Mybatis基础---常用SQL映射标签、多参数设置、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 : 自定义映射对象属性中的—->集合类型的属性

Mybatis基础---常用SQL映射标签、多参数设置、resultMap(自定义映射)


Mybatis基础---常用SQL映射标签、多参数设置、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属性 映射集合中每一个元素的数据类型
相关标签: sql映射