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