1. MyBatis入门
2. Mybatis配置
PS:XML文件的层次结构不能调到顺序,如果颠倒,会解析失败
2.1 properties配置
2.1.1 三种配置的方式及加载顺序
3. 通过程序加载
常用于对数据库密码进行解密,配置文件中配置密文,程序解析成明文之后再传给Mybatis
properties.setProperty("username", decode(properties.getProperty("username"))); properties.setProperty("password", decode(properties.getProperty("password"))); return new SqlSessionFactoryBuilder().build(congfigXMl, properties);
2.1.2 Mybatis中使用配置
使用${name}
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
2.2 setting 设置
用于设置Mybatis的行为,是Mybatis中最复杂的配置
2.3 typeAliases别名
给类的全限定名起别名,这样就可用很简短的名称去指代它
- Mybatis已经定义好了很多基本类型的别名
- java基本类型在前面加_ 就是其别名,在后面再[] 就是其数组类型 _int _int[]
- data[] 表示 java.util.Date[]
- 包装类型的别名为对应的基本类型 int 表示Integer
- map -> Map hashmap -> HashMap
- list -> List arraylist -> ArrayList
<typeAliases> <typeAlias alias="role" type="com.demo.mybatis.po.Role"/> <!--通过自动扫描方式 @Alias("role")--> <package name="com.demo.mybatis.po"/> </typeAliases>
2.4 typeHandler 类型处理器
- Mybatis在预处理语句(PreparedStatement)中设置一个参数,或者从结果集(ResultSet)中取一个值,都会用注册的typeHandler进行处理
- typeHandler的作用是 :Java类型(javaType)与JDBC类型(jdbcType)互转
- Mybatis已经提供了大量的类型处理器
- 自带的两种枚举类型Handler
- EnumTypeHandler (使用toString转化,默认方式)
- EnumOrdinalTypeHandler(序数转化)
- 自定义类型处理器:
public enum Male { MALE(2, "男"), FAMALE(3, "女"); private final static Map<Integer, Male> indexes = new HashMap<Integer, Male>(); static { for (Male male : Male.values()) { indexes.put(male.getCode(), male); } } public static Male getMale(int code) { return indexes.get(code); } private final int code; private final String desc; //get set }
// typeHandler
@MappedTypes({Male.class}) @MappedJdbcTypes({JdbcType.TINYINT}) public class MaleTypeHandler implements TypeHandler<Male> { public void setParameter(PreparedStatement preparedStatement, int i, Male male, JdbcType jdbcType) throws SQLException { preparedStatement.setInt(i, male.getCode()); } public Male getResult(ResultSet resultSet, String s) throws SQLException { return Male.getMale(resultSet.getInt(s)); } public Male getResult(ResultSet resultSet, int i) throws SQLException { return Male.getMale(resultSet.getInt(i)); } public Male getResult(CallableStatement callableStatement, int i) throws SQLException { return Male.getMale(callableStatement.getInt(i)); } }
// 配置Handler
<typeHandlers> <package name="com.demo.mybatis.handler"/> </typeHandlers>
//使用Handler
<resultMap id="roleMap" type="role"> <id column="id" property="id" javaType="int" jdbcType="INTEGER"/> <result column="role_name" property="roleName" jdbcType="VARCHAR" javaType="string"/> <!--<result column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>--> <result column="sex" property="sex" typeHandler="com.demo.mybatis.handler.MaleTypeHandler"/> </resultMap>
2.5 ObjectFactory
- 当Mybatis构建结果返回时,都会使用ObjectFactory(对象工厂)去构建POJO
- Mybatis默认使用DefaultObjectFactory
- 大部分时候不需要自己定义,使用系统默认的即可
- 自定义ObjectFactor
public class MyObjectFactory extends DefaultObjectFactory { @Override public void setProperties(Properties properties) { System.out.println("setProperties:" + properties); super.setProperties(properties); } @Override public <T> T create(Class<T> type) { System.out.println("create:" + type); return super.create(type); } @Override public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) { System.out.println("create:" + type + "," + constructorArgTypes + "," + constructorArgs); return super.create(type, constructorArgTypes, constructorArgs); } @Override public <T> boolean isCollection(Class<T> type) { System.out.println("isCollection:" + type); return super.isCollection(type); } }
(2)配置ObjecFactory
<objectFactory type="com.demo.mybatis.handler.MyObjectFactory"> <property name="name" value="MyObjectFactory"></property> //通过setProperties传到ObjectFactory </objectFactory>
2.6 environments 配置环境
配置环境可以注册多个数据源,每个数据源包含如下两个部分:
- transactionManager 事务管理
- dataSource 数据源配置
<environments default=""> 中的default标明在缺省时,将启用哪个数据源配置,值为 <environment id="">中的id
transactionManager 中的type有三种属性配置:
- JDBC,采用JDBC方式管理事务
- MANAGED,采用容器方式管理事务,在JNDI数据源中常用
- 自定义,适用于特殊应用
Mybatis提供的四种dataSource :
- UNPOOLED , 非数据库连接池 (UnpooledDataSource)
- POOLED , 连接池(PooledDataSource)
- JNDI,JNDI数据源 (JDNIDataSource)
- 自定义
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="autoCommit" value="false"></property> </transactionManager> <!-- 使用mybatis自己提供的数据源 <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> --> <dataSource type="com.demo.mybatis.handler.DBCPDataSourceFactory"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
public class DBCPDataSourceFactory implements DataSourceFactory { private Properties properties; public void setProperties(Properties properties) { this.properties = properties; } public DataSource getDataSource() { try { //使用apache的dbcp数据源 return BasicDataSourceFactory.createDataSource(properties); } catch (Exception e) { throw new RuntimeException(e); } } }