使用 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" ...
随机推荐
- 使用java API操作hdfs--读取hdfs文件并打印
在myclass之中创建类文件,这个myclass目录是自己创建的. 编译的时候会报如下的错误: 很明显就是没有导入包的结果 见这个API网站,则可以找到响应的包,当然还有java的api文档 htt ...
- [js笔记整理]事件篇
一.事件流1.冒泡事件:从特定的事件到不特定事件依次触发:(由DOM层次的底层依次向上冒泡)(1)示例: <html onclick="add('html<br>')&qu ...
- python 用户交互
#coding=utf8 name = input("name:") age = int(input("age:")) job = input("jo ...
- iOS 伐码猿真爱—「偷懒 || 效率 工具类」
自检 代码不会可以多敲几次,学习的重点是思想:-- 认同. BUT 如果你把自己会的.熟知的.可以说写的似流水的代码,不管是在工作 或是 自学习中你还是一点一点的敲出来,是不是有点...,copy & ...
- XSS攻击及预防
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插 ...
- 深入Java集合学习系列:Hashtable的实现原理
第1部分 Hashtable介绍 和HashMap一样,Hashtable也是一个散列表,它存储的内容是键值对(key-value)映射.Hashtable继承于Dictionary,实现了Map.C ...
- c#接口使用详解
c#接口使用详解 c#中接口隐式与显示实现 c#中接口可以隐式实现.显示实现,隐式实现更常使用.显示实现较少使用 其区别在于 显示实现避免接口函数签名冲突 显示实现只可以以接口形式调用 显示实现其子类 ...
- React入门---属性(state)-7
state------>虚拟dom------>dom 这个过程是自动的,不需要触发其他事件来调用它. state中文理解:页面状态的的一个值,可以存储很多东西. 学习state的使用: ...
- deepin/ubuntu下搭建Jekyll环境
title: deepin/ubuntu下搭建Jekyll环境 最近用github搭建了个博客,正好也学习一下markdown语法,由于markdown写完后不是立即可见,所以每次写完文章都要经过在线 ...
- Python字符处理
字符串就是一系列字符.在python中,用引号括起来的都是字符串,这里的引号可以是单引号也可以双引号. 例如: >>> 'this is a string' 'this is a s ...