美文网首页互联网开发手记SpringFrameworkJava学习笔记
mybatis从使用到了解(六)_mybatis的XML映射文件

mybatis从使用到了解(六)_mybatis的XML映射文件

作者: YONGSSU的技术站点 | 来源:发表于2017-01-05 10:05 被阅读356次

    Mapper XML文件介绍

    Mybatis的强大只处在于它提供的强大的映射语句,和具有相同功能的JDBC代码对比,能大大减少重复代码。

    insert

    <insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyColumn="id">
        insert into student (student_name,student_age,student_phone,interests) values
        (#{student_name},#{student_age},#{student_phone},#{interests,javaType=[Ljava.lang.String;,jdbcType=VARCHAR})
    </insert>
    
    • keyProperty
      selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    • keyColumn
      匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    • resultType
      结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
    • order
      这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。
    • statementType
      与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。

    delete

    <delete id="deleteById" parameterType="int">
       delete * from student where student_id = #{id}
    </delete>
    

    update

    <update id = "updateById">
        update student set
            student_name = #{student_name},
            student_age = #{student_age},
            student_phone = #{student_phone},
            interests = #{interests}
        where student_id = #{student_id}
    </update>
    

    select

    <select id="selectStudentById" parameterType="int" resultType="Student">
        <![CDATA[
            select * from student where student_id = #{id}
        ]]>
    </select>
    
    • id
      命名空间中的唯一标识符,可被用来代表这条语句。
    • parameterType
      将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
    • flushCache
      将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句)。
    • timeout
      这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。
    • statementType
      STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
    • useGeneratedKeys
      (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
    • keyProperty
      (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    • keyColumn
      (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    • databaseId
      如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。

    sql

    这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中。可以被静态的参数化。

    <sql id = "studentSql">
        student_id,student_name,student_age,student_phone,interests,teacher_id
    </sql>
    <select id="findById" parameterType="int" resultMap="studentResult">
        select
        <include refid="studentSql"/>
        from student where student_id = #{id}
    </select>
    

    resultMap

    结果映射集,将数据表列数据映射成java对象,下面将提供一个两表级联查询的例子作为参考。

    • 数据格式
    数据格式.png
    • java映射对象
    public class Teacher {
        private Integer teacherId;
        private String teacherName;
        private String teacherAge;
        private String teacherPhone;
        private List<Student> students;
        public Integer getTeacherId() {
            return teacherId;
        }
        public void setTeacherId(Integer teacherId) {
            this.teacherId = teacherId;
        }
        public String getTeacherName() {
            return teacherName;
        }
        public void setTeacherName(String teacherName) {
            this.teacherName = teacherName;
        }
        public String getTeacherAge() {
            return teacherAge;
        }
        public void setTeacherAge(String teacherAge) {
            this.teacherAge = teacherAge;
        }
        public String getTeacherPhone() {
            return teacherPhone;
        }
        public void setTeacherPhone(String teacherPhone) {
            this.teacherPhone = teacherPhone;
        }
        public List<Student> getStudents() {
            return students;
        }
        public void setStudents(List<Student> students) {
            this.students = students;
        }
        @Override
        public String toString() {
            return "Teacher{" +
                    "teacherId=" + teacherId +
                    ", teacherName='" + teacherName + '\'' +
                    ", teacherAge='" + teacherAge + '\'' +
                    ", teacherPhone='" + teacherPhone + '\'' +
                    ", students=" + students +
                    '}';
        }
    }
    
    • resultMap配置
     <resultMap id="teacherResult" type="com.yongssu.mybatis.demo1.Teacher">
        <id column="teacher_id" property="teacherId"/>
        <result column="teacher_name" property="teacherName"/>
        <result column="teacher_age" property="teacherAge"/>
        <result column="teacher_phone" property="teacherPhone"/>
        <association property="students" javaType="com.yongssu.mybatis.demo1.Student">
            <id column="student_id" property="studentId"/>
            <result column="student_name" property="studentName"/>
            <result column="student_age" property="studentAge"/>
            <result column="student_phone" property="studentPhone"/>
            <result column="interests" property="interests" javaType="[Ljava.lang.String;"/>
        </association>
    </resultMap>
    

    用association表示teacher和学生是1对1的关系,在Teacher中的Student只有一个学生,应该声明为Student student。

    <resultMap id="studentResult" type="Student">
        <id column="student_id" property="studentId"/>
        <result column="student_name" property="studentName"/>
        <result column="student_age" property="studentAge"/>
        <result column="student_phone" property="studentPhone"/>
        <result column="interests" property="interests" javaType="[Ljava.lang.String;"/>
    </resultMap>
    <resultMap id="teacherResult" type="com.yongssu.mybatis.demo1.Teacher">
        <id column="teacher_id" property="teacherId"/>
        <result column="teacher_name" property="teacherName"/>
        <result column="teacher_age" property="teacherAge"/>
        <result column="teacher_phone" property="teacherPhone"/>
        <collection property="students" ofType="Student" resultMap="studentResult"/>
    </resultMap>
    

    用collection表示老师和学生是1对N的关系,在Teacher类中学生是一个列表。

    • sql多表联合查询语句
    <select id="selectTeacher" parameterType="int" resultMap="teacherResult">
        select * from teacher
        left join student on student.teacher_id = teacher.teacher_id
        where teacher.teacher_id = #{id}
    </select>
    

    cache

    mybatis包含了了一个非常强大的缓存特性,可以非常方便的配置和定制。在默认的情况下是没有开启缓存的。要开启缓存,需要在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"/>
    

    这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。

    • 可用的收回策略有:
      • LRU – 最近最少使用的:移除最长时间不被使用的对象。
      • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
      • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
      • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
      • 默认的是 LRU。
    • flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒 形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
    • size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。
    • readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓 存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。
      更详细的内容请参考文档:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

    相关文章

      网友评论

        本文标题:mybatis从使用到了解(六)_mybatis的XML映射文件

        本文链接:https://www.haomeiwen.com/subject/oezavttx.html