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

XML文件的层次结构

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


properties元素

配置属性的元素

MyBatis提供了3种配置方式

* property子元素

<properties>
		<property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
</properties>

可以在上下文中使用

 <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>

*  properties配置文件

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

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

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

<properties resource="jdbc.properties"></properties>
<dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>

* 作为构造参数传递

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

并作为参数传递。

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

settings元素

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


typeAliases元素

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

1. 系统定义别名

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

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


2.自定义别名

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

 <typeAliases>
  	<typeAlias alias="student" type="cn.bing.pojo.Student"/>
  </typeAliases>

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

@Alias("student")
public class Student {
 <typeAliases>
	<package name="cn.bing.pojo"/>
  </typeAliases>

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

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

typeHandlers元素

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

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

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

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



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

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

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

如何指定类型处理器

<resultMap type="student" id="studentMap">
  	<result column="o_date" property="oDate" javaType="java.sql.Timestamp" jdbcType="TIMESTAMP"
  	typeHandler="org.apache.ibatis.type.SqlTimestampTypeHandler"/>
  </resultMap>

自定义类型处理器

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

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

2. 注册它. 指定javatype和jdbctype

<typeHandlers>
	<typeHandler javaType="String" jdbcType="VARCHAR" handler="cn.bing.typeHandler.MyStringTypeHandler"/>
</typeHandlers>

3. 使用.指定javatype和jdbctype

<resultMap type="student" id="studentMap">
  	<result column="stu_name" property="stuName" javaType="string" jdbcType="VARCHAR"
  	typeHandler="cn.bing.typeHandler.MyStringTypeHandler"/>
 </resultMap>

枚举类型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已经进行了配置映射。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bing.mapper.StudentMapper">
 <resultMap type="cn.bing.pojo.Student" id="studentMap">
  	<id column="stu_id" property="stuId"/>
  	<result column="stu_age" property="stuAge"/>
  	<result column="stu_sex" property="stuSex" 
  	jdbcType="TINYINT" 
  	javaType="cn.bing.pojo.Sex" 
  	typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
  	<result column="stu_name" property="stuName"/>
  </resultMap>
  <insert id="insertStudent" parameterType="student">
   insert into student_info (stu_age,stu_sex,stu_name) values 
   (#{stuAge},#{stuSex,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},#{stuName})
  </insert>
  <select id="queryStudentInfo" resultMap="studentMap" parameterType="_int">
    select  stu_id, stu_Age,stu_Sex, stu_Name 
    from student_info where stu_id = #{id}
  </select>
</mapper>

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<Sex> {
	@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="development">
    <environment id="development">
      <!-- 采用JDBC的事务管理方式 -->
      <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 的default属性表示 默认使用哪个数据源

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

* 事务配置

1. jdbc 事务

2. MANAGED容器管理事务

3. 自定义事务

数据源配置DataSource元素

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

databaseIdProvider元素

表名数据库的厂商标识

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值