1.枚举类型typeHandler
在MyBatis中枚举类型的typeHandler有着自己的特殊的规则,MyBatis内部提供了两个转化枚举类型的typeHandler给我们使用:
org.apache.ibatis.type.EnumTypeHandler
它使用枚举字符串名称作为参数传递。
org.apache.ibatis.EnumOrdinalTypeHandler
它则使用整数下标作为参数传递。
这两个枚举类型应用的不是很广泛,更多的时候我们希望使用自定义的typeHandler去处理。
下面我们详细学习自定义枚举类的typeHandler:
自定义枚举类的typeHandler
我们可以参考自定义的typeHandler来定义其映射关系的规则:
我们有一个性别枚举类:
package com.Sex;
public enum Sex {
MALE(1,"男"),FEMALE(2,"女");
private int id;
private String name;
private Sex(int id,String name)
{
this.id=id;
this.name=name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Sex getSex(int id) {
if(id==1) {
return MALE;
}
else if(id==2) {
return FEMALE;
}
return null;
}
}
1)首先,我们要增加配置:
<typeHandler handler="com.SexEnumTypeHandler" javaType="com.Sex" />
2)然后给出SexEnumTypeHandler的定义如下:
package com.SexEnumTypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import com.Sex;
public class SexEnumTypeHandler implements TypeHandler<Sex>{
public Sex getResult(ResultSet rs,String name) throws SQLException{
int id=rs.getInt(name);
return Sex.getSex(id);
}
public Sex getResult(ResultSet rs,int index) throws SQLException{
int id=rs.getInt(index);
return Sex.getSex(id);
}
public Sex getResult(CallableStatement cs,int index) throws SQLException{
int id=cs.getInt(index);
return Sex.getSet(id);
}
public void setParamenter(PreparedStatement ps,int index,Sex sex,JdbcType jdbcType) throws SQLException{
ps.setInt(index,sex.getId());
}
}
最后我们在映射文件里设置相应的部分就可以使用了。
2.ObjectFactory元素
当MyBatis在构建一个结果返回的时候,都会使用ObjectFactory去构建POJO,在MyBatis中我们可以定制自己的对象工厂,一般来说我们使用默认的即可。(MyBatis中默认的ObjectFactory是由org.apache.ibatis.reflection.factory.DefaultObjectFactory来提供服务的)
如果我们要定制特定的工厂则需要进行配置:
<objectFactory type="com.MyObjectFactory">
<property name="name" value="MyObjectFactory" />
</objectFactory>
我们这里配置了一个对象工厂MyObjectFactory,对它的要求就是实现ObjectFactory的接口,实际上DefaultObjectFactory以及实现了此接口,我们可以继承它来简化开发:
package com.objectFactory;
import java.util.List;
import java.util.Properties;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.log4j.Logger;
public class MyObjectFactory extends DefaultObjectFactory{
private static final long serialVersionUID = -3814827216040286292L;
Logger log=Logger.getLogger(MyObjectFactory.class);
public void setProperties(Properties prprts){
log.info("定制属性:"+prprts);
super.setProperties(prprts);
}
public <T> T create(Class<T> type){
log.info("使用定制对象工厂的create方法构建单个对象");
return super.create(type);
}
public <T> T create(Class<T> type, List<Class<?>> List,List<Object> List1){
log.info("使用定制对象工厂的create方法构建列表对象");
return super.create(type,list,list1);
}
public <T> boolean isCollection(Class<T> type){
return super.isCollection(type);
}
}
上面是简单的测试看效果的。
3.environments配置环境
配置环境可以注册多个数据源,每一个数据源分为两大部分:
1.数据库源的配置
2.数据库事务的配置
例子:
<environments default="development">
<environment id="development">
<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>
environments中属性default,表明在缺省的情况下我们启用那个那个数据源配置。
environment元素是配置一个数据源的开始,属性id是设置这个数据源的标志。
transactionManager配置的是数据库事务,其中type属性有三种配置方式:
1.JDBC 2.MANAGED 3.自定义
dataSource标签,是配置数据源连接的信息,type属性是提供我们对数据库连接方式的配置,同样MyBatis提供了下面几种配置方式:
1.UNPOOLED 2.POOLED 3.JNDI 4.自定义
4.databaseIdProvider数据库厂商标识
MyBatis可能会运行在不同厂商的数据库中,它为此提供了一个数据库标识,并提供自定义,它的作用在于指定SQL到对应的数据库厂商提供的数据库中运行。
同样,它有使用系统默认规则和非系统默认规则,我们开始只了解前者:
1.使用系统默认规则
MyBatis提供的默认的配置规则如下:
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver">
<property name="MySQL" value="mysql">
<property name="DB2" value="db2">
<property name="Oracle" value="oracle">
</databaseIdProvider>
type="DB_VENDOR"是启动MyBatis内部注册的策略器。
首先MyBatis会将你的配置读入Configuration类里面,在连接数据库后调用getDatabaseProductName()方法去获取数据库的信息,然后用我们配置的name值去做匹配来得到DatabaseId.
我们也可以指定SQL在哪个数据库厂商执行,只需要把Mapper的XML配置修改以下即可:
<select id="getRole" parameterType="long" resultType="role" databaseId="mysql">
select id,role_name as roleName,note from t_role where id = #{id}
</select>
5.引入映射器
1).文件路径引入:
<mappers>
<mapper resource="mybaits\mapper\RoleMapper.xml"/>
</mappers>
2)用包名引入:
<mappers>
<packabe name="com.learn.chapter3.mapper"/>
</mappers>
3)用类注册引入映射器
<mappers>
<mapper name="com.learn.chapter3.mapper"/>
</mappers>
4)用userMapper.xml引入映射器
<mappers>
<mapper url="file:///mybaits\mapper\RoleMapper.xml"/>
</mappers>
我们可以根据实际需要选择恰当的引入方法。