欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MyBatis3.x和Spring3.x的整合

程序员文章站 2022-05-25 08:09:26
...

title: MyBatis3.x和Spring3.x的整合
tags: MyBatis
categories: MyBatis


若图片无法显示,请前往我的博客查看,相应文章链接:http://codingxiaxw.cn/2016/11/12/40-mybatis%E4%B8%8Espring%E7%9A%84%E6%95%B4%E5%90%88/

1.mybatis和spring整合的思路

1.让spring管理SqlSessionFactory
2.让spring管理mapper对象和dao

使用spring和mybatis整合开发mapper代理及原始dao接口。
自动开启事务,自动管理sqlsession


3.让spring管理数据源(即数据库连接池)

2.准备工作

2.1创建整合工程

新建项目,拷贝前一天所建mybatis的项目,现在的项目结构为:

<img src="http://od2xrf8gr.bkt.clouddn.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202016-11-12%20%E4%B8%8B%E5%8D%886.15.47.png" width="50%" height="30%">

2.2.导入jar包

1.mybatis3.x本身的jar包
2.数据库驱动包
3.spring3.xjar包
4.spring和mybatis的整合包:从mybatis官方下载mybatis-spring-1.2.2.jar

2.3.SqlMapConfig.xml

mybatis的配置文件:设置别名、mappers。如下[图片上传失败...(image-61661a-1526379726308)]

mybatis和spring整合后,mybatis配置文件中的<mappers>标签便可以去掉,因为我们在spring配置文件中进行对mapper的配置;别名配置标签<typeAliases>也可以去掉,因为我们也可以在spring配置文件中对pojo全限定性类名的别名进行配置。

2.4.applicationContext.xml

spring配置文件中需要配置的内容有:1.数据源(用的是dbcp连接池,数据库的连接配置写在src路径下的db.properties文件中)。2.SqlSessionFactory。3.mapper或dao。如下:


    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

    <!-- 1.加载数据库的配置文件 -->
    <context:property-placeholder location="classpath:db.properties" />

    <!-- 2.配置数据库连接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.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="maxIdle" value="5" />
    </bean>


    <!-- 3.配置SqlsessionFactory,引入的是mybatis和sqlsession整合包下的SqlSessionFactoryBean类 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 下面才是mybatis和spring整合最重要的步骤:a.注入数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- b.mybati全局s配置文件 -->
        <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
    </bean>
    

    
    <!-- 4.配置mapper
    MapperFactoryBean:用于生成mapper代理对象
     -->
    <!--<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">-->
        <!--<property name="mapperInterface" value="mapper.UserMapper"/>-->
        <!--<property name="sqlSessionFactory" ref="sqlSessionFactory"/>-->
    <!--</bean>-->
    <!--
    MapperScannerConfigurer:mapper的扫描器,将包下边的mapper接口自动创建代理对象,
    自动创建到spring容器中,bean的id是mapper的类名(首字母小写)
     -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 配置扫描包的路径
        如果要扫描多个包,中间使用半角逗号分隔
        要求:Mapper.java与Mapper.xml文件在同一个目录下
         -->
        <property name="basePackage" value="mapper"/>
        <!-- 使用sqlSessionFactoryBeanName -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

    </bean>
    
</beans>

到此处,我们便完成了mybatis与spring的整合,接下来便可以进行测试了。从整合后的mybatis配置文件和spring的配置文件来来,整合后的mybatis配置文件中的内容基本都被移到了spring的配置文件中。

3.整合开发原始dao接口

3.1配置SqlSessionFactory

在applicationContext.xml中配置SqlSessionFactory,为上图的:
[图片上传失败...(image-d4421a-1526379726308)]

3.2开发原始dao

将dao接口的实现类UserDaoImpl.java继承SqlSessionDaoSupport.java,该父类中有属性的set方法并已经声明SqlSessionFactory对象,所以我们在UserDaoImpl.java中只需要写如下代码:[图片上传失败...(image-8f1739-1526379726308)]

然后需要在spring配置文件中配置dao:[图片上传失败...(image-98418e-1526379726308)]

测试:[图片上传失败...(image-d753d7-1526379726308)]

控制台中成功打印出结果:[图片上传失败...(image-b0beb1-1526379726308)]

4.整合开发mapper代理方法

首先在mapper包下创建UserMapper.java和UserMapper.xml文件,利用mybatis和spring整合开发mapper的方式有两种。

4.1使用MapperFactoryBean

该类是整合jar包下的一个类,它的内部已经继承SqlSessionDaoSupport类,首先我们需要在spring配置文件中进行Mapper对象的配置:[图片上传失败...(image-db4de5-1526379726308)]

然后便可以进行测试:[图片上传失败...(image-cd2ce7-1526379726308)]

这样就完成了对mapper的开发,使用这种方式的缺点就是对于项目中的每个mapper我们都需要配置上述内容,比较繁琐。接下来看看下面这种开发mapper代理的方式。

4.2使用MapperScannerConfigurer(扫描mapper)

该类同样是整合jar包中的一个类。在spring配置文件中加入如下配置:
[图片上传失败...(image-75ee49-1526379726308)]

然后进行测试:[图片上传失败...(image-446a48-1526379726308)]同样正常运行。

使用这种方式的优点:使用扫描器自动扫描mapper,生成代理对象比较方便。

5.出现异常总结

使用MapperFactoryBean的方式不会报错,但是使用这样扫描包的方式,上述代码我完全是照搬的教程代码,可是运行时会出现org.springframework.beans.factory.BeanDefinitionStoreException的报错。

出现这个异常的原因你不用多想,绝对是因为你的spring 版本与开发工具的jdk版本不兼容!之前在单独开发spring框架中使用到<content:component-scan base-package="包名"注解扫描声明整个pojo包下的类时也出现了这个错误,那时候我将spring3.x.jar包换成spring4.x.jar包后成功解决,因为我的开发工具IDEA默认jdk版本是1.8,所以我要升级jar包版本才能实现兼容。

整合spring和mybatis时又出现了这个错误!所以这里我决定像之前那样将spring3.x换成sring4.x,可是我已经导入的jar包太多太多实在分不清了,经过很多的轮回换jar包后又出现了更多的异常。我为这个异常真是头疼了几天几夜,经过几天的不断研究找资料才发现原因是因为我用的spring 3.x的jar包,与IDEA的jdk1.8不兼容,解决方法有两种:

  • 1.将jdk版本调为1.7,我用的开发工具为IDEA,它默认下的JDK使用1.8版本,所以我需要在三个地方将jdk的版本改过来(前提是你已经下载了jdk1.7版本),修改IDEA配置中Project的jdk版本、Modules的jdk版本、SDKs的版本,如果你用到leTomcat还需要修改Tomcat配置的jdk版本。这样jdk1.7与spring3.x才兼容。
  • 2.将spring3.x.jar换成spring4.x.jar包。这种方式比较繁琐,建议大家使用第一种方式。spring4.x与jdk1.8才兼容。

写到这里,我们便成功的完成了spring3.x与mybatis3.x的整合。整合完后我们便可以从mybatis的配置文件中删掉对mapper的配置了,因为我们已经在spring配置文件中用mapper扫描器对mapper进行了配置。

2018.3.19更

欢迎加入我的Java交流1群:659957958。群里目前已有1800人,每天都非常活跃,但为了筛选掉那些不怀好意的朋友进来搞破坏,所以目前入群方式已改成了付费方式,你只需要支付9块钱,即可获取到群文件中的所有干货以及群里面各位前辈们的疑惑解答;为了鼓励良好风气的发展,让每个新人提出的问题都得到解决,所以我将得到的入群收费收入都以红包的形式发放到那些主动给新手们解决疑惑的朋友手中。在这里,我们除了谈技术,还谈生活、谈理想;在这里,我们为你的学习方向指明方向,为你以后的求职道路提供指路明灯;在这里,我们把所有好用的干货都与你分享。还在等什么,快加入我们吧!

2018.4.21更:如果群1已满或者无法加入,请加Java学习交流2群:305335626 。群2作为群1的附属群,除了日常的技术交流、资料分享、学习方向指明外,还会在每年互联网的秋春招时节在群内发布大量的互联网内推方式,话不多说,快上车吧!

6.联系

If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.