• mybatis Mapper XML 映射文件


    传送门:mybatis官方文档 Mapper XML 文件详解

    一. 数据查询语句

    1. select

    <select
      id="selectPerson"
      parameterType="int"  这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
      parameterMap="deprecated"
      resultType="hashmap"
      resultMap="personResultMap"
      flushCache="false"  将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。
      useCache="true"  将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true。
      timeout="10000"
      fetchSize="256"
      statementType="PREPARED"  STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
      resultSetType="FORWARD_ONLY">
    • resultType="hashmap"时,返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值;
    • resultType="java bean"时,返回对象所有的属性值;
    • resultMap="resultMap.id"时,根据resultMap的配置返回对象的指定属性值;

    二. 数据变更语句

    <insert
      id="insertAuthor"
      parameterType="domain.blog.Author"  这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
      flushCache="true"            将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true
      statementType="PREPARED"
      keyProperty=""
      keyColumn=""
      useGeneratedKeys=""
      timeout="20">
    
    <update
      id="updateAuthor"
      parameterType="domain.blog.Author"
      flushCache="true"
      statementType="PREPARED"
      timeout="20">
    
    <delete
      id="deleteAuthor"
      parameterType="domain.blog.Author"
      flushCache="true"
      statementType="PREPARED"
      timeout="20">

    1. 自动生成主键字段(创建表时设置主键自动增长)

      useGeneratedKeys:数据库内部生成主键

      keyProperty:主键字段

    <insert id="insertAuthor" useGeneratedKeys="true"
        keyProperty="id">
      insert into Author (username,password,email,bio)
      values (#{username},#{password},#{email},#{bio})
    </insert>

    2. 手动生成主键

      keyProperty:主键字段

      order:设置主键和执行语句的先后顺序,before 表示先设置主键,再执行语句

      resultType:返回的主键类型

      selectKey中的语句只是为主键字段赋值,必须在插入语句中显示设置主键

        <insert id="setPrimaryKey" parameterType="user">
            <selectKey keyProperty="id" order="BEFORE" resultType="int">
                select max(id)+1 as id from user2
            </selectKey>
            insert into user2 (id,name,age) values (#{id},#{name},#{age})
        </insert>

    3. foreach

    <foreach
      collection="" 传入的参数类型
      index=""    每次迭代到的位置
      item=""     表示集合中每一个元素进行迭代时的别名
      separator=""  每次进行迭代之间以什么符号作为分隔 符
      open=""    表示以什么开始
      close="">    表示以什么结束
    
    </foreach>

    在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

      1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
      2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
      3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map

      如果 你的传入参数 就是list或者array, colletion="list" 或者 collection="array"就可以了;

      如果是 传入的一个 对象或者 map, 其中有个属性是 list 或者array,colletion=“属性名”。

    List 示例: 

      Java中定义的查询方法

    List<DeviceFileRefVO> selectByFileIds(List<Long> fileIds);

       mapperXML中定义的查询语句

      <!--通过文件ID集合查询记录-->
      <select id="selectByFileIds"   resultMap="BaseResultMap">
        SELECT <include refid="fields"/>
        FROM t_device_file_ref
        WHERE file_id in
        <foreach collection="list" item="item" open="(" close=")" separator=",">
          #{item,jdbcType=BIGINT}
        </foreach>
      </select>

    三. 可重用的SQL

      用来定义可重用的 SQL 代码段,可以包含在其他语句中。它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化. 

        <sql id="usersql">
            insert into user (name,age) values (#{name},#{age})
        </sql>
    
        <insert id="addsql" parameterType="user">
            <include refid="usersql">
                <property name="user" value="user"></property>
            </include>
        </insert>

     四. Result Maps

      ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。

    class user{
        private int id;
        private String name;
        private Card card;
        private List<Authors> authors;
    }
        <resultMap type="user" id="userResultMap">
            <id property="id" column="id"/>        主键字段的映射
            <result property="name" column="name"/>      普通字段的映射
            <association property="card" column="card"/>   对象类型的映射
            <collection property="authors" column="authors"/> 集合类型的映射
        </resultMap>

      这里描述的只是常用的一些属性,更加详细的描述请参考官方文档。

    五. 缓存

      默认情况下是没有开启缓存的,除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:

    <cache/>

      字面上看就是这样。这个简单语句的效果如下:

    • 映射语句文件中的所有 select 语句将会被缓存。
    • 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
    • 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
    • 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
    • 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
    • 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
    <cache
      eviction="FIFO"      回收策略
      flushInterval="60000"   刷新间隔
      size="512"          引用数目
      readOnly="true"/>    只读属性

      可用的收回策略有:

    • LRU – 最近最少使用的:移除最长时间不被使用的对象。 默认值LRU
    • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
    • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
    • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
  • 相关阅读:
    面向对象深入:继承01——子类
    面向对象的基础知识——小结
    IP地址配置
    二、RPM包管理-rpm命令管理
    一、软件包管理简介
    关机重启命令
    网络命令
    权限管理命令
    字符截取命令
    shell-正则表达式(二)
  • 原文地址:https://www.cnblogs.com/virgosnail/p/10035673.html
Copyright © 2020-2023  润新知