Java Persistence with MyBatis 小结2
MyBatis 最关键的组成部分是 SqlSessionFactory,我们可以从中获取 SqlSession,并执行映射的 SQL 语句。SqlSessionFactory 对象可以通过基于 XML 的配置信息或者 Java API 创建。
1 mybatis环境,environments 配置默认的数据库环境
MyBatis 支持配置多个 dataSource 环境,可以将应用部署到不同的环境上,如 DEV(开发环境),TEST(测试换将),QA(质量评估环境),UAT(用户验收环境),PRODUCTION(生产环境),可以通过将默认 environment 值设置成想要的environment id 值。
2 每个environment 环境配置,需要有dataSource 和 transactionManager
dataSource 元素被用来配置数据库连接属性。典型配置如下
<dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource>
2.1 dataSource 的类型可以配置成其内置类型之一,如 UNPOOLED,POOLED,JNDI。
如果将类型设置成 UNPOOLED,MyBatis 会为每一个数据库操作创建一个新的连接,并关闭它。该方式
适用于只有小规模数量并发用户的简单应用程序上。
如果将属性设置成 POOLED,MyBatis 会创建一个数据库连接池,连接池中的一个连接将会被用作数据
库操作。一旦数据库操作完成,MyBatis 会将此连接返回给连接池。在开发或测试环境中,经常使用此
种方式。
如果将类型设置成 JNDI,MyBatis 从在应用服务器向配置好的 JNDI 数据源 dataSource 获取数据库
连接。在生产环境中,优先考虑这种方式。
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
- 在 properties 元素体内指定的属性首先被读取。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
2.2 事务管理器 TransactionManager
MyBatis 支持两种类型的事务管理器: JDBC and MANAGED.
- JDBC 事务管理器被用作当应用程序负责管理数据库连接的生命周期(提交、回退等等)的时候。当你将TransactionManager 属性设置成 JDBC,MyBatis 内部将使用 JdbcTransactionFactory 类创建TransactionManager。例如,部署到 Apache Tomcat 的应用程序,需要应用程序自己管理事务。它依赖于从数据源得到的连接来管理事务作用域。
- MANAGED 事务管理器是当由应用服务器负责管理数据库连接生命周期的时候使用。当你将TransactionManager 属性设置成 MANAGED 时,MyBatis 内部使用 ManagedTransactionFactory 类创建事务管理器TransactionManager。例如,当一个JavaEE的应用程序部署在类似 JBoss,WebLogic,GlassFish 应用服务器上时,它们会使用 EJB 进行应用服务器的事务管理能力。在这些管理环境中,你可以使用 MANAGED 事务管理器。
Managed 是托管的意思,即是应用本身不去管理事务,而是把事务管理交给应用所在的服务器进行管理。
如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
3 类型别名 typeAliases,
配置文件中,对于 resultType 和 parameterType 属性值,我们需要使用 JavaBean 的完全限定名。
我们可以为完全限定名取一个别名(alias),然后其需要使用完全限定名的地方使用别名,而不是到处使用完全限定名。
<typeAliases> <typeAlias alias="Student" type="com.mybatis3.domain.Student" /> <typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor" /> <package name="com.mybatis3.domain" /> </typeAliases>
另一种方式为 JavaBeans 起别名,使用注解@Alias:
@Alias("StudentAlias") public class Student{}
注意:@Alias 注解将会覆盖配置文件中的<typeAliases>定义。
4 类型处理器 typeHandlers
MyBatis 是怎么知道对于 Integer 类型属性使用 setInt() 和 String 类型属性使用 setString()方法呢?
其实 MyBatis 是通过使用类型处理器(type handlers)来决定这么做的。
MyBatis 对于以下的类型使用内建的类型处理器:所有的基本数据类型、基本类型的包裹类型、byte[]、java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java 枚举类型等。所以当 MyBatis 发现属性的类型属于上述类型,他会使用对应的类型处理器将值设置到 PreparedStatement 中,同样地,当从 SQL 结果集构建 JavaBean 时,也有类似的过程。
对于自定义的类型,需要自己创建自定义类型处理器。
MyBatis 提供了抽象类 BaseTypeHandler<T> ,我们可以继承此类创建自定义类型处理器。
例如,假设表 STUDENTS 有一个 PHONE 字段,类型为 VARCHAR(15),而 JavaBean Student 有一个 PhoneNumber 类定义类型的 phoneNumber 属性。
有一个属性是如下的类, PhoneNumber 类
![](/assets/blank.gif)
![](/assets/blank.gif)
public class PhoneNumber { private String countryCode; private String stateCode; private String number; public PhoneNumber() { } public PhoneNumber(String countryCode, String stateCode, String number) { this.countryCode = countryCode; this.stateCode = stateCode; this.number = number; } public PhoneNumber(String string) { if(string != null) { String[] parts = string.split("-"); if(parts.length > 0) this.countryCode = parts[0]; if(parts.length > 1) this.stateCode = parts[1]; if(parts.length > 2) this.number = parts[2]; } } public String getAsString() { return countryCode + "-" + stateCode + "-" + number; } // Setters and getters }
View Code
而Student 定义如下
![](/assets/blank.gif)
![](/assets/blank.gif)
public class Student { private Integer id; private String name; private String email; private PhoneNumber phone; // Setters and getters }
View Code
4.1 创建的类型处理器如下
importjava.sql.CallableStatement; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; importorg.apache.ibatis.type.BaseTypeHandler; importorg.apache.ibatis.type.JdbcType; importcom.mybatis3.domain.PhoneNumber; public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber> { @Override public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter.getAsString()); } @Override public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException { return new PhoneNumber(rs.getString(columnName)); } @Override public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return new PhoneNumber(rs.getString(columnIndex)); } @Override public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return new PhoneNumber(cs.getString(columnIndex)); } }
说明:我们使用 ps.setString()和 rs.getString()方法是因为 phone 列是 VARCHAR 类型。
4.2 一旦我们实现了自定义的类型处理器,我们需要在 mybatis-config.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> <properties resource="application.properties" /> <typeHandlers><typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler" /> </typeHandlers> </configuration>
注册 PhoneTypeHandler 后, MyBatis 就能够将 Phone 类型的对象值存储到 VARCHAR 类型的列上。
5 SQL 映射定义 Mappers
Mapper XML 文件中包含的 SQL 映射语句将会被应用通过使用其 statementid 来执行。我们需要在 mybatis-config.xml 文件中配置 SQL Mapper 文件的位置。
<mappers><mapper resource="com/mybatis3/mappers/StudentMapper.xml" /><mapper url="file:///D:/mybatisdemo/app/mappers/TutorMapper.xml" /><mapper class="com.mybatis3.mappers.TutorMapper" /><package name="com.mybatis3.mappers" /> </mappers>
以上每一个<mapper> 标签的属性有助于从不同类型的资源中加载映射 mapper:
resource 属性用来指定在 classpath 中的 mapper 文件。
url 属性用来通过完全文件系统路径或者 web URL 地址来指向 mapper 文件
class 属性用来指向一个 mapper 接口
package 属性用来指向可以找到 Mapper 接口的包名
Java Persistence with MyBatis 小结2相关推荐
- Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门
本章将涵盖以下话题: ž MyBatis是什么? ž 为什么选择MyBatis? ž MyBatis安装配置 ž 域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Ja ...
- Java Persistence with MyBatis 3(中国版)
译者的话 前段时间因为工作和学习的须要,我打算深入研究MyBatis框架.于是在网上查找关于MyBatis的教程,发现国内网上关于MyBatis的教程资料少得可怜:除了MyBatis官网上的用户使用手 ...
- JPA(Java Persistence API )
ORM概述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数据库 ...
- java B2B2C springmvc mybatis电子商务平台源码-Consul服务发现原理...
Consul 是什么 Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License ...
- Java Persistence API中的FetchType LAZY和EAGER之间的区别?
我是Java Persistence API和Hibernate的新手. Java Persistence API中的FetchType.LAZY和FetchType.EAGER什么区别? #1楼 我 ...
- 从命令行及java程序运行MyBatis Generator 1.3.x生成MyBatis3.x代码
为什么80%的码农都做不了架构师?>>> 近期因为项目需要,调研了myBatis 3.x的使用,当然,顺便也就研究了一下使用Generator来通过逆向工程生成pojo,map ...
- java.nio.ByteBuffer用法小结
转载自 java.nio.ByteBuffer用法小结 在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入 ...
- Java Persistence API:快速入门
各位读者好! 在我的一些朋友提出无数请求之后,我决定写一篇关于Java Persistence API的简短文章. 面向对象的编程范式是当今最流行和使用最广泛的模型,它具有无缝建模现实生活实体的能 ...
- JAVA中常见异常小结
JAVA中常见异常小结 参考文章: (1)JAVA中常见异常小结 (2)https://www.cnblogs.com/lq147760524/p/6926175.html (3)https://ww ...
最新文章
- R语言使用ggplot2包使用geom_density()函数绘制分组密度图(添加直方图、分组颜色配置)实战(density plot)
- Qt 连接达梦数据库
- android使用tabhost实现导航
- 未来教育计算机二级为什么分数很低,计算机二级考试失分了却不知道为什么?...
- rfm模型分析与客户细分_如何使用基于RFM的细分来确定最佳客户
- vue——缓存路由组件
- linux系统电脑白屏,在Deepin Linux 15.7系统中换桌面后关机界面白屏的解决
- C语言程序设计基础实验教程,C语言程序设计基础实验教程
- python精彩编程200例-python趣味编程100例(99个)
- tshark/wireshark抓包小结
- java过滤关键字_java过滤敏感词汇
- 2016 yyuc框架环境配置
- 广义相对论-学习记录4-第三章-张量分析与黎曼几何1
- 使用win10远程控制ubuntu14.04(2)
- 前端容易忽略的 debugger 调试技巧
- 华为手机真机测试问题 The application could not be installed: INSTALL_FALLED_INTERNAL_ERROR
- 5.系统设计的工作内容与技能工具有哪些?
- 解决element 新版本cascader级联选择器的各种bug
- 让你的Onedrive网盘秒变网站,文件展示,直连下载,视频在线播放
- 计算机春考,春考计算机模拟试卷.ppt
热门文章
- linux内核测试,Linux内核测试的生命周期
- Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
- 20160828_第4周周报
- Effective C++学习第三天
- c++模板--2(模板机制,模板的局限性,类模板,类模板做函数的参数)
- Linux时间函数札记
- 【汇编语言】数据类型的匹配问题:自动匹配与手动匹配
- 701. 二叉搜索树中的插入操作
- 【性能优化实战】java验证码识别训练
- [Python设计模式] 第17章 程序中的翻译官——适配器模式