javaType="String"jdbcType="VARCHAR">
objectFactory对象工厂:
MyBatis每次创建结果对象新的实例时,它使用一个ObjectFactory实例来完成。
如果想自定义ObjectFactory,只需要继承DefaultObjectFactory,然后在Configuration.xml配置如下信息即可:
Plugins插件:
MyBatis允许你在某一点拦截已映射语句执行的调用。
@Intercepts({@Signature(type=Executor.class,method="update",
args={MappedStatement.class,Object.class})})
publicclassMyPluginsimplementsInterceptor{
......
}
MyPlugins插件将会拦截在Executor实例中所有的“update”方法调用,它也是负责低层次映射语句执行的内部对象。
谨慎使用!
environments环境:
可以配置多种环境,但你只能为每个SqlSessionFactory实例选择一个。
同时一个数据库只能够对应一个SqlSessionFactory实例。
我们可以通过如下的程序语句确定调用哪个SqlSessionFactory实例,即确定调用哪个数据库:
Stringenv="myDevelopment";
SqlSessionFactoryfactory=
newSqlSessionFactoryBuilder().build(reader,env,props);
变量env的值就是所需要的环境的配置的ID,如果.build(......)这个方法中没有参数env,那么会默认加载与default相匹配的那个环境的配置。
这种情况下默认环境一定要与其中一个环境ID想匹配,否则会抛出异常。
......
......
Environment的层级结构如IDE工具提示所示:
Element:
environment
ContentModel:
(transactionManager,dataSource)
transactionManager
在MyBatis中有两种事务管理器类型,也就是type=”[JDBC|MANAGED]”:
dataSource
详见MyBatis3UserGuideSimplifiedChinese.pdf官方文档。
mappers映射器:
其作用是告诉mybatis去哪里找映射文件。
所有的细节和Mybatis真正强大之处就在映射文件里。
XML映射文件
映射文件的层级结构IDE工具提示所示:
Element:
mapper
ContentModel:
(cache-ref|cache|resultMap*|
parameterMap*|sql*|insert*|update*|delete*|select*)+
SQL映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
1 cache-配置给定命名空间的缓存。
2 cache-ref–从其他命名空间引用缓存配置。
3 resultMap–最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来
加载你的对象。
4 parameterMap–deprecated已经被废弃了!
老式风格的参数映射。
内联参数
是首选,这个元素可能在将来被移除。
这里不会记录。
5 sql–可以重用的SQL块,也可以被其他语句引用。
6 insert–映射插入语句
7 update–映射更新语句
8 delete–映射删除语句
9 select–映射查询语句
Select、insert、update、delete:
四个元素的共同属性和特定属性及其描述信息表:
属性
描述
id
在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType
将会传入这条语句的参数类的完全限定名或别名。
parameterMap
Deprecated。
这是引用外部parameterMap的方法。
使用内联参数映射和parameterType属性。
flushCache
将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。
默认值:
false。
useCache
将其设置为true,将会导致本条语句的结果被缓存。
默认值:
true。
timeout
这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。
默认不设置(驱动自行处理)。
statementType
STATEMENT,PREPARED或CALLABLE的一种。
这会让MyBatis使用选择使用Statement,PreparedStatement或CallableStatement默认值:
PREPARED。
fetchSize
这是暗示驱动程序每次批量返回的结果行数。
默认不设置(驱动自行处理)。
(SELECT特有)
resultSetType
FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。
默认是不设置(驱动自行处理)。
(SELECT特有)
resultType
从这条语句中返回的期望类型的类的完全限定名或别名。
注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。
使用resultType或resultMap,但不能同时使用。
(SELECT特有)
resultMap
命名引用外部的resultMap。
返回map是MyBatis最具力量的特性,对其有一个很好的理解的话,许多复杂映射的情形就能被解决了。
使用resultMap或resultType,但不能同时使用。
(SELECT特有)
useGeneratedKeys
这会告诉MyBatis使用JDBC的getGeneratedKeys方法来取出由数据(比如:
像MySQL和SQLServer这样的数据库管理系统的自动递增字段)内部生成的主键。
默认值:
false。
(INSERT特有)
keyProperty
标记一个属性,MyBatis会通过getGeneratedKeys或者通过insert语句的selectKey子元素设置它的值。
默认:
不设置。
(INSERT特有)
特别警告:
在使用select元素时,如果想查询某一个表中的所有记录,例如查询所有Person时,
需要将Person类实现Serializable,否则会平抛出异常。
同时还需要注意的是select元
素的属性resultType的值应该是Person类型,而不是list或者arraylist类型。
sql:
这个元素可以被用来定义可重用的SQL代码段,可以包含在其他SQL语句中。
比如:
id,sex,age,username,password;那么select语句就可以这样简写:
selectfromperson;
SQL语句中的参数:
Ø参数可以指定一个确定的数据类型:
#{id,javaType=int,jdbcType=NUMERIC}。
Ø自定义类型处理器,你可以指定一个确定的类型处理器类(或别名),比如:
#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}。
Ø确定数值范围:
#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}。
ØSQL语句中插入一个不可变的字符串,比如:
ORDERBY${columnName}。
但是这种做法不安全。
这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
resultMap
resultMap元素是MyBatis中最重要最强大的元素。
主要用法形式:
id="selectPersonById"resultMap="PersonType">
select*frompersonwhereid=#{id}
高级结果映射(重点):
高级结果映射属性总览:
●constructor–类在实例化时,用来注入结果到构造方法中。
⏹idArg–ID参数;标记结果作为ID可以帮助提高整体效能;
⏹arg–注入到构造方法的一个普通结果;
●id–一个ID结果;标记结果作为ID可以帮助提高整体效能;
●result–注入到字段或JavaBean属性的普通结果;
●association–一个复杂的类型关联;许多结果将包成这种类型;
⏹嵌入结果映射–结果映射自身的关联,或者参考一个;
●collection–复杂类型的集;
⏹嵌入结果映射–结果映射自身的集,或者参考一个;
●discriminator–使用结果值来决定使用哪个结果映射;
⏹case–基于某些值的结果映射;
v嵌入结果映射–这种情形结果也映射它本身,因此可以包含很多相同的元素,或
者它可以参照一个外部的结果映射。
详解各个结果映射属性:
id,result:
两者都是结果映射最基本内容。
id和result都映射一个单独列的值到简单数据类型(字符串,整型,双精度浮点数,日期等)的单独属性或字段。
唯一不同是id表示的结果将是当比较对象实例时用到的标识属性,它们都有一些属性:
属性
描述
property
映射到列结果的字段或属性,如果匹配的是存在的,和给定名称相同的JavaBean的属性,那么就会使用。
可以这样映射一些东西:
“username”,或者映射到一些复杂的东西:
“address.street.number”。
column
来自数据库的列名,或其重命名。
这和通常传递给
resultSet.getString(columnName)方法的字符串是相同的。
javaType
一个Java类的完全限定名,或其别名。
jdbcType
如果你直接使用JDBC编程,你需要指定这个类型-但仅仅对可能为空的值。
typeHandler
默认的类型处理器。
使用这个属性,你可以覆盖默认的类型处理器。
constructor:
其用法如下:
这种方式与如下的构造方法方式注入是对应的:
publicBlog(intblog_id,Stringblog_name){
this.blog_id=blog_id;
this.blog_name=blog_name;
}
association:
关联表示的是“有一个”的关系,如下的用法是指Blog中有一个Post,实现方式有两种:
关连查询的两种方式:
1 嵌套结果(使用嵌套结果映射来处理重复的联合结果的子集):
ofType="author"resultMap="author_infos"/>
ofType="post"resultMap="post_infos"/>
......
......
非常重要:
在嵌套结果映射中id元素扮演了非常重要的角色。
应该通常指定一个或多个属性,它们可以用来唯一标识结果。
实际上就是如果你离开她了,但是有一个严重的性能问题时MyBatis仍然可以工作。
选择的属性越少越好,它们可以唯一地标识结果。
主键
就是一个显而易见的选择(尽管是联合主键)。
2 嵌套查询(通过执行另外一个SQL映射语句来返回预期的复杂类型):
column="blog_author_id"select="selectAuthorById"/>
association元素拥有的属性:
其中property、column、javaType、jdbcType、typeHandler的意义和id、sele