Mybatis XML映射配置文件

一、XML 文档的高层级结构以下:        html

                  configuration 配置java

                      properties 属性git

                      settings 设置github

                      typeAliases 类型命名sql

                      typeHandlers 类型处理器数据库

                      objectFactory 对象工厂缓存

                      plugins 插件安全

                      environments 环境session

                      environment 环境变量mybatis

                      transactionManager 事务管理器

                      dataSource 数据源

                      映射器

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

properties 属性(PS:为何均可以配置到XML中,还要配置到properties 中呢?

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

Mybatis 加载属性顺序:

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

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

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

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

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

settings 设置:

                     

        关注: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;



二、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 接口能够保持简洁,返回值类型很安全(参数类型也很安全) 。

相关文章
相关标签/搜索