Mybatis XML映射配置文件

1、XML 文档的高层级结构如下:        

                  configuration 配置

                      properties 属性

                      settings 设置

                      typeAliases 类型命名

                      typeHandlers 类型处理器

                      objectFactory 对象工厂

                      plugins 插件

                      environments 环境

                      environment 环境变量

                      transactionManager 事务管理器

                      dataSource 数据源

                      映射器

这里配置时一定要注意顺序配置。

properties 属性(PS:为什么都可以配置到XML中,还要配置到properties 中呢?

        外部化的, 可替代的属性, 这些属性也可以配置在典型的 Java 属性配置文件中,或者通过 properties 元素的子元素来传递。

Mybatis 加载属性顺序:

        如果在这些地方,属性多于一个的话,MyBatis 按照如下的顺序加载它们:

              在 properties 元素体内指定的属性首先被读取。

              从类路径下资源或 properties 元素的 url 属性中加载的属性第二被读取,它会 覆盖已经存在的完全一样的属性。

              作为方法参数传递的属性最后被读取, 它也会覆盖任一已经存在的完全一样的属性,这些属性可能是从 properties 元素体内和资源/url 属性中加载的。

            例子:SqlSessionFactory factory =sqlSessionFactoryBuilder.build(reader, environment, props);

settings 设置:

                     Mybatis XML映射配置文件_第1张图片

        关注:cacheEnabled 、lazyLoadingEnabled  、useGeneratedKeys、defaultExecutorType、defaultStatementTimeout


typeAliases属性:

        类型别名是为 Java 类型命名一个短的名字。 它只和 XML 配置有关, 只用来减少类完全

        限定名的多余部分。例如:

                <typeAliases>

                <typeAlias alias="Author" type="domain.blog.Author"/>

                <typeAlias alias="Blog" type="domain.blog.Blog"/>

                <typeAlias alias="Comment" type="domain.blog.Comment"/>

                <typeAlias alias="Post" type="domain.blog.Post"/>

                <typeAlias alias="Section" type="domain.blog.Section"/>

                <typeAlias alias="Tag" type="domain.blog.Tag"/>

                </typeAliases>

        使用这个配置, “Blog”可以任意用来替代“domain.blog.Blog”所使用的地方。对于普通的 Java 类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载的名字,要注意原生类型的特殊处理。                  

类型别名必须遵循MyBatis命名规范。

        具体参见:http://mybatis.github.io/mybatis-3/zh/configuration.html#typeAliases


typeHandlers:

        无论是 MyBatis 在预处理语句中设置一个参数, 还是从结果集中取出一个值时, 类型处理器被用来将获取的值以合适的方式转换成 Java 类型。下面这个表格描述了默认的类型处理器。

                        类型处理器                                      Java  类型                                  JDBC  类型

                        BooleanTypeHandler                     Boolean,boolean                    任何兼容的布尔值

                        ByteTypeHandler                           Byte,byte                                  任何兼容的数字或字节类型

                        ShortTypeHandler                          Short,short                              任何兼容的数字或短整型

                        IntegerTypeHandler                       Integer,int                               任何兼容的数字和整型

                        LongTypeHandler                          Long,long                                任何兼容的数字或长整型

                        FloatTypeHandler                          Float,float                                 任何兼容的数字或单精度浮点型

                        DoubleTypeHandler                      Double,double                          任何兼容的数字或双精度浮点型

                        BigDecimalTypeHandler                BigDecimal                                  任何兼容的数字或十进制小数类型

                        StringTypeHandler                         String                                          CHAR 和 VARCHAR 类型

                        ClobTypeHandler                           String                                          CLOB和 LONGVARCHAR 类型

                        NStringTypeHandler                      String                                          NVARCHAR 和 NCHAR 类型

                        NClobTypeHandler                        String                                          NCLOB类型

                        ByteArrayTypeHandler                  byte[]                                          任何兼容的字节流类型

                        BlobTypeHandler                          byte[]                                           BLOB和 LONGVARBINARY 类型

                        DateTypeHandler                          Date(java.util)                          TIMESTAMP 类型

                        DateOnlyTypeHandler                  Date(java.util)                          DA TE 类型

                        TimeOnlyTypeHandler                  Date(java.util)                          TIME 类型

                        SqlTimestampTypeHandler          Timestamp(java.sql)                  TIMESTAMP 类型

                        SqlDateTypeHandler                     Date(java.sql)                           DA TE 类型

                        SqlTimeTypeHandler                     Time(java.sql)                          TIME 类型

                        ObjectTypeHandler                       Any                                               其他或未指定类型

                        EnumTypeHandler                       Enumeration 类型                           VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引) 。


             你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。简单实现 TypeHandler 接口(org.mybatis.type) ,然后映射新的类型处理器类到Java 类型,还有可选的一个 JDBC 类型。

BoundSql 中有属性:

private List<ParameterMapping> parameterMappings;

ParameterMapping中属性:

 private TypeHandler<?> typeHandler;



2、SQL  映射的 XML  文件:


SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序) :

                  cache - 配置给定命名空间的缓存。

                  cache-ref – 从其他命名空间引用缓存配置。

                  resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。

                  parameterMap – 已经被废弃了!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除。这里不会记录。

                  sql – 可以重用的 SQL 块,也可以被其他语句引用。

                  insert – 映射插入语句

                  update – 映射更新语句

                  delete – 映射删除语句

                  select – 映射查询语句


Select :

        查询语句是使用 MyBatis 时最常用的元素之一。 直到你从数据库取出数据时才会发现将数据存在数据库中是多么的有价值, 所以许多应用程序查询要比更改数据多的多。 对于每次插入,更新或删除,那也会有很多的查询。这是 MyBatis 的一个基本原则,也是将重心和努力放到查询和结果映射的原因。对简单类别的查询元素是非常简单的。比如:

        <select id=”selectPerson” parameterType=”int” resultType=”hashmap”>

        SELECT * FROM PERSON WHERE ID = #{id}

        </select>

    这个语句被称作 selectPerson, 使用一个 int (或 Integer) 类型的参数, 并返回一个 HashMap类型的对象,其中的键是列名,值是列对应的值。注意参数注释:

                #{id}

    这就告诉 MyBatis 创建一个预处理语句参数。 使用 JDBC, 这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:

                    // Similar JDBC code, NOT MyBatis…

                    String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;

                    PreparedStatement ps = conn.prepareStatement(selectPerson);

                    ps.setInt(1,id);

        当然, 这需要很多单独的 JDBC 的代码来提取结果并将它们映射到对象实例中, 这就是MyBatis 节省你时间的地方。我们需要深入了解参数和结果映射。那些细节部分我们下面来了解。

        select 元素有很多属性允许你配置,来决定每条语句的作用细节。

                <select

                id=”selectPerson”

                parameterType=”int”

                parameterMap=”deprecated”

                resultType=”hashmap”

                resultMap=”personResultMap”

                flushCache=”false”

                useCache=”true”

                timeout=”10000”

                fetchSize=”256”

                statementType=”PREPARED”

                resultSetType=”FORWARD_ONLY”

                >

insert ,update ,delete:

数据变更语句 insert,update 和 delete 在它们的实现中非常相似:

首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server) ,那么你可以设置 useGeneratedKeys=”true”,而且设置 keyProperty 到你已经做好的目标属性上。

        例如,如果上面的 Author 表已经对 id 使用了自动生成的列类型,那么语句可以修改为:

        <insert id="insertAuthor" parameterType="domain.blog.Author" useGeneratedKeys=”true” keyProperty=”id”>

                insert into Author (username,password,email,bio)

                values (#{username},#{password},#{email},#{bio})

        </insert>

不支持自动生成主键的数据库怎么办?mybatis用了最傻的办法,生成随机ID

            <insert id="insertAuthor" parameterType="domain.blog.Author">

                    <selectKey keyProperty="id" resultType="int" order="BEFORE">

                        select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1

                    </selectKey>

                            insert into Author

                        (id, username, password, email,bio, favourite_section)

                        values

                        (#{id}, #{username}, #{password}, #{email}, #{bio},

                        #{favouriteSection,jdbcType=VARCHAR}

                        )

            </insert>

   

sql

        这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。比如:

        <sql id=”userColumns”> id,username,password </sql>    

探究 已映射的 SQL  语句

      这里你也许想知道通过 SqlSession 和 Mapper 对象到底执行了什么操作。已映射的 SQL语句是一个很大的主题, 而且这个主题会贯穿本文档的大部分内容。 为了给出一个宏观的概念,这里有一些示例。上面提到的任何一个示例,语句是通过 XML 或注解定义的。我们先来看看 XML。使用基于 XML 的映射语言,在过去的几年中使得 MyBatis 非常流行,他为 MyBatis 提供所有的特性设置。如果你以前用过 MyBatis,这个概念应该很熟悉了,但是 XML 映射文件也有很多的改进,后面我们会详细来说。这里给出一个基于 XML 映射语句的示例,这些语句应

该可以满足上述示例中 SqlSession 对象的调用。

        <?xml version="1.0" encoding="UTF-8" ?>

        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

        <mapper namespace="org.mybatis.example.BlogMapper">

            <select id="selectBlog" parameterType="int" resultType="Blog">

            select * from Blog where id = #{id}

            </select>

        </mapper>

      这个简单的例子中看起来有很多额外的东西, 但是也相当简洁了。 你可以在一个单独的XML 映射文件中定义很多的映射语句,除 XML 头部和文档类型声明之外,你可以得到很多 方 便 之 处 。 在 文 件 的 剩 余 部 分 是 很 好 的 自 我 解 释 。 在 命 名 空 间“com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这样它允许你使用完全限定名 “org.mybatis.example.BlogMapper.selectBlog” 来调用映射语句,我们下面示例中所有的写法也是这样的。

        Blog blog = (Blog) session.selectOne(

        "org.mybatis.example.BlogMapper.selectBlog", 101);

    要注意这个使用完全限定名调用 Java 对象的方法是相似的,这样做是有原因的。这个命名可以直接给相同命名空间下的的映射类, 使用一个名称, 参数和返回值和已映射的查询语句都一样的方法即可。 这就允许你非常容易地调用映射器接口中的方法, 这和你前面看到的是一样的,下面这个示例中它又出现了。

        BlogMapper mapper = session.getMapper(BlogMapper.class);

        Blog blog = mapper.selectBlog(101);

    第二种方式有很多有点,首先它不是基于文字的,那就更安全了。第二,如果你的 IDE有代码补全功能,那么你可以利用它来操纵已映射的 SQL 语句。第三,不需要强制类型转换,同时 BlogMapper 接口可以保持简洁,返回值类型很安全(参数类型也很安全) 。


你可能感兴趣的:(Mybatis XML映射配置文件)