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

Mapper XML文件介绍

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

insert


    insert into student (student_name,student_age,student_phone,interests) values
    (#{student_name},#{student_age},#{student_phone},#{interests,javaType=[Ljava.lang.String;,jdbcType=VARCHAR})

  • 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 * from student where student_id = #{id}

update


    update student set
        student_name = #{student_name},
        student_age = #{student_age},
        student_phone = #{student_phone},
        interests = #{interests}
    where student_id = #{student_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代码段,可以包含在其他语句中。可以被静态的参数化。


    student_id,student_name,student_age,student_phone,interests,teacher_id


resultMap

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

  • 数据格式
mybatis从使用到了解(六)_mybatis的XML映射文件_第1张图片
数据格式.png
  • java映射对象
public class Teacher {
    private Integer teacherId;
    private String teacherName;
    private String teacherAge;
    private String teacherPhone;
    private List 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 getStudents() {
        return students;
    }
    public void setStudents(List students) {
        this.students = students;
    }
    @Override
    public String toString() {
        return "Teacher{" +
                "teacherId=" + teacherId +
                ", teacherName='" + teacherName + '\'' +
                ", teacherAge='" + teacherAge + '\'' +
                ", teacherPhone='" + teacherPhone + '\'' +
                ", students=" + students +
                '}';
    }
}
  • resultMap配置
 
    
    
    
    
    
        
        
        
        
        
    

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


    
    
    
    
    


    
    
    
    
    

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

  • sql多表联合查询语句

cache

mybatis包含了了一个非常强大的缓存特性,可以非常方便的配置和定制。在默认的情况下是没有开启缓存的。要开启缓存,需要在SQL映射文件中添加一行


缓存的效果如下

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

这个更高级的配置创建了一个 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映射文件)