Spring 集成 MyBatis
Spring 4.0 移除了对于 iBatis 的直接支持,由 MyBatis 自身提供整合支持,对于 MyBatis 来说,没有特别的事务管理策略,除了 JDBC Connectin 之外,没有其他特别的事务资源,因此和 Spring JDBC 事务管理的方式完全一致,采用相同的 DataSourceTransactionManager 事务管理器;
以下通过一个简单的示例演示 Spring + MyBatis + MySQL 的集成过程:
示例代码模块
:
site/assad/domain/User(领域对象)
site/assad/dao/UserDao(DAO对象)
site/assad/dao/mapper/UserMapper(MyBatis 映射方法接口)
site/assad/servcie/UserServcie(Service对象)
applicationContext.xml(spring 配置文件)
mybatis-config.xml(MyBatis 配置文件)
mapper/UserMapper.xml(MyBatis 实体映射配置文件)
领域对象
site.assad.domain.User 如下:
public class User implements Serializable{
private int id;
private String name;
private String password;
private Date createDate;
private String icon;
//getter,setter
}
Mybatis 部分的配置
同样创建 mybatis 配置文件,
不同的是不同配置数据源,这一部分由 Spring 配置:
mybatis-config.xml
<configuration>
<!--mybatis 全局配置-->
<settings>
<setting name="logImpl" value="LOG4J2" />
<setting name="lazyLoadingEnabled" value="false" />
</settings>
<!--引入实体映射配置文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml" />
</mappers>
</configuration>
创建针对 User 实体的映射配置文件
mapper/UserMapper.xml
<mapper namespace="site,assad.dao.mapper.UserDao">
<resultMap id="userMap" type="site.assad.domain.User">
<id property="id" column="user_id" />
<result property="name" column="user_name" />
<result property="password" column="user_password" />
<result property="createDate" column="create_date" />
<result property="icon" column="user_icon" />
</resultMap>
<select id="getUserById" resultMap="userMap">
select * from users where user_id = #{id}
</select>
<select id="getUserByName" resultMap="userMap">
select * from users where user_name = #{name}
</select>
<select id="getUserByIcon" resultMap="userMap">
select * from users where user_icon = #{icon}
</select>
</mapper>
创建mapper接口对象,
site.assad.dao.mapper.UserMapper
public interface UserMapper {
User getUserById(int id);
User getUserByName(String name);
List<User> getUserByIcon(String icon);
}
Spring 部分的配置
在 Spring 上下文配置文件中配置 MyBatis 数据源,模板引擎,事务管理器等,
applicationContext.xml
<beans ....>
<!--扫描bena-->
<context:component-scan base-package="site.assad.dao" />
<context:component-scan base-package="site.assad.service" />
<!--配置属性占位符空间-->
<context:property-placeholder location="classpath:jdbc.properties" />
<!--配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<!--配置 MyBatis 的 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="classpath:mybatis-config.xml" />
<!--配置SqlSessionTemplate-->
<bean class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory" />
</bean>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource" />
<!--自动扫描注解声明式事务管理切面-->
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />
</beans>
创建 DAO 类
mybatis 提供了 SqlSessionTemplate 模板类用于支持 Spring 风格产生 Mybatis SqlSesison 对象;
编写一个 User 实体的 DAO ,
site.assad.dao.UserDao
public class UserDao {
private SqlSessionTemplate sessionTemplate;
public User getUserById(final int id){
return sessionTemplate.getMapper(UserMapper.class).getUserById(id);
}
public User findUserByName(final String name){
return sessionTemplate.getMapper(UserMapper.class).getUserByName(name);
}
public List<User> findUserByIcon(final String icon) {
return sessionTemplate.getMapper(UserMapper.class).getUserByIcon(icon);
}
}