mybatis-config.xml详解
1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 <!DOCTYPE configuration 4 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 5 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 6 7 <configuration> 8 <!-- 9 属性 10 属性文件或property标签都能设置,一般就在属性文件里好了 11 --> 12 <properties resource="myBatisConf.properties"> 13 <property name="driverClass" value="com.mysql.jdbc.Driver"/> 14 </properties> 15 16 <!--设置MyBatis的运行方式--> 17 <settings> 18 <!--日志框架--> 19 <setting name="logImpl" value="LOG4J2"/> 20 <!--超时时间--> 21 <setting name="defaultStatementTimeout" value="50000"/> 22 </settings> 23 24 <!--别名--> 25 <typeAliases> 26 <!--除了可以自己定义别名外,MyBatis内部对常用类型也有别名 主要就是 map hashmap等--> 27 <typeAlias alias="AcReport" type="org.zln.domain.AcReport" /> 28 <typeAlias alias="StudCard" type="org.zln.domain.StudCard" /> 29 <typeAlias alias="Student" type="org.zln.domain.Student" /> 30 <typeAlias alias="Teacher" type="org.zln.domain.Teacher" /> 31 </typeAliases> 32 33 <!--类型处理器 用于数据库数据类型和Java数据类型的转化一般不需要自己重写 34 要重写的话,实现 TypeHandler 接口 35 --> 36 <!--<typeHandlers>--> 37 <!--<typeHandler handler="" jdbcType="" javaType=""/>--> 38 <!--</typeHandlers>--> 39 40 <!--对象工厂 41 每次创建结果对象新的实例的时候回用到 可以通过集成 DefaultObjectFactory 来自己重写 42 --> 43 <!--<objectFactory type=""></objectFactory>--> 44 45 <!--MyBatis 允许你在某一点拦截已映射语句执行的调用。默认情况下,MyBatis 允许使用 插件来拦截方法调用--> 46 <!--<plugins>--> 47 <!--<plugin interceptor=""></plugin>--> 48 <!--</plugins>--> 49 50 <!--环境--> 51 <environments default="development"> 52 <!--环境变量 可以配置多个,要用哪个,由 environments 决定--> 53 <environment id="development"> 54 <!--事务管理器 JDBC或MANAGED 55 JDBC:直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。 56 MANAGED:它从来不提交或回滚一个连接。而它会让 57 容器来管理事务的整个生命周期(比如 Spring 或 JEE 应用服务器的上下文)。默认 情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止 它,将 closeConnection 属性设置为 false。例如: 58 <transactionManager type="MANAGED"> 59 <property name="closeConnection" value="false"/> 60 </transactionManager> 61 --> 62 <transactionManager type="JDBC" /> 63 <!--数据源 type指明了数据源类型 64 65 UNPOOLED 这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。不同的数据库对这 个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的 66 POOLED 这是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例 时必要的初始连接和认证时间。这是一种当前 Web 应用程序用来快速响应请求很流行的方法。 67 JNDI 68 69 不同type类型支持的配置属性是不一样的 70 --> 71 <dataSource type="POOLED"> 72 <property name="driver" value="${driverClass}" /> 73 <property name="url" value="${url}" /> 74 <property name="username" value="${username}" /> 75 <property name="password" value="${password}" /> 76 </dataSource> 77 </environment> 78 </environments> 79 80 <!--配置映射文件--> 81 <mappers> 82 <mapper resource="org/zln/mapper/AcReportMapper.xml" /> 83 <mapper resource="org/zln/mapper/StudCardMapper.xml" /> 84 <mapper resource="org/zln/mapper/StudentMapper.xml" /> 85 <mapper resource="org/zln/mapper/TeacherMapper.xml" /> 86 </mappers> 87 </configuration>
properties
settings
配置MyBatis运行时的行为方式
typeAliases
typeHandlers
@font-face { font-family: "Courier New"; }@font-face { font-family: "Times"; }@font-face { font-family: "宋体"; }@font-face { font-family: "Cambria Math"; }@font-face { font-family: "@宋体"; }@font-face { font-family: "Calibri Light"; }@font-face { font-family: "Calibri"; }@font-face { font-family: "MS Mincho"; }@font-face { font-family: "@MS Mincho"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 12pt; font-family: Calibri; }h2 { margin: 13pt 0cm; text-align: justify; line-height: 173%; page-break-after: avoid; font-size: 16pt; font-family: "Calibri Light"; }.MsoChpDefault { font-family: Calibri; }div.WordSection1 { }
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要 这样做的话,简单实现 TypeHandler 接口(org.mybatis.type),然后映射新的类型处理器类到 Java 类型,还有可选的一个 JDBC 类型。
// ExampleTypeHandler.java
public class ExampleTypeHandler implements TypeHandler { public void setParameter(PreparedStatement ps, int i, Object
parameter,JdbcType jdbcType) throws SQLException {
ps.setString(i, (String) parameter);
} public Object getResult(ResultSet rs, String columnName)
throws SQLException {
return rs.getString(columnName);
} public Object getResult(CallableStatement cs, int columnIndex)
throws SQLException {
return cs.getString(columnIndex);
} }
// MapperConfig.xml
<typeHandlers> <typeHandler javaType="String" jdbcType="VARCHAR"
handler="org.mybatis.example.ExampleTypeHandler"/> </typeHandlers>
使用这样的类型处理器将会覆盖已经存在的处理 Java 的 String 类型属性和 VARCHAR 参数及结果的类型处理器。要注意 MyBatis 不会审视数据库元信息来决定使用哪种类型,所 以你必须在参数和结果映射中指定那是 VARCHAR 类型的字段,来绑定到正确的类型处理 器上。这是因为 MyBatis 直到语句被执行都不知道数据类型的这个现实导致的。
objectFactory
MyBatis 每次创建结果对象新的实例时,它使用一个 ObjectFactory 实例来完成。如果参 数映射存在,默认的 ObjectFactory 不比使用默认构造方法或带参数的构造方法实例化目标 类做的工作多。如果你想重写默认的 ObjectFactory,你可以创建你自己的。比如:
// ExampleObjectFactory.java
package org.zln.mapper; public class ExampleObjectFactory extends DefaultObjectFactory { public Object create(Class type) { return super.create(type); } public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) { return super.create(type, constructorArgTypes, constructorArgs); } public void setProperties(Properties properties) { super.setProperties(properties); } }
@font-face { font-family: "Courier New"; }@font-face { font-family: "Times"; }@font-face { font-family: "宋体"; }@font-face { font-family: "Cambria Math"; }@font-face { font-family: "@宋体"; }@font-face { font-family: "Calibri Light"; }@font-face { font-family: "Calibri"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 12pt; font-family: Calibri; }h2 { margin: 13pt 0cm; text-align: justify; line-height: 173%; page-break-after: avoid; font-size: 16pt; font-family: "Calibri Light"; }.MsoChpDefault { font-family: Calibri; }div.WordSection1 { }
// MapperConfig.xml
<objectFactory type="org.mybatis.example.ExampleObjectFactory"> <property name="someProperty" value="100"/>
</objectFactory>
ObjectFactory 接口非常简单。它包含两个用于创建的方法,一个是默认构造方法,另外 一个是处理带参数的构造方法。最终,setProperties 方法可以被用来配置 ObjectFactory。在 初始化你的 ObjectFactory 实例后,objectFactory 元素体中定义的属性会被传递给 setProperties 方法。
plugins
@font-face { font-family: "Times"; }@font-face { font-family: "Wingdings"; }@font-face { font-family: "宋体"; }@font-face { font-family: "Cambria Math"; }@font-face { font-family: "@宋体"; }@font-face { font-family: "Calibri Light"; }@font-face { font-family: "Calibri"; }@font-face { font-family: "MS Mincho"; }@font-face { font-family: "@MS Mincho"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 12pt; font-family: Calibri; }h2 { margin: 13pt 0cm; text-align: justify; line-height: 173%; page-break-after: avoid; font-size: 16pt; font-family: "Calibri Light"; }.MsoChpDefault { font-family: Calibri; }div.WordSection1 { }
上面的插件将会拦截在 Executor 实例中所有的“update”方法调用,它也是负责低层次 映射语句执行的内部对象。
environments
MyBatis 可以配置多种环境。这会帮助你将 SQL 映射应用于多种数据库之中。例如, 你也许为开发要设置不同的配置,测试和生产环境。或者你可能有多种生产级数据库却共享 相同的模式,所以你会想对不同数据库使用相同的 SQL 映射。这种用例是很多的。
要记得一个很重要的问题:你可以配置多种环境,但你只能为每个 SqlSessionFactory 实例选择一个。
所以,如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库 对应一个。而如果是三个数据库,你就需要三个实例,以此类推。记忆起来很简单:
transactionManager
在 MyBatis 中有两种事务管理器类型(也就是 type=”[JDBC|MANAGED]”): l JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得
到的连接来管理事务范围。 l MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让
容器来管理事务的整个生命周期(比如 Spring 或 JEE 应用服务器的上下文)。默认 情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止 它,将 closeConnection 属性设置为 false。
@font-face { font-family: "宋体"; }@font-face { font-family: "Cambria Math"; }@font-face { font-family: "@宋体"; }@font-face { font-family: "Calibri"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 12pt; font-family: Calibri; }h1 { margin: 17pt 0cm 16.5pt; text-align: justify; line-height: 240%; page-break-after: avoid; font-size: 22pt; font-family: Calibri; }.MsoChpDefault { font-family: Calibri; }div.WordSection1 { }
初始化配置文件
package org.zln.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; /** * Created by sherry on 16/7/15. */ public class DBAccess { private static Logger logger = LogManager.getLogger(DBAccess.class); private static final String myBatisConfStr = "mybatis-config.xml"; private static SqlSessionFactory sqlSessionFactory; static { try { /** * SqlSessionFactoryBuilder 一旦实例化出SqlSessionFactory后就没用了 * SqlSessionFactory 其生命周期应该是整个应用,因为要不停从中获获取SqlSession 最好的方式就是使用Spring容器,哪里使用哪里注入 */ sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(myBatisConfStr)); } catch (IOException e) { logger.error(e.getMessage(),e); } } public static SqlSession getSqlSession() throws IOException { /** * SQLSession * 每个线程都该有自己的SqlSession实例,它是线程不安全的,不能共享使用.所以SqlSession得最佳范围就应该是方法内,哪里使用哪里创建,创建完立马销毁 * 如果SqlSession如果被Spring管理,使用SqlSessionTemplate,则不需要,也不能人工close,具体原因百度:SqlSessionTemplate是否需要close */ return sqlSessionFactory.openSession(); } }