1. 基本用法
开发流程:
(1)配置好MyBatis
主要就是需要配置好数据源以及告诉MyBatis持久化类的映射文件mapper.xml哪里找。MyBatis默认的配置文件名称是mybatis-config.xml,在最开始的示例中我们将MyBatis的配置放在了applicationContext.xml中,这也是可以的。
传统简单配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- XML 配置文件包含对 MyBatis 系统的核心设置 -->
<configuration>
<properties resource="db.properties"/>
<!-- 指定 MyBatis 所用日志的具体实现 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 设置别名 -->
<typeAliases>
<typeAlias alias="user" type="org.fkit.domain.User"/>
</typeAliases>
<environments default="mysql">
<!-- 环境配置,即连接的数据库。 -->
<environment id="mysql">
<!-- 指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
<transactionManager type="JDBC"/>
<!-- dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
<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>
<!-- mappers告诉了MyBatis去哪里找持久化类的映射文件 -->
<mappers>
<mapper resource="org/fkit/mapper/UserMapper.xml"/>
</mappers>
</configuration>
注解模式下的高级配置:
<!-- mybatis:scan会扫描org.fkit.dao包里的所有接口当作Spring的bean配置,之后可以进行依赖注入-->
<mybatis:scan base-package="org.fkit.hrm.dao"/>
<!-- 扫描org.fkit包下面的java文件,有Spring的相关注解的类,则把这些类注册为Spring的bean -->
<context:component-scan base-package="org.fkit.hrm"/>
<!-- 使用PropertyOverrideConfigurer后处理器加载数据源参数 -->
<context:property-override location="classpath:db.properties"/>
<!-- 配置c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"/>
<!-- 配置SqlSessionFactory,org.mybatis.spring.SqlSessionFactoryBean是Mybatis社区开发用于整合Spring的bean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"/>
<!-- JDBC事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
<!-- 启用支持annotation注解方式事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
(2)根据数据中的表,定义好领域模型
这里不赘述,只强调一点,属性都要用对象类型,不要用基础类型。
(3)定义Mapper XML文件
<mapper namespace="org.fkit.mapper.OrderMapper">
<insert id="saveUser" parameterType="user"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO TB_USER(name,sex,age)
VALUES(#{name},#{sex},#{age})
</insert>
</mapper>
- namespace:全局要唯一
- id:mapper的id。
- parameterType:表示执行这条语句的时候需要一个User类型的对象作为参数。
- useGeneratedKeys:使用数据库的自动增长主键,建议对MySQL开启。
- keyProperty:将数据库生成的主键设置到user对象的id属性中去,从而在代码中,执行完这条SQL,user实例的id就被赋值了,可以读取。
#{name}
:当parameterType是基础类型的时候,这里读取的就是入参;当parameterType是一个对象类型的时候,这里读取的就是对象的属性。
(4)使用SqlSession执行mapper
获取SqlSession分为三步:
- 读取mybatis-config.xml文件;
- 创建一个SqlSessionFactory;
- 使用SqlSessionFactory获取一个SqlSession;
考虑到SqlSessionFactory需要频繁使用,我们可以把它写成一个单例模型:
public class FKSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory = null;
// 初始化创建SqlSessionFactory对象
static{
try {
// 读取mybatis-config.xml文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取SqlSession对象的静态方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
// 获取SqlSessionFactory的静态方法
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
执行可以这样写:
public static void main(String[] args) throws Exception {
// 获得Session实例
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 创建User对象
User user = new User("jack", "男", 22);
// 插入数据
session.insert("org.fkit.mapper.UserMapper.saveUser", user);
// 提交事务
session.commit();
// 关闭Session
session.close();
}
2. 深入用法
2.1 Mapper接口的代理对象
MyBatis官方手册建议通过mapper接口的代理对象执行SQL操作,该对象关联了SqlSession对象,开发者可以通过该对象直接调用方法操作数据库。
public interface OrderMapper {
Order selectOrderByUserId(int id);
}
和下面这句mapper对应:
<select id="selectOrderByUserId" parameterType="int"