博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入浅出mybatis之与spring集成
阅读量:4453 次
发布时间:2019-06-07

本文共 3933 字,大约阅读时间需要 13 分钟。

722072-20171019173742162-378720369.png

目录

写在前面

在Java世界,AOP编程是非常流行的模式,大大降低了功能业务与核心业务之间的代码耦合度。而说到AOP,Spring更是业界主流实现框架。

MyBatis作为ORM框架,既可以独立使用,当然也不可免俗地可以与Spring集成在一起使用。
特别是在已经使用Spring框架的应用程序中,如果需要使用MyBatis作为ORM组件时,就必然需要将二者集成在一起。
实际上,MyBatis与Spring集成,本质上就是将MyBatis中的相应组件交给Spring容器进行管理,使得我们可以按照Spring方式来使用MyBatis。

详细配置

既然MyBatis与Spring集成时是将其组件交给Spring进行管理,是如何实现的呢?

实际上,集成MyBatis与Spring需要使用通过mybatis-spring这个组件来实现。

org.mybatis
mybatis-spring
${version.mybatis.spring}

具体是哪些组件要交给Spring托管呢?

1.dataSource(数据源)

数据源通常以连接池方式使用,如:C3P0,Druid等。

druid数据源配置示例(详见:https://github.com/alibaba/druid ) 如下:

2.sqlSessionFactory(Session工厂)

在独立使用MyBatis时,sqlSessionFactory是通过SqlSessionFactoryBuilder构建的。

// 从xml配置中构建sessionFactoryString resource = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

而与Spring集成时,sqlSessionFactory直接交给Spring管理。

实际上就是在Spring中使用SqlSessionFactoryBean对MyBatis的sqlSessionFactory进行了包装。

3.Mapper(映射器)

MyBatis本身支持2种映射器(XML映射器和接口映射器),与Spring集成时2种映射器的注册方式不同。

(1)注册XML映射器

XML映射器在注册SqlSessionFactoryBean时通过属性mapperLocations指定。

另外,在注册xml映射器时,可以同时在Spring中声明一个sqlSession对象,用于执行xml映射器中配置的CRUD操作。

注意:

  • 这里在Spring中注册sqlSession对象并不是MyBatis的sqlSession对象,而是SqlSessionTemplate。
  • SqlSessionTemplate是MyBatis-Spring的核心,这个类负责管理MyBatis的SqlSession, 调用MyBatis映射器的SQL方法, 翻译异常等。
  • SqlSessionTemplate是线程安全的, 可以被多个DAO所共享使用。
  • 当调用SQL方法时, SqlSessionTemplate将会保证使用的SqlSession是和当前Spring的事务相关的。此外,它管理SqlSession的生命周期,包含必要的关闭,提交或回滚操作。使用示例如下:
// 使用spring提供的sqlSessionSqlSession sqlSession = (SqlSession) context.getBean("sqlSession");Test test = sqlSession.selectOne("org.chench.test.mybatis.mapper.selectOneTest", 1);logger.info("test: {}", test);test.setName(new Date().getTime() + "_haha");sqlSession.update("org.chench.test.mybatis.mapper.updateOneTest", test);//注意: 使用spring管理的sqlSession时,不允许手动提交事务//sqlSession.commit();

(2)注册接口映射器

实际上,在注册接口映射器时无需手动注册每一个映射器,使用MapperScannerConfigurer可以实现注册指定包路径下的所有映射器接口。

使用举例:

// 当使用接口映射器时,直接获取映射器接口Bean进行CRUD操作TestMapper testMapper = context.getBean(TestMapper.class);Test test = testMapper.selectOneTest(1);logger.info("test: {}", test);test.setName("heihei");testMapper.updateOneTest(test);

4.TransactionManager(事务管理器)

一个使用MyBatis-Spring的主要原因是它允许MyBatis参与到Spring的事务管理中。

而不是给MyBatis创建一个新的特定的事务管理器,MyBatis-Spring利用了存在于Spring中的 DataSourceTransactionManager。
一旦Spring的PlatformTransactionManager配置好了,你可以在Spring中以你通常的做法来配置事务,@Transactional注解和AOP样式的配置都是支持的。
在事务处理期间,一个单独的SqlSession对象将会被创建和使用。当事务完成时,这个session会以合适的方式提交或回滚。
一旦事务创建之后,MyBatis-Spring将会透明的管理事务。在你的DAO类中就不需要额外的代码了。

注意: 对于事务管理器的使用,与MyBatis注册映射器方式不同而不同!

(1)如果MyBatis使用xml映射器,可以使用编程式地控制事务。

// 编程控制事务DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);PlatformTransactionManager txManager = (PlatformTransactionManager) context.getBean("transactionManager");TransactionStatus status = txManager.getTransaction(def);try {    sqlSession.update("org.chench.test.mybatis.mapper.updateOneTest", test);    txManager.commit(status);} catch (Exception e) {    txManager.rollback(status);    e.printStackTrace();}

(2)如果MyBatis的映射器为接口,则可以使用注解方式管理事务(需要在Spring中配置开启注解方式控制事务)。

// 这是一个事务型操作,使用注解方式控制事务@Transactional@Update("update test set name=#{name},descr=#{descr},url=#{url},update_time=now() where id=#{id}")public Integer updateOneTest(Test test);

关于MyBatis与Spring集成的详细例子:https://gitee.com/cchanghui/test-mybatis.git

【参考】

[1]. http://www.mybatis.org/spring/
[2]. http://www.mybatis.org/spring/zh/sqlsession.html

转载于:https://www.cnblogs.com/nuccch/p/7693801.html

你可能感兴趣的文章
centos的网络配置
查看>>
clone git 项目到 非空目录
查看>>
安装php
查看>>
ssh服务不能远程时,使用telnet远程登录
查看>>
微信小程序开发踩坑记录
查看>>
怎样花两月时间去应聘互联网公司
查看>>
CSAPP lab1 datalab-handout(深入了解计算机系统 实验一)
查看>>
tc 146 2 RectangularGrid(数学推导)
查看>>
PHP 新建动态类的代码
查看>>
iOS学习笔记之正则表达式
查看>>
Android解决Fragment多层嵌套时onActivityResult无法正确回调的问题
查看>>
[iOS]转:iOS最佳实践
查看>>
Problem08 输入数字求和
查看>>
Eclipse配置问题
查看>>
python sublime run快捷键设置
查看>>
Hello Word
查看>>
Python小练习004
查看>>
xcode5的Command Line Tools安装
查看>>
Java 系统学习梳理_【All】
查看>>
js中prototype用法(转)
查看>>