MyBatis框架学习2

来源:互联网 发布:招行外汇分析软件 编辑:程序博客网 时间:2024/06/05 19:40

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的属性说明

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">