MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
安装
- 直接导入jar包: 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
- 使用Maven:需将下面的 dependency 代码置于 pom.xml 文件中:
1
2
3
4
5
|
<dependency>
<groupId>
org.mybatis
</groupId>
<artifactId>
mybatis
</artifactId>
<version>
x.x.x
</version>
</dependency>
|
构建 SqlSessionFactory
基于 MyBatis 的应用都是以 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
1、从 XML 中构建 SqlSessionFactory
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。
1
2
3
|
String
resource
=
"org/mybatis/example/mybatis-config.xml"
;
InputStream
inputStream
=
Resources
.
getResourceAsStream
(
resource
)
;
sqlSessionFactory
=
new
SqlSessionFactoryBuilder
(
)
.
build
(
inputStream
)
;
|
XML 配置文件简单示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments
default
=
"development"
>
<environment
id
=
"development"
>
<transactionManager
type
=
"JDBC"
/>
<dataSource
type
=
"POOLED"
>
<property
name
=
"driver"
value
=
"${driver}"
/>
<property
name
=
"url"
value
=
"${url}"
/>
<property
name
=
"username"
value
=
"${username}"
/>
<property
name
=
"password"
value
=
"${password}"
/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper
resource
=
"org/mybatis/example/BlogMapper.xml"
/>
</mappers>
</configuration>
|
2、不使用 XML 构建 SqlSessionFactory
MyBatis 提供了完整的配置类,提供所有和 XML 文件相同功能的配置项。
1
2
3
4
5
6
|
DataSource
dataSource
=
BlogDataSourceFactory
.
getBlogDataSource
(
)
;
TransactionFactory
transactionFactory
=
new
JdbcTransactionFactory
(
)
;
Environment
environment
=
new
Environment
(
"development"
,
transactionFactory
,
dataSource
)
;
Configuration
configuration
=
new
Configuration
(
environment
)
;
configuration
.
addMapper
(
BlogMapper
.
class
)
;
SqlSessionFactory
sqlSessionFactory
=
new
SqlSessionFactoryBuilder
(
)
.
build
(
configuration
)
;
|
从 SqlSessionFactory 中获取 SqlSession
既然有了 SqlSessionFactory ,顾名思义,我们就可以从中获得 SqlSession 的实例了。SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
1
2
3
4
5
6
|
SqlSession
session
=
sqlSessionFactory
.
openSession
(
)
;
try
{
Blog
blog
=
(
Blog
)
session
.
selectOne
(
"org.mybatis.example.BlogMapper.selectBlog"
,
101
)
;
}
finally
{
session
.
close
(
)
;
}
|
或者:
1
2
3
4
5
6
7
|
SqlSession
session
=
sqlSessionFactory
.
openSession
(
)
;
try
{
BlogMapper
mapper
=
session
.
getMapper
(
BlogMapper
.
class
)
;
Blog
blog
=
mapper
.
selectBlog
(
101
)
;
}
finally
{
session
.
close
(
)
;
}
|
接下来我们探究一下这里到底是怎么执行的。
探究已映射的 SQL 语句
关于 SqlSession 和 Mapper 到底执行了什么操作。下面是简要介绍,这里会给出几个例子。
在上面提到的两个例子中,一个语句应该是通过 XML 定义,而另外一个则是通过注解定义。
通过 XML 定义:
1
2
3
4
5
6
7
8
9
|
<?
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"
resultType
=
"Blog"
>
select * from Blog where id = #{id}
</select>
</mapper>
|
在命名空间“com.mybatis.example.BlogMapper”中定义了一个名为“selectBlog”的映射语句,这样它就允许你使用指定的完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句,就像上面的例子中做的那样:
第一个例子:
1
|
Blog
blog
=
(
Blog
)
session
.
selectOne
(
"org.mybatis.example.BlogMapper.selectBlog"
,
101
)
;
|
这个命名可以直接映射到在命名空间中同名的 Mapper 类,并在已映射的 select 语句中的名字、参数和返回类型匹配成方法。这样你就可以向上面那样很容易地调用这个对应 Mapper 接口的方法。
第二个例子:
1
2
|
BlogMapper
mapper
=
session
.
getMapper
(
BlogMapper
.
class
)
;
Blog
blog
=
mapper
.
selectBlog
(
101
)
;
|
第二例子有很多优势,首先它不是基于字符串常量的,就会更安全;其次,如果你的 IDE 有代码补全功能,那么你可以在有了已映射 SQL 语句的基础之上利用这个功能。
通过注解定义:
对于像 BlogMapper 这样的映射器类(Mapper class)来说,可以使用 Java 注解。比如,上面的 XML 示例可被替换如下:
1
2
3
4
5
|
package
org
.
mybatis
.
example
;
public
interface
BlogMapper
{
@
Select
(
"SELECT * FROM blog WHERE id = #{id}"
)
Blog
selectBlog
(
int
id
)
;
}
|
选择何种方式以及映射语句的定义的一致性对你来说有多重要这些完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。
官方网站:http://mybatis.github.io/mybatis-3/zh/index.html
开源地址:https://github.com/mybatis/mybatis-3