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

MyBatis框架学习2

程序员文章站 2022-05-24 20:21:38
...

MyBatis的基础学

  • 掌握通过Sql映射XML文件进行增删查改
  • 掌握参数的使用
  • 掌握动态sql语句
  • 掌握esultMap
  • 了解Cache的使用

MyBatis 真正的力量是在映射语句中,专注于SQL,功能强大,SQL映射的配置却是相当简单

  • SQL映射文件的几个*元素(按照定义的顺序)
  • cache 配置给定命名空间的缓存
  • cache-ref 从其他命名空间引用缓存配置
  • resultMap 用来描述数据库结果集和对象的对应关系
  • sql 可以重用的SQL块,也可以被其它语句引用
  • insert 映射插入语句
  • update 映射更新语句
  • detele 映射删除语句
  • select 映射查询语句

Select是MyBatis中最常用的元素之一

Select语句有很多属性可以详细配置每一条语句

<mapper namespace="cn.dao.UserMapper">
    <!-- id在命名空间中唯一的标识符 parameterType将会传入这条语句的参数类的完整类名或别名 resultType语句返回值类型的完整类名或别名-->
    <select id="getUser" parameterType="int" resultType="User" >
        select * from user where id=#{id}
    </select>       
</mapper>
<!-- 这个语句被称作为:getUser,使用一个int类型的参数, 并返回一个User类型的对象,其中键是列名,值是对应列的值-->
User user = session.selectOne("cn.dao,UserMapper.getUser",3);
String userName = user.getUserName();

需求说明

  • 用户表与角色表的关联关系(多对一)
  • 获取指定角色下的用户表数据列表(resultMap)
  • 完成对角色表的增、删、改操作
  • resultType:直接表示返回类型
  • resultMap:对外部的resultMap的引用(resultType与resultType不能同时存在)
  • resultMap 描述如何将结果集映射到Java对象
  • resultMap 属性(id,type)
  • resultMap 子元素(id,result,association,collection)

    <!-- 当数据库字段信息与对象的属性不一致的时候,使用resultMap来进行映射 -->
    <resultMap type="User" id="userMap">
        <!-- property表示查询出来的属性对应的值赋给实体对象的哪个属性  column 从数据库中查询的属性 -->
        <result property="userName" column="userName"/>
        <result property="id" column="id"/>
        <result property="userCode" column="userCode"/> 
        <result property="userRoleName" column="roleName"/>
    </resultMap>
    <!-- map key : 列名value:列对应的值  一个外部resultMap的id,表示返回结果映射到哪一个resultMap上-->
    <select id="getUserListByRoleId" parameterType="Role" resultMap="userMap">
        SELECT u.*,r.roleName FROM USER u,role r WHERE u.userRoleId = r.id and r.id=#{id}   
    </select>
    

select的属性说明

MyBatis框架学习2

javabean中含有对象使用association进行映射

<!-- 根据roleId获取用户列表association start-->
    <resultMap type="User" id="userMap">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode"/>     
        <result property="userName" column="userName"/>
        <result property="userRoleName" column="roleName"/>
        <!-- <association property="role" javaType="Role">
            <result property="id" column="r_id"/>
            <result property="roleCode" column="roleCode"/>
            <result property="roleName" column="roleName"/>
        </association> -->
        <association property="role" javaType="Role" resultMap="roleMap"/>          
    </resultMap>
    <!-- 将查询的值映射到role的属性中 -->
    <resultMap type="Role" id="roleMap">
            <result property="id" column="r_id"/>
            <result property="roleCode" column="roleCode"/>
            <result property="roleName" column="roleName"/>
    </resultMap>

    <select id="getUserListByRoleId" parameterType="Role" resultMap="userMap">
        SELECT u.*,r.id as r_id,r.roleCode,r.roleName FROM USER u,role r WHERE u.userRoleId = r.id and r.id=#{id}   
    </select> 
    <!-- association end -->

javabean中含有集合对象时使用collection进行映射

        <!-- 获取指定用户的地址列表collection -->
        <resultMap type="User" id="searchMap">
            <result property="id" column="id"/>
            <collection property="addressList" ofType="Address">
                <result property="id" column="a_id"/>
                <result property="postCode" column="postCode"/>
                <result property="addressContent" column="addressContent"/>
                <result property="userId" column="userId"/>
            </collection>       
        </resultMap>
        <select id="getUserListByAddressId" parameterType="User" resultMap="searchMap">
            select *,a.id as a_id from user u,address a where u.id=a.userId and u.id=#{id}
        </select>

动态SQL

  • MyBatis 最强大的特性之一就是它的动态语句功能,使用动态SQL完成多条件查询
  • 用于实现动态SQL的元素主要有

    1. if
    2. choose、 when、otherwise
    3. trim、where、set
    4. foreach
  • 通过if判断是否非空添加sql后的条件语句

    <resultMap type="User" id="userMap2">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode"/>     
        <result property="userName" column="userName"/>
        <result property="userRoleName" column="roleName"/>
    </resultMap>    
    <select id="getSearchUserList" parameterType="User"  resultMap="userMap2" >
        select u.*,r.roleName from user u,role r 
        <!-- 用户表与角色表关联 -->
        where u.userRoleId = r.id 
        <!-- 属性不为空时执行 -->
        <if test="userRoleId != null">
            and u.userRoleId=#{userRoleId}
        </if>
        <if test="userCode != null">
                <!-- 防sql注入  模糊查询-->
            and u.userCode like concat('%',#{userCode},'%')
        </if>       
        <if test="userName != null">
            and u.userName like concat('%',#{userName},'%')
        </if>
    
    </select>
    
  • 使用where和trim的控制条件

    <select id="getRoleList" resultType="Role" parameterType="Role">
        select * from role
        <!-- prefix 控制条件  prefixOverrides 第一个执行if下有and|or会自动去掉 -->
        <trim prefix="where" prefixOverrides="and | or">            
            <if test="roleCode != null">
                and roleCode like concat('%',#{roleCode},'%')
            </if>
            <if test="roleName != null">
                and roleName like concat('%',#{roleName},'%')
            </if>           
        </trim>
        <!-- where下的第一个执行的if自动去掉前缀and|or -->
        <!-- <where>                    
            <if test="roleCode != null">
                and roleCode like concat('%',#{roleCode},'%')
            </if>
            <if test="roleName != null">
                and roleName like concat('%',#{roleName},'%')
            </if>           
        </where> -->            
    </select>
    
  • 使用choose、 when、otherwise执行where控制条件

    <select id="getRoleList" resultType="Role" parameterType="Role">
        select * from role      
        <where>
            <!-- 跟switch相似 执行了when条件后剩余的不执行 -->
            <choose>
                <when test="roleCode != null">
                    and roleCode like concat('%',#{roleCode},'%')
                </when>
                <when test="roleName != null">
                    and roleName like concat('%',#{roleName},'%')
                </when>
                <!-- 当你以上条件都不成立时默认值行otherwise -->
                <otherwise>
    
                </otherwise>
            </choose>       
        </where>
    </select>
    
  • 使用set if判断条件更改字段值

     <update id="update" parameterType="User">      
        update user  
        <set>
            <if test="userCode != null and userCode =! ''">
                userCode=#{userCode},
            </if>
            <if test="userName != null">
                userName=#{userName},
            </if>
            <if test="userPassword != null">
                userPassword=#{userPassword},
            </if>
            <if test="userRoleId != null">
                userRoleId=#{userRoleId}
            </if>
        </set>
        where id=#{id} 
    
        <!-- update user
        <trim prefix="set" suffixOverrides=","> 
            <if test="userCode != null and userCode =! ''">
                userCode=#{userCode},
            </if>
            <if test="userName != null">
                userName=#{userName},
            </if>
            <if test="userPassword != null">
                userPassword=#{userPassword},
            </if>
            <if test="userRoleId != null">
                userRoleId=#{userRoleId}
            </if>
        </trim>
        where id=#{id} -->
    
        <!--update user
        set userCode=#{userCode},userName=#{userName},
        userPassword=#{userPassword},userRoleId=#{userRoleId}
        where id=#{id} -->
    </update>
    
  • foreach使用

    <resultMap type="User" id="userMapRole">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode"/>
        <result property="userName" column="userName"/>
    </resultMap>
    
    <!-- key:array mybatis 自动将array和list封装成map array和list为key  -->
    <select id="getUserByUserRoleId" resultMap="userMapRole"  >
        select * from user where userRoleId in
        <!-- 传过来的是数组 collection为 array,List的集合 collection 为list 实参传给roleIds -->
        <foreach collection="list" item="roleIds" open="(" separator="," close=")">
            #{roleIds}
        </foreach>      
    </select>
    

MyBatis缓存

一级缓存
二级缓存

二级缓存的配置

  • Mybatis的全局cache配置

    <settings><setting name="cacheEnabled" value="true"/></settings>

  • 在Mapper XML文件中设置缓存,默认情况下是没有开启缓存的

    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

  • 在Mapper XML文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置cache

    <select id="selectAll" resultType="Emp" useCache="true">

相关标签: mybatis 框架