2.Mybatis框架—SQL映射文件

心已入冬 提交于 2020-02-05 01:40:07

Mybatis框架—SQL映射文件


1.SQL映射文件的几个顶级元素配置

  • mapper:映射文件的根元素节点,只有一个namespace属性,其作用是用于区分不同的mapper;绑定DAO接口,即面向接口编程,当namespace绑定某一接口后,可以不用写该接口的实现类,mybatis会通过接口的完整限定类名查找到对应的mapper配置来执行SQL语句。因此namespace的命名必须要跟接口同名

  • cache:配置给定命名空间的缓存

  • acahe-ref:从其他命名空间引用缓存配置

  • resultMap:用来描述数据库结果集和对象的对应关系

  • sql:可重用的SQL块,也可以被其他语句引用

  • insert:映射插入语句

    <insert id="insertProvider" parameterType="com.accp.pojo.provider">
        INSERT INTO `smbms_provider` (proCode,proName,proDesc)
        VALUES (#{proCode}, #{proName},#{proDesc})
    </insert>
    
  • update:映射更新语句

    <update id="updateProvider" parameterType="com.accp.pojo.provider">
        UPDATE `smbms_provider` SET modifyDate=#{modifyDate},modifyBy=#{modifyBy} WHERE id=#{id}
    </update>
    
  • delete:映射删除语句

    <delete id="deleteById" parameterType="com.accp.pojo.provider">
        DELETE FROM `smbms_provider` WHERE id=#{id}
    </delete>
    
  • select:映射查询语句

    <select id="selectBill" resultType="com.accp.pojo.bill">
         SELECT b.*,p.*
         FROM smbms_bill b, smbms_provider p
         WHERE b.providerId=p.`id`
         AND b.providerId=#{providerId}
         AND b.`isPayment`=#{isPayment}
         AND b.productName like CONCAT ('%',#{productName},'%')
    </select>
    

2.resultType和resultMap的关联和区别

  1. resultType表示返回类型,包括是基础数据类型和复杂数据类型

  2. resultMap则是对应外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上

  3. resultType和resultMap的关联: 在mybatis进行查询映射时候,其实查询出来的每个字段值都放在一个对应的Map中,其中键名是字段名,值则是其对应的值。当select元素提供返回类型属性是resultType的时候,mybatis会将Map里面的键值对取出赋给resultType所指定对象的对应属性(既调用对象里属性的set方法进行填充)。 当我们提供的返回类型是resultMap时候,因为Map不能很好的表示领域模型,所以就需要通过进一步的定义把它转化为对应的实体对象。 resultType和resultMap本质上是一样的,都是Map数据结构,但是这两者只能二选一

  4. resultMap的自动映射级别:

    • NONE:禁止自动匹配
    • PARTIAL:(默认)自动匹配所有属性,有内部嵌套(association、collection)的除外
    • FULL:自动匹配所有
    <settings>
        <setting name="autoMappingBehavior" value="NONE"/>
    </settings>
    

3.使用@Param注解实现多参数入参

int deleteById(@Param("id") int id);
<delete id="deleteById" parameterType="com.accp.pojo.provider">
    DELETE FROM `smbms_provider` WHERE id=#{id}
</delete>

4.使用resultMap实现高级结果映射

  1. resultMap基本配置项

    1.1.resultMap属性

    • id:resultMap的唯一标识
    • type:表示该resultMap的映射结果类型(通常是java实体类)

    1.2.resultMap子节点属性

    • id:一般对应数据库中该行的主键id,设置此项可以提升mybatis性能
    • result:映射到JavaBean的某个“简单类型”属性,如基础类型、包装类
    <resultMap type="com.accp.pojo.user" id="userMap">
        <id property="id" column="id"></id>
        <result property="userCode" column="userCode"/>
        <result property="userName" column="userName"/>
        <result property="userPassword" column="userPassword"/>
    </resultMap>
    
  2. association

    2.1.association属性

    • JavaType:完整地java类名或别名,若映射到JavaBean,则mybatis通常会自动检测到其类型;若映射到一个HashMap,则应明确指定JavaType,来确保所需行为。此处为com.accp.pojo.role
    • property:映射数据库列的实体对象的属性,此处为在user里面定义的role属性

    2.2.association子节点属性

    • id
    • result
      • property:映射数据库列的实体对象的属性。此处为role属性
      • column:数据库列名或别名
     <resultMap type="com.accp.pojo.user" id="userMap">
        <id property="id" column="id"></id>
        <result property="userCode" column="userCode"/>
        <result property="userName" column="userName"/>
        <result property="userPassword" column="userPassword"/>
        <association property="role" javaType="com.accp.pojo.role">
            <id property="id" column="id"></id>
            <result property="roleCode" column="roleCode"/>
            <result property="roleName" column="roleName"/>
        </association>
    </resultMap>
    
  3. collection

    • ofType:完整的java类名或别名,即集合所包含的类型。此处为Address
    • property:映射数据库列的实体对象的属性。此处为在User里定义的属性:addressList
    private List<Address> addressList;
    
    <resultMap type="com.accp.pojo.user" id="userMap">
            <id property="id" column="id"></id>
            <result property="userCode" column="userCode"/>
            <result property="userName" column="userName"/>
            <result property="userPassword" column="userPassword"/>
            <collection property="addressList" ofType="address">
                <id property="id" column="id"></id>
                <result property="tel" column="tel"/>
                <result property="postCode" column="postCode"/>
            </collection>
        </resultMap>
    

5.mybatis缓存

  1. 一级缓存:是基于mybatis自带的HashMap本地缓存,作用范围为session域内,当session调用flish()或close()方法后,该session中的所有缓存就会被清空

  2. 二级缓存:超出session范围之外,可以被所有sqlsession共享

  3. 二级缓存配置

    (1)在mybatis-config.xml中设置

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

    (2)在mapper.xml中设置缓存

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

    (3)在mapper文件配置支持cache后,如需对个别查询进行调整,可单独设置cache

    <select id="selectBill" resultType="com.accp.pojo.bill" useCache="true">
         ......
    </select>
    
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!