目录


整合思想

  1. spring 管理 sqlSessionFactory ,使用 单例模式 创建该对象 ;

  2. 根据 sqlSessionFactory 创建 sqlsession ,这一步由mybatisspring 整合 以后,自动完成,不需要我们配置 ;

  3. Mapper 接口的代理对象 ,由 spring 管理这些代理对象 ;


整合步骤

  1. 导包

    导入 springmybatis 的包

    导入 mybatis-spring 整合包 ;


  2. 搭建工程目录

    需要注意的一点,就是在创建包的时候,为 mybatisspring 都创建各自的配置文件包,便于管理 ;


  3. 导入 springmybatis 的配置文件

    其中注意,mybatis 的配置文件中的 environments 标签的内容在和 spring 整合以后,就被废弃了,也就是不再起作用了;

    也就是 数据源事务,最后都由 spring 进行管理了 ;

    废弃的 environments 标签内容 :

    <!--当和 spring 整合以后,environments 配置将废除-->
    <environments default="development">
    <environment id="development">
    <!--事务管理,暂时有mybatis管-->
    <transactionManager type="JDBC"/>
    <!--数据源 暂时也由 mybatis 管理,以后都由 spring 来管理-->
    <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>
    </environment>
    </environments>

  4. spring 中管理 sqlSessionFactory

    sqlSessionFactory 不是我们在 mybatis 中使用的那个接口,而是在 mybatis-spring SqlSessionFactoryBean

    SqlSessionFactoryBean 类部分源码:

    public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {
    private static final Log LOGGER = LogFactory.getLog(SqlSessionFactoryBean.class);
    // 读取mybatis配置文件使用的资源流
    private Resource configLocation;
    .....
    // 读取数据源
    private DataSource dataSource;
    .... }

    我们可以发现,它的属性有 数据源资源流 ,因此,我们在 spring 中的配置的时候,就需要往相关的属性上赋值了 ;

    spring 中配置 sqlSessionFactory

    <!--配置 sqlSessionFactory-->
    <!--
    class :在 mybatis-spring 整合包里面
    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--设置读取 mybatis 配置文件的资源流-->
    <property name="configLocation" value="xin/ijava/config/mybatis/sqlMapConfig.xml"/>
    <!--设置数据源,引用下面配置的数据源对象-->
    <property name="dataSource" ref="dataSource"/>
    </bean> <!--读取数据库的配置文件-->
    <content:property-placeholder location="classpath:xin/ijava/config/mybatis/db.properties" /> <!--配置 DBCP 数据源-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username"/>
    <property name="password" value="${jdbc.password"/>
    <property name="maxOpenPreparedStatements" value="10"/>
    <property name="maxIdle" value="5"/>
    </bean>

整合之后原始 dao 开发

  1. 开发接口

    跟之前 mybatis 的原始开发一样,需要写接口 ;


  2. 配置映射关系文件

    和之前单独使用 mybatis 开发是一样的 ;


  3. 开发实现类

    跟之前 mybatis 的原始开发一样,写接口的实现类 ;


  4. 让实现类继承 SqlSessionDaoSupport不同点

    继承以后,我们不再需要写上 sqlSessionFactory 属性了,因为,在继承类中,有这个属性

    获取 SqlSession 使用 this.getSqlSession()

    并且,不再需要我们自己手动去关闭 sqlSession

    /**
    * @author An
    */
    public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{ @Override
    public void insertUser(User user) throws Exception {
    SqlSession sqlSession = this.getSqlSession() ;
    sqlSession.insert("test.insertUser",user) ; }

  5. spring 中配置 userDao 对象

    传入 sqlSessionFactory 对象 ;

    <!--配置 UserDao-->
    <bean id="userDao" class="xin.ijava.dao.UserDaoImpl">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

  6. 测试代码

    public class UserDaoImplTest {
    private ApplicationContext context ;
    @Before
    public void setUp() throws Exception {
    context = new ClassPathXmlApplicationContext("xin/ijava/config/spring/application.xml");
    }
    @Test
    public void findUserById() throws Exception {
    UserDaoImpl userDao = (UserDaoImpl) context.getBean("userDao");
    User user = userDao.findUserById(1) ;
    System.out.println(user);
    }
    }

  7. 查看控制台输出

      [service] 2018-09-12 17:26:22,538 - xin.ijava.dao.UserMapper.findUserById -8617 [main] DEBUG xin.ijava.dao.UserMapper.findUserById  - ==>  Preparing: select * from User where id = ?
    [service] 2018-09-12 17:26:22,720 - xin.ijava.dao.UserMapper.findUserById -8799 [main] DEBUG xin.ijava.dao.UserMapper.findUserById - ==> Parameters: 1(Integer)
    [service] 2018-09-12 17:26:22,806 - xin.ijava.dao.UserMapper.findUserById -8885 [main] DEBUG xin.ijava.dao.UserMapper.findUserById - <== Total: 1
    [service] 2018-09-12 17:26:22,815 - net.sf.ehcache.store.disk.Segment -8894 [main] DEBUG net.sf.ehcache.store.disk.Segment - put added 0 on heap
    [service] 2018-09-12 17:26:22,824 - org.mybatis.spring.SqlSessionUtils -8903 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6dd93e5f]
    [service] 2018-09-12 17:26:22,824 - org.springframework.jdbc.datasource.DataSourceUtils -8903 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
    User : name = 张三,id = 1

    只要看到这个输出,就说明 mybatisspring 整合成功 !!


整合之后 Mapper 代理开发

  1. 配置 xxxMapper.xml 映射关系文件

    跟之前 mybatis 的原始开发一样;


  2. 开发接口

    跟之前 mybatis 的原始开发一样,需要写接口 ;


  3. spring 创建代理对象

    spring 的配置文件中,进行配置 ;

    如果传入的 class 是整合包中的 MapperFactoryBean

    这种方式,需要为每一个接口,都配置一次 ;

     <!--配置映射文件代理对象-->
    <!--
    让 spring 创建代理对象。
    -->
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <!--依然需要传入 sqlSessionFactory -->
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    <!--传入接口,告诉它为我们创建哪一个接口的代理对象-->
    <property name="mapperInterface" value="xin.ijava.dao.UserCustomerMapper"/>
    </bean>

    如果传入的 class 是整合包中的 MapperScannerConfigurer

    这种方式,会批量的扫描接口,我们只需要配置这一次 ;

    注意,这里传 sqlSessionFactory 进去的时候,使用的是 sqlSessionFactoryBeanName

     <!--扫描包下的所有接口,一次性生成诸多代理对象,并在 spring 中注册-->
    <!--自动创建的代理对象的 id 为 类名字(首字母小写,必须小写)-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!--配置包名 -->
    <!--要是扫描多个包,中间用逗号隔开-->
    <property name="basePackage" value="xin.ijava.dao"/>
    <!--依然传入 sqlSessionFactory-->
    <!--value 的值是之前配置的 SqlSessionFactory 的 id-->
    <!--这里 name 不能写 sqlSessionFactory ,因为这里先执行;
    假如写为sqlSessionFactory属性,那么上面配置的加载数据库配置文件的配置,将不会得到执行 -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

    如果使用了批量注册注册 mapper ,那么 mybatis 的配置文件中就 不再需要进行 mapper.xml 的扫描;

    对了,这里有个坑,除了使用 sqlSessionFactoryBeanName 代替 sqlSessionFactory;还需要去掉开头的 default-autowire="byName"


  4. 使用批量加载的方法的测试代码

    public class UserCustomerMapperTest {
    private ApplicationContext context ;
    @Before
    public void setUp() throws Exception {
    context = new ClassPathXmlApplicationContext("xin/ijava/config/spring/application.xml");
    } @Test
    public void findOrderUsers() throws Exception { UserCustomerMapper userCustomerMapper = (UserCustomerMapper) context.getBean("userCustomerMapper");
    List<UserCustomer> userCustomers = userCustomerMapper.findOrderUsers();
    System.out.println(userCustomers);
    }
    }

  5. 测试结果

    [service] 2018-09-12 20:25:02,662 - org.mybatis.spring.transaction.SpringManagedTransaction -8640 [main] DEBUG org.mybatis.spring.transaction.SpringManagedTransaction  - JDBC Connection [1728792864, URL=jdbc:mysql:///mybatisDay01?charset=utf-8, UserName=root@localhost, MySQL Connector Java] will not be managed by Spring
    [service] 2018-09-12 20:25:02,684 - xin.ijava.dao.UserCustomerMapper.findOrderUsers -8662 [main] DEBUG xin.ijava.dao.UserCustomerMapper.findOrderUsers - ==> Preparing: SELECT `order`.* ,`user`.`name` ,`user`.sex FROM `order`,`user` WHERE `user`.id = `order`.user_id
    [service] 2018-09-12 20:25:02,818 - xin.ijava.dao.UserCustomerMapper.findOrderUsers -8796 [main] DEBUG xin.ijava.dao.UserCustomerMapper.findOrderUsers - ==> Parameters:
    [service] 2018-09-12 20:25:02,927 - xin.ijava.dao.UserCustomerMapper.findOrderUsers -8905 [main] DEBUG xin.ijava.dao.UserCustomerMapper.findOrderUsers - <== Total: 4
    [service] 2018-09-12 20:25:02,937 - org.mybatis.spring.SqlSessionUtils -8915 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1c3bf543]
    [service] 2018-09-12 20:25:02,937 - org.springframework.jdbc.datasource.DataSourceUtils -8915 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
    [User : name = 朱小明,id = 0, User : name = 张三,id = 0, User : name = 张小明,id = 0, User : name = 张三,id = 0]

    只要控制台出现了我们打印的对象,就说明 mybatis 和 spring 整合成功 !!


总结

我们发现,其实无论是 原始开发,还是 mapper 代理,接口映射关系文件,都少不了!

(十四)mybatis 和 spring 整合的更多相关文章

  1. MyBatis学习(四)MyBatis和Spring整合

    MyBatis和Spring整合 思路 1.让spring管理SqlSessionFactory 2.让spring管理mapper对象和dao. 使用spring和mybatis整合开发mapper ...

  2. Mybatis与Spring整合,使用了maven管理项目,作为初学者觉得不错,转载下来

    转载自:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype ...

  3. Mybatis+struts2+spring整合

    把student项目改造成ssm  struts2 +mybatis+spring 1,先添加spring支持:类库三个,applicationContext.xml写在webinf下四个命名空间,监 ...

  4. MyBatis 与 Spring 整合

    MyBatis-Spring 项目 目前大部分的 Java 互联网项目,都是用 Spring MVC + Spring + MyBatis 搭建平台的. 使用 Spring IoC 可以有效的管理各类 ...

  5. Mybatis(六) Spring整合mybatis

    心莫浮躁~踏踏实实走,一步一个脚印,就算不学习,玩,能干嘛呢?人生就是那样,要找点有意思,打发时间的事情来做,而钻研技术,动脑动手的过程,还是比其他工作更有意思些~ so,努力啥的都是强迫自己做自以为 ...

  6. 【MyBatis学习14】MyBatis和Spring整合

    前面十几篇博文总结了mybatis在开发中的相关技术,但在实际中都是和spring整合开发的,所以这里总结一下mybatis和spring的整合方法,并在整合后进行测试. 1. 整合的环境 这都是老掉 ...

  7. mybatis与spring整合(基于配置文件)

    本文主要介绍了如何将mybatis和spring整合在一起使用,本人使用的是mybatis3.05 + spring3.1.0M2 ,使用dbcp作为数据库连接池. 1.编写数据访问接口(UserDa ...

  8. mybatis与spring整合时读取properties问题的解决

    在学习mybatis与spring整合是,想从外部引用一个db.properties数据库配置文件,在配置文件中使用占位符进行引用,如下: <context:property-placehold ...

  9. Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6964162.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(八)--My ...

随机推荐

  1. 原来INF文件是干这个的

    When the drivers for a device are installed, the installer uses information in an information (INF) ...

  2. SpringMVC配置数据验证(JSR-303)

    这篇文章已经过时了. 请参考比较合适的前后端交互方式. 1.pom.xml中追加hibernate-validator 2.在dto类的域上追加JSR-303的注解 public class Data ...

  3. 深入分析JAVA IO(BIO、NIO、AIO)

    IO的基本常识 1.同步 用户进程触发IO操作并等待或者轮询的去查看IO操作是否完成 2.异步 用户触发IO操作以后,可以干别的事,IO操作完成以后再通知当前线程继续处理 3.阻塞 当一个线程调用 r ...

  4. macOS Mojave 10.14 无法安装brew缺少Command Line Tools for Xcode的解决办法

    问题描述: 首先我的版本是 Xcode 10.1 如果按照以前的方法安装brew 复制 1 /usr/bin/ruby -e "$(curl -fsSL https://raw.github ...

  5. linux系统安装硬盘分区建议

      一.常见挂载点的情况说明一般来说,在linux系统中都有最少两个挂载点,分别是/ (根目录)及 swap(交换分区),其中,/ 是必须的: 详细内容见下文: 安装系统时选择creat custom ...

  6. 配置nginx支持path_info

    默认情况下,nginx是不支持path_info的,我们需要做些配置让它支持. location ~ \.php(.*)$ { root /var/www/nginx/html; fastcgi_pa ...

  7. 关于IC电源管脚去耦电容

    原文地址:https://mp.weixin.qq.com/s/0dAyTpAcQWXlYULqCeKgFA 每个集成电路(IC)都必须使用电容将各电源引脚连接到器件上的地,原因有二:防止噪声影响其本 ...

  8. 【MYSQL】存储过程示例

    GROUPEMP_EXISTS: ), ), )) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT ' ...

  9. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_13-页面静态化-数据模型-轮播图DataUrl接口

    要开发轮播图的DataUrl的接口 轮播图的配置的集合 xc-framework-model这个module下 CmsConfigModel的类的属性 定义接口 在api里面定义接口:CmsConfi ...

  10. VMware安装Centos7超详细过程

    本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 一.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:Ce ...