MyBatist配置文件学习记录

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&amp;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"/>

还有下一篇Mybatis 学习记录,未完待续 。。。

猜你喜欢

转载自blog.csdn.net/qq_37040173/article/details/85045982
今日推荐