MyBatis配置学习二

1.枚举类型typeHandler
在MyBatis中枚举类型的typeHandler有着自己的特殊的规则,MyBatis内部提供了两个转化枚举类型的typeHandler给我们使用:

org.apache.ibatis.type.EnumTypeHandler
它使用枚举字符串名称作为参数传递。

org.apache.ibatis.EnumOrdinalTypeHandler
它则使用整数下标作为参数传递。

这两个枚举类型应用的不是很广泛,更多的时候我们希望使用自定义的typeHandler去处理。

下面我们详细学习自定义枚举类的typeHandler:

自定义枚举类的typeHandler

我们可以参考自定义的typeHandler来定义其映射关系的规则:

我们有一个性别枚举类:

package com.Sex;
public enum Sex {
	MALE(1,"男"),FEMALE(2,"女");
	private int id;
	private String name;
	
	private Sex(int id,String name)
	{
		this.id=id;
		this.name=name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	public static Sex getSex(int id) {
		if(id==1) {
			return MALE;
		}
		else if(id==2) {
			return FEMALE;
		}
		return null;
	}
}

1)首先,我们要增加配置:

<typeHandler handler="com.SexEnumTypeHandler" javaType="com.Sex" />

2)然后给出SexEnumTypeHandler的定义如下:

package com.SexEnumTypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import com.Sex;

public class SexEnumTypeHandler implements TypeHandler<Sex>{
   public Sex getResult(ResultSet rs,String name) throws SQLException{
      int id=rs.getInt(name);
      return Sex.getSex(id);
   }
   
   public Sex getResult(ResultSet rs,int index) throws SQLException{
     int id=rs.getInt(index);
     return Sex.getSex(id);
   }
   public Sex getResult(CallableStatement cs,int index) throws SQLException{
      int id=cs.getInt(index);
      return Sex.getSet(id);
   }

   public void setParamenter(PreparedStatement ps,int index,Sex sex,JdbcType jdbcType) throws SQLException{
    ps.setInt(index,sex.getId());
  }
}

最后我们在映射文件里设置相应的部分就可以使用了。

2.ObjectFactory元素
当MyBatis在构建一个结果返回的时候,都会使用ObjectFactory去构建POJO,在MyBatis中我们可以定制自己的对象工厂,一般来说我们使用默认的即可。(MyBatis中默认的ObjectFactory是由org.apache.ibatis.reflection.factory.DefaultObjectFactory来提供服务的)

如果我们要定制特定的工厂则需要进行配置:

<objectFactory type="com.MyObjectFactory">
   <property name="name" value="MyObjectFactory" />
</objectFactory>

我们这里配置了一个对象工厂MyObjectFactory,对它的要求就是实现ObjectFactory的接口,实际上DefaultObjectFactory以及实现了此接口,我们可以继承它来简化开发:

package com.objectFactory;
import java.util.List;
import java.util.Properties;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.log4j.Logger;

public class MyObjectFactory extends DefaultObjectFactory{
 private static final long serialVersionUID = -3814827216040286292L;
 Logger log=Logger.getLogger(MyObjectFactory.class);
 
 public void setProperties(Properties prprts){
   log.info("定制属性:"+prprts);
   super.setProperties(prprts);
 }

 public <T> T create(Class<T> type){
  log.info("使用定制对象工厂的create方法构建单个对象");
  return super.create(type);
 }

 public <T> T create(Class<T> type, List<Class<?>> List,List<Object> List1){
  log.info("使用定制对象工厂的create方法构建列表对象");
  return super.create(type,list,list1);
 }

 public <T> boolean isCollection(Class<T> type){
  return super.isCollection(type);
 }
}

上面是简单的测试看效果的。

3.environments配置环境

配置环境可以注册多个数据源,每一个数据源分为两大部分:
1.数据库源的配置
2.数据库事务的配置

例子:

<environments default="development">

     <environment id="development">
     
       <transactionManager type="JDBC">
         <property name="autoCommit" value="false"/>
       </transactionManager>
       
     
       <dataSource type="POOLED">
         
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
       </dataSource>
     
     </environment>
   </environments>

environments中属性default,表明在缺省的情况下我们启用那个那个数据源配置。

environment元素是配置一个数据源的开始,属性id是设置这个数据源的标志。

transactionManager配置的是数据库事务,其中type属性有三种配置方式:
1.JDBC 2.MANAGED 3.自定义

dataSource标签,是配置数据源连接的信息,type属性是提供我们对数据库连接方式的配置,同样MyBatis提供了下面几种配置方式:
1.UNPOOLED 2.POOLED 3.JNDI 4.自定义

4.databaseIdProvider数据库厂商标识

MyBatis可能会运行在不同厂商的数据库中,它为此提供了一个数据库标识,并提供自定义,它的作用在于指定SQL到对应的数据库厂商提供的数据库中运行。

同样,它有使用系统默认规则和非系统默认规则,我们开始只了解前者:

1.使用系统默认规则
MyBatis提供的默认的配置规则如下:

<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver">
  <property name="MySQL" value="mysql">
  <property name="DB2" value="db2">
  <property name="Oracle" value="oracle">
</databaseIdProvider>

type="DB_VENDOR"是启动MyBatis内部注册的策略器。
首先MyBatis会将你的配置读入Configuration类里面,在连接数据库后调用getDatabaseProductName()方法去获取数据库的信息,然后用我们配置的name值去做匹配来得到DatabaseId.

我们也可以指定SQL在哪个数据库厂商执行,只需要把Mapper的XML配置修改以下即可:

<select id="getRole" parameterType="long" resultType="role" databaseId="mysql">
    select id,role_name as roleName,note from t_role where id = #{id}
   </select>

5.引入映射器
1).文件路径引入:

<mappers>
    <mapper resource="mybaits\mapper\RoleMapper.xml"/>
</mappers>

2)用包名引入:

<mappers>
    <packabe name="com.learn.chapter3.mapper"/>
</mappers>

3)用类注册引入映射器

<mappers>
    <mapper name="com.learn.chapter3.mapper"/>
</mappers>

4)用userMapper.xml引入映射器

<mappers>
    <mapper url="file:///mybaits\mapper\RoleMapper.xml"/>
</mappers>

我们可以根据实际需要选择恰当的引入方法。

猜你喜欢

转载自blog.csdn.net/c1776167012/article/details/107248017