4.1 概述
配置文件包含的内容(必须按顺序排列)
<?xml version="1.0" encodeing="utf-8">
<configuration> <!--配置项-->
<properties/> <!--属性-->
<settings/> <!--设置-->
<typeAlias/> <!--别名设置-->
<typeHandlers/> <!--类型转化-->
<objectFactory/> <!--对象工厂 -->
<plugins/><!--插件 -->
<enviroments> <!--环境配置 -->
<enviroment> <!--环境变量 -->
<transactionManager/><!--事务管理器 -->
<dataSource/> <!-- 数据源 -->
<enviroment/>
<enviroments/>
<databaseIdProvider/><!--数据库厂商标识 -->
<mappers/> <!--映射器 -->
<configuration>
------------------------------------------------------------------
4.2. properties属性配置
该节点主要配置系统运行参数,样式分为xml和properties文件两种,“解耦”,改变这里的配置参数不需要重新编译java代码,优点是隔离变化。Mybatis提供了三种方式进行配置:properties文件,property子元素,程序代码设置
1.1 property子元素 一般格式是: <properties> <property name="" value="" /> ... <properties/>
如何应用这些配置信息呢?举个栗子,可以在 节点进行变量调用。
1.2 使用properties文件
该文件结尾是".properties",文件内容主要是一些键值对,示例:
定义逻辑的格式: database.driver= com.mysql.jdbc.Driver
database.username= gallery
database.password = root
调用属性文件的格式: ,也可以按照格式${dabase.driver}去掉用属性。
1.3 使用程序传递格式
这种格式的第一步是,创建一个properties文件,然后通过mybatis自带的类Properties创建对象进行配置信息读取:
InputStream inputStream2 = Resources.getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
try {
properties.load(inputStream2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String goal = properties.getProperty("yourGoal");
String faith = properties.getProperty("yourFaith");
*******************
小结:三种配置方式有优先级之分,程序设置最高,使用property元素最低,高优先级设置会覆盖低优先级的。一般来说,推荐使用XML文件和properties文件的形式去配置。
------------------------------------------------------------------
4.3 settings 设置
settings设置是最复杂的设置,它会影响到mybatis底层设置,一般情况下,使用默认配置就好。关于settings配置项,可以到网上自行百度。常用配置项是,关于缓存的cacheEnabled,关于级联的lazyLoadingEnabled和aggressiveLazyLoading。
------------------------------------------------------------------
4.4 typeAlias
由于类的全限定名比较长,mybatis允许定义一个简写来代表这个类。别名分为系统自定义别名和自定义别名。mybatis中别名由TypeAliasRegistry,别名不区分大小写。
简单列出几个系统自定义的别名:
别名 Java类型 是否支持数组
_byte byte 是
_long long 是
byte Byte 是
string String 是
decimal BigDecimal 是
collection Collection 否
map Map 否
MyBatis底层是如何实现别名记录的呢?请看部分源代码。
public TypeAliasRigistry(){
registerAlias(“byte”,Byte.class);
registerAlias(“map”,Map.class);
…
}
因此,一般使用TypeAliasRegistry类的registerAlias() 方法就可以注册别名了。
自定义别名:方式一是使用 ;方式二是利用mybatis支持包扫描这个特点, .
如果出现了别名冲突,可以考虑使用注解法进行区分,在pojo那个类的头部标注为:@Alias(“user2”).
------------------------------------------------------------------
4.5 TypeHandler 类型转化器
TypeHandler充当了JavaType与JDBC类型的转化器角色。
1.1系统自定义的TypeHandler
在mybatis中的typeHandler都必须实现接口TypeHandler,该接口的定义如下:
public interface TypeHandler<T>{
void setParameter(PreparedStatement st,int i,T parameter,jdbcType jdbcType) throws SQLException ;
T getResult(ResultSet rs, String columnName)throws SQLException;;
T getResult(ResultSet rs, int columnIndex) throws SQLException;;
T getResult(CallableStatement cs,int columnIndex) throws SQLException;
}
事实上是,mybatis的typeHandler都继承了类BaseTypeHandler,该类的定义如下:
public abstract class BaseTypeHandler extends TypeReference implements TypeHandler {
;//这里不再解释具体的代码,要求能看懂就好
}
来参看最常用的StringTypeHandler是如何定义的:
public class StringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullableParameter(PreparedStatement ps ,int i,String parameter,jdbcType jdbcType)throws SQLException{
ps.getString(i,parameter);
}
@Override
public String getNullableResult(ResultSet rs,String columnName)throws SQLException{
return rs.getString(columnName);
}
@Override
public String getNullableResult(ResultSet rs,int columnIndex)throws SQLException{
return rs.getString(columnIndex);
}
@Override
public String getNullableResult(CallableStatement rs,int columnIndex)throws SQLException{
return cs.getString(columnIndex);
}
}
1.2 自定义typeHandler
系统自定义的typeHandler已经够用,自定义的大多应用于枚举类型。
public class MyTypeHandler implements TypeHandler{
Logger Logger = Logger.getLogger(MyTypeHandler.class);
@Override
public String getResult(ResultSet arg0, String arg1) throws SQLException {
return arg0.getString(arg1);
}
@Override
public String getResult(ResultSet arg0, int arg1) throws SQLException {
return arg0.getString( arg1);
}
@Override
public String getResult(CallableStatement arg0, int arg1) throws SQLException {
return arg0.getNString(arg1);
}
@Override
public void setParameter(PreparedStatement arg0, int arg1, String arg2, JdbcType arg3) throws SQLException {
arg0.setString(arg1, arg2);
}
}
启用这个typeHandler,需要去xml配置:
<typeHandlers>
<typeHandler jdbcType="VARCHAR" javaType="String" handler="com.bert.chapter4.MyTypeHandler" />
</typeHandlers>
------------------------------------------------------------------
4.8 environment(运行环境)
作用是配置数据库信息,有两个子节点,其一是数据源配置,其二是事务管理器配置。Spring会去管理事务,一般不在Mybatis配置。
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&serverTimezone=UTC" />
<property name="username" value="${database.username}" />
<property name="password" value="eecs1028" />
</dataSource>
4.8.1.事务管理器 事务管理器是一个接口,定义了五个方法。
public interface Transaction{
public void commit() throws SQLException;
public void rollback() throws SQLException;
public void close() throws SQLException;
public Connection getConnection() throws SQLException;
public Integer getTimeout() throws SQLException; }
提供了两个实现类:JDBCTransactionFactory,ManagedTransactionFactory.具体细节请百度学习。
如果不想使用Mybatis自带的规则,可以自定义,步骤如下:
1.声明XML配置.
2.新建一个自定义的MyTransaction,代码如下:
3.自定义工厂方法类MyTransactionFactory,管理MyTransaction。
public class MyTransaction extends JDBCTransaction implements Transaction {
public MyTransaction(Connection connection) {
super(connection);
}
public MyTransaction(DataSource ds,TransactionIsolationLevel level,boolean desiredAutoCommit) {
super(ds,level,desiredAutoCommit);
}
@Override
public Connection getConnection() throws SQLException{
return super.getConnection();
}
@Override
public Integer getTimeout() throws SQLException{
return super.getTimeout();
}
@Override
public void commit() throws SQLException{
super.commit();
}
@Override
public void close() throws SQLException{
super.close();
}
@Override
public void rollback() throws SQLException{
super.rollback();
}
}
------------类说明部分:这个类定义了5个事务方法,定义了两个构造方法.-----------------------
---------------------------*********---------------------------
public class MyTransactionFactory implements TransactionFactory {
@Override
public Transaction newTransaction(Connection arg0) {
// TODO Auto-generated method stub
return new MyTransaction(arg0);
}
@Override
public Transaction newTransaction(DataSource arg0, TransactionIsolationLevel arg1, boolean arg2) {
// TODO Auto-generated method stub
return new MyTransaction(arg0,arg1,arg2);
}
@Override
public void setProperties(Properties arg0) {
// TODO Auto-generated method stub
;
}
}
//----类说明:这个工厂类只是一个转发者,调用的还是MyTransaction的两个构造方法
4.8.2 数据源环境配置 environment
1.UnPooled 非数据库池管理
这种管理方式,每次请求都会创建一个新的连接,所以相对耗时较长,性能要求不高的场合可以使用。需要如下配置:
driver驱动名;URL连接,username,password,defaultTransactionIsolationLevel事务隔离级别。
----------------------------–
2.POOLED 池化管理
初始状态允许一些空置的连接,请求时无需验证和新建。可以控制最大连接数,避免过多连接导致系统瓶颈。如下配置:
poolMaximumActiveConnections 正在使用的连接数量,默认是10;
poolMaximunIdelConnections 任意时间可能存在的连接数
poolTimeToWait 默认连接超时时长,默认20秒
等等,BAIDU。
----------------------------–
3.JNDI
数据源JNDI的实现是为了能在EJB或应用服务器这类容器中使用,容器可以集中或者在外部进行数据源配置,然后放到一个JNDI上下文去引用,具体请百度
----------------------------–
4.自定义数据源
这里以DBCP数据源为例子,两个步骤,更改XML文件中属性,写自定义工厂类。
属性内容不变。
-------******----------
public class DbcpDataSourceFactory implements DataSourceFactory {
private Properties props =null;
@Override
public DataSource getDataSource() {
DataSource dataSource = null;
/*
* This needs a package :org.apache.commons.dbcp2.BasicDataSourceFactory.
try {
dataSource = BasicDataSourceFactory.createDataSource(props);
}catch(SQLException e) {
e.printStackTrace();
}
*/
return dataSource;
}
@Override
public void setProperties(Properties arg0) {
this.props = arg0;
}
}
-----------------------------------------------------------------
4.9 databaseIdProvider 数据库厂商标识
主要用来支持多种不同厂商的数据库。
-----------------------------------------------------------------
4.10 引入映射器的方法
首先是需要定义一个接口,其次使用XML文件定义映射规则和SQL语句。
引入映射器的方法主要有:
1.使用文件路径resource逐个引入
<mappers>
<mapper resource="com/bert/chapter/mapper/roleMapper" />
</mappers>
2.使用接口所在包名name成批引入
<mapper name="com.bert.chapter.mapper"/>
3.使用类注册 class
<mapper class="com.bert.chapter.mapper.roleMapper"/>
4.使用URL连接引入
<mapper url="file:///var/mappers/com/bert/chapter/mapper/rolemapper"/>