注意这些元素的层次的顺序是不能打乱,可以通过工具的提示来定义元素
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元素
表名数据库的厂商标识