注意这些元素的层次的顺序是不能打乱,可以通过工具的提示来定义元素
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也能按照它的默认值正常运行
typeAliases元素
typeAliases元素用来配置别名,配置后可以在上下文中使用,别名是不区分大小写的,别名分为系统定义别名和自定义别名两类
1. 系统定义别名
基本类型的数据: 下划线+名称 -> 基本类型
包装类型/类类型: 名称->类类型
2.自定义别名
用来定义创建的pojo对象的别名
如果有多个创建的对象,可以使用package元素扫包会自动生成别名,同时在类上加上@Alias注解
@Alias("student")
public class Student {
如果类上不加上注解@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
如何指定类型处理器
自定义类型处理器
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元素
表名数据库的厂商标识