MyBatis-Spring 学习

joy2wd 贡献于2012-08-31

作者 temp  创建于2012-07-03 09:02:00   修改者temp  修改于2012-07-10 02:38:00字数10434

文档摘要:什么是MyBatis-Spring?用来整合MyBatis到Spring中。MyBatis的工厂类(如SqlSessionFactory类),sqlSession类,mapper类等,以及MyBatis的配置信息,都由Spring来加载并管理,同时,MyBatis的事务处理也由Spring来代理。也就是说,普通方式的MyBatis很难和应用去集成,并且管理事务,以及session的创建和维护等,Spring提供了这样一种方式,使得集成MyBatis、管理事务以及session的创建更加方便和自动化。快速集成要和Spring一起使用MyBatis,你需要在Spring应用上下文中定义至少两样东西:一个SqlSessionFactory和至少一个数据映射器类。
关键词:

MyBatis-Spring学习 2012-07-04 什么是MyBatis-Spring? 用来整合MyBatis到Spring中。MyBatis的工厂类(如SqlSessionFactory类),sqlSession类,mapper类等,以及MyBatis的配置信息,都由Spring来加载并管理,同时,MyBatis的事务处理也由Spring来代理。 也就是说,普通方式的MyBatis很难和应用去集成,并且管理事务,以及session的创建和维护等,Spring提供了这样一种方式,使得集成MyBatis、管理事务以及session的创建更加方便和自动化。 1. 快速集成 要和Spring一起使用MyBatis,你需要在Spring应用上下文中定义至少两样东西:一个SqlSessionFactory和至少一个数据映射器类。 SqlSessionFactoryBean MapperFactoryBean MapperFactoryBean处理SqlSession的创建和关闭它 public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{userId}") User getUser(@Param("userId") String userId); } public class FooServiceImpl implements FooService { private UserMapper userMapper; public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } public User doSomeBusinessStuff(String userId) { return this.userMapper.getUser(userId); } } 2. SqlSessionFactoryBean SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); SqlSessionFactory sessionFactory = factoryBean.getObject(); 属性 dataSource, configLocation,mapperLocations dataSource JDBC DataSource configLocation 该属性用来指定MyBatis的XML配置文件路径,跟Spring整合时,编写MyBatis映射文件的目的无非是配置一下typeAlias、setting之类的元素。不用在其中指定数据源,或者事务处理方式。就算配置了也会被忽略。因为这些都是使用Spring中的配置。当然如果你不打算添加typeAlias 之类的设置的话,你连MyBatis的配置文件都不用写,更不用配置这个属性了。 mapperLocations MyBatis 的Mapper映射文件配置有两种选择: 第一是手动在MyBatis的XML配置文件中使用部分来指定类路径。 第二是使用工厂bean的mapperLocations属性。 该属性用来指定Mapper映射文件的位置,如果映射文件与相应的接口同名,且在同一路径下,那么可以不配置该选项。 如果Mapper映射文件在属性“configLocation”指定的MyBatis配置文件中已经通过标签指定了,那么此处也可以不配置该选项。 3. 事务 标准配置 DataSourceTransactionManager 容器管理事务 JtaTransactionManager ManagedTransactionFactory 4. SqlSession 线程安全的SqlSession SqlSessionTemplate SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。 public class UserDaoImpl implements UserDao { private SqlSession sqlSession; public void setSqlSession(SqlSession sqlSession) { this.sqlSession = sqlSession; } public User getUser(String userId) { return (User) sqlSession.selectOne ("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId); } } public void insertUsers(User[] users) { SqlSession sqlSession = getSqlSession(); for (User user : users) { sqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser", user); } } SqlSessionDaoSupport Or public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { public User getUser(String userId) { return (User) getSqlSession() .selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId); } } 5. 注入映射器 MapperFactoryBean直接注入数据映射器接口到你的service层bean中 MapperFactoryBean public class FooServiceImpl implements FooService { private UserMapper userMapper; public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } public User doSomeBusinessStuff(String userId) { return this.userMapper.getUser(userId); } } MapperScannerConfigurer MapperFactoryBeans @Component org.springframework.stereotype.Component 6. 使用MyBatis API public class UserMapperSqlSessionImpl implements UserMapper { // SqlSessionFactory会通常由SqlSessionDaoSupport来设置 private SqlSessionFactory sqlSessionFactory; public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } public User getUser(String userId) { // 注意标准的MyBatis API用法 – 手动打开和关闭session SqlSession session = sqlSessionFactory.openSession(); try { return (User) session.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId); } finally { session.close(); } } } 不推荐以上用法! 7. 示例 @Transactional public interface FooService { User doSomeBusinessStuff(String userId); } public class FooServiceImpl implements FooService { private UserMapper userMapper; public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } public User doSomeBusinessStuff(String userId) { return this.userMapper.getUser(userId); } } 总结 Spring与MyBatis的集成主要解决如下三个问题: 1. SqlSessionFactory的注册及维护 2. Mapper和Mapper xml 的注册及维护 3. TransactionManager的注册及维护 SqlSessionFactory的注册 通常的做法是在Spring配置文件中做如下配置: 即sqlSessionFactory的实例化由SqlSessionFactoryBean来负责,其中dataSource为通过Spring创建的任意JDBC DataSource。 TransactionManager的注册 事务管理有标准的事务管理和容器管理的事务(如JTA)。标准的事务管理配置如下: 即transactionManager的实例化由DataSourceTransactionManager来负责,其中dataSource为通过Spring创建的任意JDBC DataSource。 通常情况下spring管理下的事务控制是在注入了mapper的service层。即由SqlSessionTemplate(sqlSession去维护) Mapper的注册和Mapper xml 的加载 Mapper的注册有2中方式: 1. 包扫描的方式 即由MapperScannerConfigurer来负责扫描指定包下面的所有mapper并进行加载。 2. Spring bean注入的方式 即通过MapperFactoryBean代理的方式加载mapper接口,实际上返回的实例时mapper接口的代理类的实例。 通常推荐使用的是第一种(包扫描)的方式,可以减少配置及编码量。 Mapper xml 的加载有两种方式: 1. 在注册sqlSessionFactory时使用mapperLocations属性 (通常情况下,若mapper注册时提供扫描的包下有与mapper同名的mapper xml时,此中配置可省略,mybatis-sring会自动加载同包下同名的mapper xml。) 2. 若在MyBatis的配置文件中配置了元素,则在注册sqlSessionFactory时使用configLocation属性 (若MyBatis配置文件中需要配置typeAliases或settings,且mapper xml和mapper不在同一包下或在同一包下,但名称不同时,可使用该方式加载mapper xml,否则该属性配置也可省略。注:若在mybatis中配置了数据源或事务,spring也会忽略,因为spring已经对其进行了配置和管理) SpringConfiguration.xml MyBatis-Configuration.xml 一个完整的例子 SpringConfiguration.xml UserMapper.java Public interface UserMapper{ Pulic User getUser(String userId); } UserMapper.xml UserService.java @Transactional public interface UserService { User doSomeBusinessStuff(String userId); } public class UserServiceImpl implements UserService { private UserMapper userMapper; public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } public User doSomeBusinessStuff(String userId) { return this.userMapper.getUser(userId); } } 问题: 1. MyBatis-Spring中事务控制在service层还是mapper层? 如何指定事务控制在那一层或在那个类上(或类的方法上)? 事务控制必须在service类上使用@Transactional? 2. MyBatis-Spring如何实现批量插入,批量更新和批量删除?

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 11 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档