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

xiaoxiao2021-02-28  92

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元素

表名数据库的厂商标识

转载请注明原文地址: https://www.6miu.com/read-2300363.html

最新回复(0)