使用SqlSession获取映射器进行操作
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
SqlSession
SqlSession 的实例不是线程安全的,因此是不能被共享的。
SqlSession每次使用完成后需要正确关闭,这个关闭操作是必须的
SqlSession可以直接调用方法的id进行数据库操作,推荐使用SqlSession获取到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作.
MyBatis-全局配置文件
官方配置文档说明
http://www.mybatis.org/mybatis-3/zh/configuration.html
properties属性
1 在properties 元素体内指定的属性首先被读取。
2 然后根据properties 元素中的resource 属性读取类路径下属性文件或根据url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
3 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
引入资源:
<properties resource="dbconfig.properties"></properties>
然后就可以使用公用的数据库配置:
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
Settings
这是MyBatis 中极为重要的调整设置,它们会改变MyBatis 的运行时行为。
autoMappingBehavior:开启自动映射的功能,默认是PARTIAL,null表示取消自动映射。
mapUnderscoreToCamelCase:开启自动驼峰命名规则映射功能。
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
typeAliases别名处理器
类型别名是为Java 类型设置一个短的名字,我们可以方便引用这个类。
<typeAliases>
<!-- 1、typeAlias:为某个java类型起别名
type:指定要起别名的类型全类名;默认别名就是类名小写;employee
alias:指定新的别名
-->
<typeAlias type="com.mybatis.bean.Employee" alias="emp"/>
<!-- 2、package:为某个包下的所有类批量起别名
name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
-->
<package name="com.mybatis.bean"/>
</typeAliases>
<!--3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名 -->
@Alias("emp")
public class Employee {
}
类型别名
MyBatis已经为许多常见的Java 类型内建了相应的类型别名,它们都是大小写不敏感的。
typeHandlers类型处理器
无论是MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java 类型。
自定义类型处理器
1、实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
2、指定其映射某个JDBC类型(可选操作)
3、在mybatis全局配置文件中注册
public class EmpStatusTypeHandler implements TypeHandler<EmpStatus> {
/**
* 定义当前数据如何保存到数据库中
*/
@Override
public void setParameter(PreparedStatement ps, int i, EmpStatus parameter,
JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.getCode().toString());
}
@Override
public EmpStatus getResult(ResultSet rs, String columnName)
throws SQLException {
// TODO Auto-generated method stub
//需要根据从数据库中拿到的枚举的状态码返回一个枚举对象
int code = rs.getInt(columnName);
EmpStatus status = EmpStatus.getEmpStatusByCode(code);
return status;
}
@Override
public EmpStatus getResult(ResultSet rs, int columnIndex)
throws SQLException {
// TODO Auto-generated method stub
int code = rs.getInt(columnIndex);
EmpStatus status = EmpStatus.getEmpStatusByCode(code);
return status;
}
@Override
public EmpStatus getResult(CallableStatement cs, int columnIndex)
throws SQLException {
// TODO Auto-generated method stub
int code = cs.getInt(columnIndex);
EmpStatus status = EmpStatus.getEmpStatusByCode(code);
return status;
}
}
<typeHandlers>
<!--1、配置我们自定义的TypeHandler -->
<typeHandler handler="com.mybatis.typehandler.EmpStatusTypeHandler" javaType="com.mybatis.bean.EmpStatus"/>
</typeHandlers>
<!--2、也可以在处理某个字段的时候告诉MyBatis用什么类型处理器
保存:#{empStatus,typeHandler=xxxx}
如果在参数位置修改TypeHandler,应该保证保存数据和查询数据用的TypeHandler是一样的。
<resultMap type="com.mybatis.bean.Employee" id="MyEmp">
<id column="id" property="id"/>
<result column="empStatus" property="empStatus" typeHandler=""/>
</resultMap>
environments环境
MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置。
每种环境使用一个environment标签进行配置并指定唯一标识符。
可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境。
id:指定当前环境的唯一标识
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
<environment id="oracle">
</environment>
</environments>
transactionManager
type:JDBC | MANAGED | 自定义
JDBC:使用了JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。JdbcTransactionFactory
MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如JEE 应用服务器的上下文)。ManagedTransactionFactory
自定义:实现TransactionFactory接口,type=全类名/别名
dataSource
type:UNPOOLED | POOLED | JNDI | 自定义
–UNPOOLED:不使用连接池,UnpooledDataSourceFactory
POOLED:使用连接池,PooledDataSourceFactory
JNDI:在EJB 或应用服务器这类容器中查找指定的数据源
自定义:实现DataSourceFactory接口,定义数据源的获取方式。
databaseIdProvider
MyBatis 可以根据不同的数据库厂商执行不同的语句。
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
Type:DB_VENDOR
使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也可以实现DatabaseIdProvider接口来自定义。
name:数据库厂商标识
value:为标识起一个别名,方便SQL语句使用databaseId属性引用
mapper映射
逐个注册的三种方式:
<mappers>
<mapper resource="EmployeeMapper.xml" />
<mapper class="com.mybatis.dao.EmployeeMapper"/>
<mapper url="file:///D:/EmployeeMapper.xml"/>
</mappers>
批量注册:
<mappers>
<package name="com.mybatis.dao"/>
</mappers>