• MyBatis是什么?

MyBatis 是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。 MyBatis几乎消 除了所有的JDBC 代码,也基本不需要手工去设置参数和获取检索结果。 MyBatis 能够使用简单的 XML格式或者注解进行来配置,能够映射基本数据元素、 Map 接口和POJOs(普通java对象)到 数据库中的记录。

  • MyBatis核心--SqlSessionFactory的实例

SqlSessionFactory 实例通过 SqlSessionFactoryBuilder来获得,SqlSessionFactoryBuilder能够从XML配置文件或者通过自 定义编写的配置类( Configuration class),来创建一个SqlSessionFactory实例。

  • XML中创建 SqlSessionFactory 实例


XML中创建SqlSessionFactory实例非常简单。建议您使用类资源路径( classpath
resource)来加载配置文件,但是您也能够使用任何方式, 包括文本文件路径或者以file:// 开

URL 的方式。 MyBatis包括一个叫做Resources 的工具类( utility class), 其中包含了一系
列方法,使之能简单地从classpath 或其它地方加载配置文件。
String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
XML配置文件包含MyBatis框架的核心设置,包括获取数据库连接的DataSource实例,和包
括决定事务作用域范围和控制的事务管理等。您将能够在后面的章节中找到详细的XML配置,在
这里我们先展示一个简单的例子:

<?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>

<!--注册mapper-->

<mappers>

<mapper resource="org/mybatis/example/BlogMapper.xml"/>

</mappers>

</configuration>

虽然XML配置文件中还有很多其它的配置细节,但是,上面的示例显示了最重要的部分。注 意 XML配置文件的头部,会使用DTD 验证文档来验证该XML配置文件。 body 部分的environment 元素,包含了事务管理和连接池配置。 Mappers 元素指定了映射配置文件--包含SQL 语句和映射 定义的XML文件。

  • 如何不使用XML来创建SqlSessionFactory

如果您喜欢直接通过java代码而不是通过XML创建配置选项,或者想创建您自己的配置生成 器。 MyBatis 提供了一个完整的配置类( Configuration class),它提供了与XML文件相同的配 置选项。 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);

请注意, 这种方式下的配置添加一个映射类( mapper class) 。映射类是包含SQL映射注解 的Java 类, 从而避免了使用XML。 但是,由于注解的一些局限性以及MyBatis 映射的复杂性, XML仍然是一些高级的映射功能(如嵌套连接映射, Nested Join Mapping)所必须的方式。基于 这个原因,如果存在XML文件, MyBatis自动寻找并加载这个XML文件。在这种情况下, BlogMapper.xml 将会被类路径下名称为BlogMapper.class 的类加载。

  • 从 SqlSessionFactory 获取SqlSession

现在您已经创建了一个SqlSessionFactory(指上面的sqlMapper),正如它名字暗示那样,
您可以通过它来创建一个SqlSession 实例。 SqlSession 包含了所有执行数据库SQL 语句的方
法。您能够直接地通过SqlSession 实例执行映射SQL语句。例如:
SqlSession session = sqlMapper.openSession();

try {
Blog blog = (Blog) session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
}

finally {
session.close();
}

虽然这种方法很有效, MyBatis以前版本的用户对此也可能很熟悉,但现在有一个更简便的
方式,那就是对给定的映射语句,使用一个正确描述参数与返回值的接口(如
BlogMapper.class),您就能更清晰地执行类型安全的代码,从而避免错误和异常。 如:

SqlSession session = sqlSessionFactory.openSession();

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

Blog blog = mapper.selectBlog(101);
}

finally {
session.close();
}

QL 映射 XML 文件 MyBatis真正强大之处就在这些映射语句,也就是它的魔力所在。对于它的强大功能, SQL映 射文件的配置却非常简单。如果您比较SQL映射文件配置与JDBC代码,您很快可以发现,使用 SQL映射文件配置可以节省95%的代码量。 MyBatis被创建来专注于SQL,但又给您自己的实现极 大的空间。 如果initial_context没有配置,那么数据源就会直接从InitialContext进行查 找,如: DataSource ds = (DataSource) initialContext.lookup(data_source);

  • SQL 映射XML文件只有一些基本的元素需要配置,并且要按照下面的顺序来定义(in the
    order that they should be defined):


• cache –在特定的命名空间配置缓存。

cache-ref – 引用另外一个命名空间配置的缓存.
• resultMap – 最复杂也是最强大的元素,用来描述如何从数据库结果集里加载对象。
• parameterMap – 不推荐使用! 在旧的版本里使用的映射配置,这个元素在将来可能会被
删除,因此不再进行描述。
• sql – 能够被其它语句重用的SQL块。

insert –INSERT 映射语句
• update –UPDATE 映射语句

delete –DELEETE 映射语句

select –SELECT 映射语句
接下来的章节将会对每一个元素进行描述。
Select元素
Select 是 MyBatis中最常用的元素之一。除非您把数据取回来,否则把数据放在数据库是没
什么意义的,因此大部分的应用查询数据远多于修改数据。对每一次插入、修改、删除数据都可
能伴有大量的查询。这是MyBatis基本设计原则之一,也就是为什么把这么多的焦点和努力放在
查询和结果集映射上。

对简单的查询, select 元素的配置是相当简单的,如:
<select id=” selectPerson” parameterType=” int” resultType=” hashmap” >
SELECT * FROM PERSON WHERE ID = #{id}
</select>
这条语句叫做selectPerson,以int 型(或者Integer 型)作为参数,并返回一个以数据库
列名作为键值的HashMap。
注意这个参数的表示方法: #{id}
它告诉MyBatis 生成PreparedStatement参数。

对于JDBC,像这个参数会被标识为“ ?” ,
然后传递给PreparedStatement,像这样:
// 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的配置使用都非常相似:
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
Attribute Description
id 在这个命名空间下唯一的标识符,可被其它语句引用
parameterType 传给此语句的参数的完整类名或别名
parameterMap 不推荐使用。这个参数将来可能被删除。

resultType --语句返回值类型的完整类名或别名。注意,如果返回的是集合

collections),那么应该是集合所包含的具体子类型,而不是集
合本身。 resultType 与resultMap 不能同时使用

resultMap --引用的外部定义的resultMap。结果集映射是MyBatis 中最强大的特性,同时
又非常好理解。许多复杂的映射都可以轻松解决。

flushCache --如果设为true,则会在每次语句调用的时候就会清空缓存。 select 语句默认
设为false

useCache-- 如果设为true,则语句的结果集将被缓存, select 语句默认设为false

timeout --设置超时时间,默认没有设置,由驱动器自己决定

fetchSize --设置从数据库获得记录的条数,默认没有设置,由驱动器自己决定

statementType-- 可设置为STATEMENT, PREPARED 或CALLABLE 中的任意一个,告诉MyBatis 分
别使用Statement, PreparedStatement或者CallableStatement。默认:
PREPARED

resultSetType -- FORWARD_ONLY 、 SCROLL_SENSITIVE 、 SCROLL_INSENSITIVE 三个中的任意一
个。默认没有设置,由驱动器自己决定。

最新文章

  1. Visual Studio中没有为此解决方案配置选中要生成的项目
  2. windows API 开发飞机订票系统 图形化界面 (一)
  3. Selenium webdriver 学习总结-元素定位
  4. linux 试题
  5. ES5 vs ES6
  6. 【转】Android Gson的使用
  7. NHibernate实例化类部分属性
  8. python手机号码运营商归属测试
  9. {key}面向对象程序设计-C++ polymorphism 【第十三次上课笔记】
  10. Nmon 性能:分析 AIX 和 Linux 性能的免费工具
  11. es6笔记3^_^object
  12. Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
  13. S2b只适合于电商吗?
  14. java中的构造,封装
  15. opensuse 使用xx-net
  16. CapsNet胶囊网络(理解)
  17. [android] 采用aidl绑定远程服务
  18. springMVC_05结果跳转方式
  19. nginx重启命令
  20. Selenium + WebDriver 各浏览器驱动下载地址

热门文章

  1. 封装的ajax请求
  2. Codeforces 722C. Destroying Array
  3. 关于url中的#-----hash
  4. 实验一 DOS
  5. 正确使用ng-if和ng-show
  6. DNS域名解析服务器
  7. TC250专场
  8. 关于xml配置实现AOP的小知识
  9. SendInput模拟键盘输入的问题
  10. 第一章 Java的I/O演进之路