MyBatis(三) mybatis-config.xml元素说明、类型处理器typeHandler的使用

XML文件的层次结构

注意这些元素的层次的顺序是不能打乱,可以通过工具的提示来定义元素

MyBatis(三) mybatis-config.xml元素说明、类型处理器typeHandler的使用_第1张图片

properties元素

配置属性的元素

MyBatis提供了3种配置方式

* property子元素


		
        
        
        

可以在上下文中使用

 
        
        
        
        
      

*  properties配置文件

在源包下面定义一个jdbc.properties文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root

在使用properties元素引入这个文件,上下文中直接使用


        
        
        
        
      

* 作为构造参数传递

jdbc.properties文件的内容和上面一样,不过密码是加密过的,需要在创建SqlSessionFactory中解密,就需要手动创建,

并作为参数传递。

factory = new SqlSessionFactoryBuilder().build(inputStream, properties)
最后,上面的几种方式读取属性的优先级是从低到到。

settings元素

配置MyBatis的各种行为,不配置,MyBatis也能按照它的默认值正常运行

MyBatis(三) mybatis-config.xml元素说明、类型处理器typeHandler的使用_第2张图片

typeAliases元素

typeAliases元素用来配置别名,配置后可以在上下文中使用,别名是不区分大小写的,别名分为系统定义别名和自定义别名两类

1. 系统定义别名

基本类型的数据:  下划线+名称 -> 基本类型

MyBatis(三) mybatis-config.xml元素说明、类型处理器typeHandler的使用_第3张图片

包装类型/类类型: 名称->类类型

MyBatis(三) mybatis-config.xml元素说明、类型处理器typeHandler的使用_第4张图片

2.自定义别名

用来定义创建的pojo对象的别名

 
  	
  

如果有多个创建的对象,可以使用package元素扫包会自动生成别名,同时在类上加上@Alias注解

@Alias("student")
public class Student {
 
	
  

如果类上不加上注解@Alias也能够添加别名,按照首字母小写的规则生成,要注意别名冲突,

建议使用全路径+类名的方式定义别名

typeHandlers元素

MyBatis在和数据库交互时候,不管是将数据库里面的数据映射为Java类型的数据,还是将Java类型的数据映射为

数据库里面对应的字段类型,都会通过typeHandler进行处理。

typeHandler分为系统定义和用户自定义两种。

系统自定义的typeHandler在org.apache.ibatis.type包下面,可以自己指定对应的typeHandler并引入。

MyBatis(三) mybatis-config.xml元素说明、类型处理器typeHandler的使用_第5张图片

MyBatis(三) mybatis-config.xml元素说明、类型处理器typeHandler的使用_第6张图片

需要注意的是java.util.Date/java.sql.Timestamp类型的映射,数据库里面设置为timestamp是可以的。

* 数值类型的精度,数据库int,bigdecimal这些类型和java的精度、长度都是不同。

* 如果日期精确到日,类型处理器选择DateOnlyTypeHandler,如果精确到秒,处理器选择SqlTimestampTypeHandler

如何指定类型处理器


  	
  

自定义类型处理器

1. 创建一个类,继承BastTypeHandler或者实现TypeHandler接口

@MappedTypes(value={String.class}) //指定javatype
@MappedJdbcTypes(value={JdbcType.VARCHAR}) //指定jdbctype
public class MyStringTypeHandler extends BaseTypeHandler{

2. 注册它. 指定javatype和jdbctype


	

3. 使用.指定javatype和jdbctype


  	
 

枚举类型typeHandler

MyBatis提供了两个转化枚举类型的typeHandler

* org.apache.ibatis.type.EnumTypeHandler,是以枚举字符串作为参数传递的

* org.apache.ibatis.type.EnumOridinalTypeHandler,是以枚举下标作为参数传递的

如何使用

1. 定义一个枚举类

public enum Sex {
	MALE(1,"男"),FEMALE(0,"女");
	private int i;
	private String name;
	private Sex(int i,String name){
		this.i = i;
		this.name = name;
	}
	public int getI() {
		return i;
	}
	public void setI(int i) {
		this.i = i;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public static Sex getSex(int i ){
		if(i==1){
			return MALE;
		}else if(i==0){
			return FEMALE;
		}else{
			return null;
		}
	}
}

2. 注册(因为使用系统的typeHandler可以不注册)

3.在mapper.xml中配置

* 如果是查询,将数据库中的数据映射为java对象,需要在resultMap中指定使用到的typeHandler

* 如果是向数据库中插入数据,需要#{name,typeHandler=指定的类加载器的全路径}

* 查询使用了resultMap进行了映射,因而查询的列,不用再使用别名,因为在resultMap已经进行了配置映射。




 
  	
  	
  	
  	
  
  
   insert into student_info (stu_age,stu_sex,stu_name) values 
   (#{stuAge},#{stuSex,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},#{stuName})
  
  

3. 调用方法测试

* insert方法

StudentMapper mapper = (StudentMapper) session.getMapper(StudentMapper.class);
Student stu = new Student();
stu.setStuAge(100);
stu.setStuName("张三丰");
stu.setStuSex(Sex.MALE);
mapper.insertStudent(stu);

插入到数据库的是枚举数组的下标索引,也就是性别字段的值是0


EnumTypeHandler 的使用类似,不过数据库中以字符串进行存放枚举类型,需要修改resultMap中jdbcType


自定义枚举映射器

很多的情况,需要入库的是枚举id,查询出来的是枚举的name,此时系统的typeHandler无法满足需求,自定义一个

@MappedJdbcTypes(value={JdbcType.TINYINT})
@MappedTypes(value={Sex.class})
public class MyEnumTypeHandler implements TypeHandler {
	@Override
	public void setParameter(PreparedStatement paramPreparedStatement,
			int paramInt, Sex paramT, JdbcType paramJdbcType)
			throws SQLException {
		paramPreparedStatement.setInt(paramInt, paramT.getI());
	}
	@Override
	public Sex getResult(ResultSet paramResultSet, String paramString)
			throws SQLException {
		return Sex.getSex(paramResultSet.getInt(paramString));
	}
	@Override
	public Sex getResult(ResultSet paramResultSet, int paramInt)
			throws SQLException {
		return Sex.getSex(paramResultSet.getInt(paramInt));
	}
	@Override
	public Sex getResult(CallableStatement paramCallableStatement, int paramInt)
			throws SQLException {
		return Sex.getSex(paramCallableStatement.getInt(paramInt));
	}
}
ObjectFactory

当MyBatis在构建一个结果返回的时候,都会使用对象工程生产pojo对象,只需要使用默认的就行。

如果需要自定义只要继承 org.apache.ibatis.reflection.factory.DefaultObjectFactory,并在mybatis-config中配置。

environment配置环境

配置环境配置多个数据源,每个数据源主要是事务和数据源的连接信息配置。


    
      
      
      	
      
      
      
        
        
        
        
      
    

* environments 的default属性表示 默认使用哪个数据源

* environment 的 id属性唯一标识一个数据源

* 事务配置

1. jdbc 事务

2. MANAGED容器管理事务

3. 自定义事务

数据源配置DataSource元素

type属性配置为三种,POOLED(连接池数据库),UNPOOLED(非连接池数据库),JDNI(JNDI数据源)

databaseIdProvider元素

表名数据库的厂商标识

你可能感兴趣的:(MyBatis)