• 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 三个中的任意一
个。默认没有设置,由驱动器自己决定。

MyBatis3学习--来源自用户指南的更多相关文章

  1. Jersey用户指南学习笔记1

    Jersey用户指南是Jersey的官方文档, 英文原版在这:https://jersey.github.io/documentation/latest/index.html 中文翻译版在这:http ...

  2. Gradle用户指南

    下载安装gradle 2.1 下载地址:http://www.gradle.org/learn 安装先决条件:gradle安装需要1.6或者更高版本的jdk(jre)(可以使用java –versio ...

  3. Vivado Design Suite用户指南之约束的使用第二部分(约束方法论)

    Constraints Methodology(约束方法论) 关于约束方法论 设计约束定义了编译流程必须满足的要求,以使设计在板上起作用. 并非所有步骤都使用所有约束在编译流程中. 例如,物理约束仅在 ...

  4. 《Apache Velocity用户指南》官方文档

    http://ifeve.com/apache-velocity-dev/ <Apache Velocity用户指南>官方文档 原文链接   译文连接 译者:小村长  校对:方腾飞 Qui ...

  5. Celery-4.1 用户指南: Calling Tasks(调用任务)

    基础 本文档描述 Celery 中任务实例和 Canvas 使用的统一 “Calling API”. API 中定义了一个执行选项的标准集,以及三个方法: - apply_async(args[, k ...

  6. (转)新手学习System Verilog & UVM指南

    从刚接触System Verilog以及后来的VMM,OVM,UVM已经有很多年了,随着电子工业的逐步发展,国内对验证人才的需求也会急剧增加,这从各大招聘网站贴出的职位上也可以看出来,不少朋友可能想尽 ...

  7. CVAT 用户指南

    用户指南 计算机视觉标注工具(CVAT)是基于 Web 为计算机视觉算法标注视频和图像的在线工具. 它的灵感来自Vatic免费的.在线的.交互式的视频注释工具. CVAT有许多强大的功能: 在关键帧之 ...

  8. Gradle用户指南(1)-Gradle安装

    前置条件 Gradle 需要 Java JDK 或者 JRE,版本是 6 及以上.Gradle 将会装载自己的 Groovy 库,因此,Groovy 不需要被安装.任何存在的 Groovy 安装都会被 ...

  9. Gradle用户指南(章9:Groovy快速入门)

    Gradle用户指南(章9:Groovy快速入门) 你可以使用groovy插件来构建groovy项目.这个插件继承了java插件的功能,且扩展了groovy编译.你的项目可以包含groovy代码.ja ...

随机推荐

  1. 如何在WPF的DiagramControl中绘制一个类型数据关系图的方法

    https://www.devexpress.com/Support/Center/Question/Details/T418156 虽然是在wpf中,但是在win中也可以调用wpf控件,这个太棒了, ...

  2. ZigBee 安全探究

    ZigBee 安全探究 0x02 ZigBee安全机制 (注:对于本节内容,可能在新版ZigBee协议标准中会有所变化,请以新版为准.) ZigBee主要提供有三个等级的安全模式: 1. 非安全模式: ...

  3. Linux内核创建一个新进程

    张雨梅   原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 创建新进程 如果同一个程序被多 ...

  4. Selenium IDE 基础教程

    Selenium IDE 基础教程 1.下载安装     a 在火狐浏览其中搜索附件组件,查找 Selenium IDE     b 下载安装,然后重启firefox 2.界面讲解      在菜单- ...

  5. django框架代码基础

    urls.py 导入相对应的模块from django.conf.urls import url,includefrom django.contrib import adminfrom son1.vi ...

  6. Linux 系统时间和硬件时间

    linux 的系统时间有时跟硬件时间是不同步的 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟.系统时钟是指当前Linux Kernel ...

  7. Spring jar包详解

    Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...

  8. openssl lhash 数据结构哈希表

    哈希表是一种数据结构,通过在记录的存储位置和它的关键字之间建立确定的对应关系,来快速查询表中的数据: openssl lhash.h 为我们提供了哈希表OPENSSL_LHASH 的相关接口,我们可以 ...

  9. 【腾讯云的1001种玩法】腾讯云搭建DiscuzX论坛

    版权声明:本文由艾可德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/506828001481866457 来源:腾云阁 h ...

  10. javascript原型prototype浅识

    C++,java是基于类的语言,主要通过类来实现继承. javascript是基于原型的语言,通过原型来实现继承. 什么是原型?每种物质,都可以追根溯源,原型就是对象的根源.继承就是追根溯源. jav ...