使用 XML 配置 MyBatis
<?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"><property name="username" value="db_user" /><property name="password" value="verysecurepwd" /></properties><settings><setting name="cacheEnabled" value="true" /></settings><typeAliases><typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor" /><package name="com.mybatis3.domain" /></typeAliases><typeHandlers><typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler" /><package name="com.mybatis3.typehandlers" /></typeHandlers><environments default="development"><environment id="development"><transactionManager type="JDBC" /><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></environment><environment id="production"><transactionManager type="MANAGED" /><dataSource type="JNDI"><property name="data_source" value="java:comp/jdbc/MyBatisDemoDS" /></dataSource></environment></environments><mappers><mapper resource="com/mybatis3/mappers/StudentMapper.xml" /><mapper url="file:///D:/mybatisdemo/mappers/TutorMapper.xml" /><mapper class="com.mybatis3.mappers.TutorMapper" /></mappers></configuration>
QA(质量评估环境),UAT(用户验收环境),PRODUCTION(生产环境),可以通过将默认 environment 值设置成想要的
environment id 值
要修改什么配置,只需要将默认环境 environment 值设置成生产环境的 environment id 属性即可。
有时候,我们可能需要在相同的应用下使用多个数据库。比如我们可能有 SHOPPING-CART 数据库来存储所有的订单
明细;使用 REPORTS 数据库存储订单明细的合计,用作报告。
如果你的应用需要连接多个数据库,你需要将每个数据库配置成独立的环境,并且为每一个数据库创建一个
SqlSessionFactory
<environments default="shoppingcart"><environment id="shoppingcart"><transactionManager type="MANAGED" /><dataSource type="JNDI"><property name="data_source" value="java:comp/jdbc/ ShoppingcartDS" /></dataSource></environment><environment id="reports"><transactionManager type="MANAGED" /><dataSource type="JNDI"><property name="data_source" value="java:comp/jdbc/ReportsDS" /></dataSource></environment></environments>
Java Code
inputStream = Resources.getResourceAsStream("mybatis-config.xml");defaultSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);cartSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "shoppingcart");reportSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "reports");
建。在上述的源码中,默认的 SqlSessionFactory 便是使用 shoppingcart 环境设置创建的。
对于每个环境 environment,我们需要配置 dataSource 和 transactionManager 元素。
dataSource 元素被用来配置数据库连接属性。
XML Code
<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>
适用于只有小规模数量并发用户的简单应用程序上。
如果将属性设置成 POOLED,MyBatis 会创建一个数据库连接池,连接池中的一个连接将会被用作数据
库操作。一旦数据库操作完成,MyBatis 会将此连接返回给连接池。在开发或测试环境中,经常使用此
种方式。
如果将类型设置成 JNDI,MyBatis 从在应用服务器向配置好的 JNDI 数据源 dataSource 获取数据库
连接。在生产环境中,优先考虑这种方式。
JDBC 事务管理器被用作当应用程序负责管理数据库连接的生命周期(提交、回退等等)的时候。当你将
TransactionManager 属性设置成 JDBC,MyBatis 内部将使用 JdbcTransactionFactory 类创建
TransactionManager。例如,部署到 Apache Tomcat 的应用程序,需要应用程序自己管理事务。
MANAGED 事务管理器是当由应用服务器负责管理数据库连接生命周期的时候使用。当你将
TransactionManager 属性设置成 MANAGED 时, MyBatis 内部使用 ManagedTransactionFactory 类
创建事务管理器 TransactionManager。例如,当一个 JavaEE的应用程序部署在类似 JBoss, WebLogic,
GlassFish 应用服务器上时,它们会使用 EJB 进行应用服务器的事务管理能力。在这些管理环境中,你
可以使用 MANAGED 事务管理器。
(译者注:Managed 是托管的意思,即是应用本身不去管理事务,而是把事务管理交给应用所在的服务
器进行管理。)
们将数据库连接属性具体化到了 application.properties 文件中,并且为 driver,URL 等属性使用了占位符。
1. 在 applications.properties 文件中配置数据库连接参数,如下所示:
NormalText Code
jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatisdemojdbc.username=rootjdbc.password=admin
XML Code
<properties resource="application.properties"><property name="jdbc.username" value="db_user" /><property name="jdbc.password" value="verysecurepwd" /></properties><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>
值相同,它们会被属性文件中定义的值覆盖.
<properties resource="application.properties"><property name="jdbc.username" value="db_user" /><property name="jdbc.password" value="verysecurepwd" /></properties>
如下例子所示:
XML Code
<select id="findStudentById" parameterType="int"resultType="com.mybatis3.domain.Student">SELECT STUD_ID AS ID, NAME, EMAIL, DOBFROM STUDENTS WHERE STUD_ID=#{Id}</select><update id="updateStudent" parameterType="com.mybatis3.domain. Student">UPDATE STUDENTSSET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}WHERE STUD_ID=#{id}</update>
com.mybatis3.domain.Student
名。如下例子所示,为完全限定名起一个别名:
XML Code
<typeAliases><typeAlias alias="Student" type="com.mybatis3.domain.Student" /><typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor" /><package name="com.mybatis3.domain" /></typeAliases>
XML Code
<select id="findStudentById" parameterType="int" resultType="Student">SELECT STUD_ID AS ID, NAME, EMAIL, DOBFROM STUDENTS WHERE STUD_ID=#{id}</select><update id="updateStudent" parameterType="Student">UPDATE STUDENTSSET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}WHERE STUD_ID=#{id}</update>
会自动扫描包内定义的 JavaBeans,然后分别为 JavaBean 注册一个小写字母开头的非完全限定的类名形式的别名。如下所
示,提供一个需要为 JavaBeans 起别名的包名:
<typeAliases><package name="com.mybatis3.domain" /></typeAliases>
Java Code
@Alias("StudentAlias")public class Student{}
了更简洁的方式实现了数据库操作。
使用 setXXX()方式对占位符设置相应的参数值。
这里,XXX 可以是 Int,String,Date 等 Java 对象属性类型的任意一个。示例如下:
XML Code
<insert id="insertStudent" parameterType="Student">INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB)VALUES(#{studId},#{name},#{email},#{dob})</insert>
1. 创建一个有占位符的 PreparedStatement 接口,如下:
Java Code
PreparedStatement pstmt = connection.prepareStatement("INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(?,?,?,?)");
类型,所以会使用 setInt()方法:
Java Code
pstmt.setInt(1,student.getStudId());
Java Code
pstmt.setString(2, student.getName());pstmt.setString(3, student.getEmail());
5. MyBaits 会将 java.util.Date 类型转换为 into java.sql.Timestamp 并设值:
Java Code
pstmt.setTimestamp(4, new Timestamp((student.getDob()).getTime()));
其实 MyBatis 是通过使用类型处理器(type handlers)来决定这么做的。
java.util.Date、 java.sql.Date、 java,sql.Time、 java.sql.Timestamp、 java 枚举类型等。所以当 MyBatis 发现
属性的类型属于上述类型,他会使用对应的类型处理器将值设置到 PreparedStatement 中,同样地,当从 SQL 结果集构
建 JavaBean 时,也有类似的过程
假设表 STUDENTS 有一个 PHONE 字段,类型为 VARCHAR(15),而 JavaBean Student 有一个 PhoneNumber 类定义类
型的 phoneNumber 属性。
Java Code
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 toString() {return countryCode + "-" + stateCode + "-" + number;}// Setters and getters}public class Student {private Integer id;private String name;private String email;private PhoneNumber phone;// Setters and getters}
<insert id="insertStudent" parameterType="Student">insert into students(name,email,phone)values(#{name},#{email},#{phone})</insert>这里,phone 参数需要传递给#{phone};而 phone 对象是 PhoneNumber 类型。然而,MyBatis 并不知道该怎样来处
理这个类型的对象。为了让 MyBatis 明白怎样处理这个自定义的 Java 对象类型,如 PhoneNumber,我们可以创建一个自定义的类型处理
器,如下所示:1. MyBatis 提供了抽象类 BaseTypeHandler<T> ,我们可以继承此类创建自定义类型处理器。
Java Code
package com.mybatis3.typehandlers;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import com.mybatis3.domain.PhoneNumber;public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType)throws SQLException {ps.setString(i, parameter.getAsString());}@Overridepublic PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException {return new PhoneNumber(rs.getString(columnName));}@Overridepublic PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return new PhoneNumber(rs.getString(columnIndex));}@Overridepublic PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return new PhoneNumber(cs.getString(columnIndex));}}2. 我们使用 ps.setString()和 rs.getString()方法是因为 phone 列是 VARCHAR 类型。
3. 一旦我们实现了自定义的类型处理器,我们需要在 mybatis-config.xml 中注册它:
XML Code
<?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 类型的列上。7 全局参数设置 Settings为满足应用特定的需求,MyBatis 默认的全局参数设置可以被覆盖(overridden)掉,如下所示:
XML Code
<settings><setting name="cacheEnabled" value="true" /><setting name="lazyLoadingEnabled" value="true" /><setting name="multipleResultSetsEnabled" value="true" /><setting name="useColumnLabel" value="true" /><setting name="useGeneratedKeys" value="false" /><setting name="autoMappingBehavior" value="PARTIAL" /><setting name="defaultExecutorType" value="SIMPLE" /><setting name="defaultStatementTimeout" value="25000" /><setting name="safeRowBoundsEnabled" value="false" /><setting name="mapUnderscoreToCamelCase" value="false" /><setting name="localCacheScope" value="SESSION" /><setting name="jdbcTypeForNull" value="OTHER" /><setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode ,toString" /></settings>8 SQL 映射定义 Mappers
Mapper XML 文件中包含的 SQL 映射语句将会被应用通过使用其 statementid 来执行。我们需要在 mybatisconfig.xml 文件中配置 SQL Mapper 文件的位置。
XML Code
<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 接口的包名
使用 XML 配置 MyBatis的更多相关文章
- spring 5.x 系列第5篇 —— 整合 mybatis + druid 连接池 (xml配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 项目目录结构 1.创建maven工程,除了Spring基本依赖外,还需要导 ...
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- MyBatis Generator generatorConfig.xml配置详解
所有Generator的xml详细说明见:http://mybatis.org/generator/configreference/xmlconfig.html (英文版) 引用 http://blo ...
- Spring Boot简单xml配置集成mybatis
一.xml配置版 1.properties文件中增加的配置: mybatis.config-locations=classpath:mybatis/mybatis-config.xml mybatis ...
- 笔记:MyBatis XML配置详解
MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配置 properties ...
- Maven-SSM项目pom.xml配置以及springmvc配置以及mybatis配置及web.xml配置
一.Maven本地仓库的pom.xml配置 (全部是mysql数据库) <project xmlns="http://maven.apache.org/POM/4.0.0" ...
- generator自动生成mybatis的xml配置
generator自动生成mybatis的xml配置.model.map等信息:1.下载mybatis-generator-core-1.3.2.jar包. 网址:http://code. ...
- Mybatis最入门---代码自动生成(generatorConfig.xml配置)
[一步是咫尺,一步即天涯] 经过前文的叙述,各位看官是不是已经被Mybatis的强大功能给折服了呢?本文我们将介绍一个能够极大提升我们开发效率的插件:即代码自动生成.这里的代码自动生成包括,与数据库一 ...
- MyBatis—mybatis-config.xml配置介绍
在定义sqlSessionFactory时需要指定MyBatis主配置文件: Xml代码 说明: 收藏代码 1. <bean id="sqlSessionFactory" ...
随机推荐
- 谷歌统计使用代码部署和事件API使用
谷歌统计代码部署和API使用 1.注册谷歌账号 要使用GA,必需先成为GOOGLE的注册用户,如果没有请去注册.当然,你有GMAIL邮箱就可以.邮箱就是帐户名. 2.开启Google Analytic ...
- Vbs脚本实现radmin终极后门
Vbs脚本实现radmin终极后门 代码如下: on error resume next const HKEY_LOCAL_MACHINE = &H80000002 strComputer = ...
- 第七篇:数据预处理(四) - 数据归约(PCA/EFA为例)
前言 这部分也许是数据预处理最为关键的一个阶段. 如何对数据降维是一个很有挑战,很有深度的话题,很多理论书本均有详细深入的讲解分析. 本文仅介绍主成分分析法(PCA)和探索性因子分析法(EFA),并给 ...
- swift学习 - collectionView
swift CollectionView学习 效果图: 源码: ContModel.swift import UIKit class ContModel: NSObject { var title:S ...
- ReentrantLock深入学习
ReentrankLock 分为 非公平锁及公平锁 首先我们看一下它里面有哪些属性: private final Sync sync;Sync 这个类是 ReentrantLock的 一个静态内部类 ...
- linux开发常用命令
最近经常查看服务器上的log文件,有时log文件太大查起来很不方便,看了看网上说可以部分查询,就先记录一下吧 Linux中查看部分文件内容命令head,tail,sed的用法: Linux中的查看文件 ...
- Introducing: Machine Learning in R(转)
Machine learning is a branch in computer science that studies the design of algorithms that can lear ...
- 01-.Net编程机制
.NetFarmwark特点: 多平台:该系统可以在广泛的计算机上运行,包括从服务器.桌面机到PDA和移动电话. 行业标准:该系统使用行业标准的通信协议,比如XML.HTTP.SOAP和WSDL. 安 ...
- matlab错误:Subscript indices must either be real positive integers or logicals.
matlab错误:Subscript indices must either be real positive integers or logicals. 中文解释:下标索引必须是正整数类型或者逻辑类 ...
- JSP/Servlet Web 学习笔记 DayTwo
JSP指令 a)page指令 定义JSP文件中的全局属性.一个JSP页面可以包含多个page指令.除了Import以外,其他page指令定义的属性/值只能出现一次. 其详细语法为: <%page ...