0
点赞
收藏
分享

微信扫一扫

Spring 集成 MyBatis

钟罗敏 2022-04-08 阅读 133
java

Spring 集成 MyBatis

11 Spring 集成 MyBatis

mybatis框架和spring集成在一起,向一个框架一样使用。

用的技术是:ioc

为什么ioc能把mybatisspring集成在一起,像一个框架, 是因为ioc能创建对象。可以把mybatis框架中的对象交给spring统一创建, 开发人员从spring中获取对象。开发人员就不用同时面对两个或多个框架了, 只需面对一个spring框架。

MyBatisSpring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring来管理。所以,该整合,只需要将 SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。

实现 SpringMyBatis 的整合常用的方式:扫描的 Mapper 动态代理。

Spring 像插线板一样,mybatis 框架是插头,可以容易的组合到一起。插线板 spring 插 上 mybatis,两个框架就是一个整体。

11.1 mybatis使用步骤

mybatis使用步骤,对象:

  1. 定义dao接口 ,StudentDao
  2. 定义mapper文件 StudentDao.xml
  3. 定义mybatis的主配置文件 mybatis.xml
  4. 创建dao动态代理对象StudentDao dao = SqlSession.getMapper(StudentDao.class);
  5. 调用daoselectStudents方法查询数据库:List<Student> students = dao.selectStudents();

要使用dao对象,需要使用getMapper()方法,怎么能使用getMapper()方法,需要哪些条件?

  1. 获取SqlSession对象——需要使用SqlSessionFactoryopenSession()方法;
  2. 故需要创建SqlSessionFactory对象——通过读取mybatis的主配置文件,能创建SqlSessionFactory对象。
    (需要SqlSessionFactory对象, 使用Factory能获取SqlSession ,有了SqlSession就能调getMapper方法得到dao ,通过dao对象调用dao接口中的方法)
    Factory创建需要读取主配置文件,in主配置文件xml
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
spring会创建SqlSessionFactory对象,通过SqlSessionFactory对象获取SqlSession对象,SqlSession对象使用getMapper()方法创建dao对象

另外,我们会使用独立的连接池类替换mybatis默认自己带的连接池, 把连接池类也交给spring创建。

主配置文件:

  1. 数据库信息
<environment id="mydev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库的驱动类名-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接数据库的url字符串-->
                <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
                <!--访问数据库的用户名-->
                <property name="username" value="root"/>
                <!--密码-->
                <property name="password" value="xzx"/>
            </dataSource>
  1. mapper文件的位置
 <mappers>
        <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
        <!--<mapper resource="com/bjpowernode/dao/SchoolDao.xml" />-->
    </mappers>

通过以上的说明,我们需要让spring创建以下对象:

  1. 独立的连接池类的对象, 使用阿里的druid连接池;
  2. SqlSessionFactory对象;
  3. 创建出dao对象;

需要学习就是上面三个对象的创建语法,使用xml的bean标签。

11.2 思考:mapper.xml和mybatis.xml文件的作用

Mapper顾名思义就是“映射”的意思,Mapper文件就是MyBatisSQL语句的配置文件,其会在运行时加载SQL语句并映射相应参数。

MyBatis的全局配置文件SqlMapConfig.xmlmybatis.xml),其中就有mapper文件的资源路径的配置。

因为创建SqlSessionFactory时会加载全局配置文件mybatis.xml,这说明Mapper映射文件在会话(Session)创建开始就被加载了,所以在整个工程的运行期间,Mapper映射文件有着举足轻重的作用。
在这里插入图片描述

11.3 spring和mybatis的集成步骤

ch07-spring-mybatisspringmybatis的集成
在这里插入图片描述
步骤:

  1. 新建maven项目

  2. 加入maven的依赖
    1)spring依赖
    2)mybatis依赖
    3)mysql驱动
    4)spring的事务的依赖
    5)mybatisspring集成的依赖: mybatis官方体用的,用来在spring项目中创建mybatisSqlSesissonFactorydao对象的
    在这里插入图片描述
    在这里插入图片描述

  3. 表:
    在这里插入图片描述

  4. 创建实体类
    在这里插入图片描述

  5. 创建dao接口和mapper文件
    在这里插入图片描述
    在这里插入图片描述

  6. 创建mybatis主配置文件
    src 下定义 MyBatis 的主配置文件,命名为 mybatis.xml

这里有两点需要注意:
(1)主配置文件中不再需要数据源的配置了。因为数据源要交给 Spring 容器来管理了;
(2)这里对 mapper 映射文件的注册,使用<package/>标签,即只需给出 mapper 映射文件所在的包即可(这样dao目录下的xml文件就能一次性找到,不用一个个配置了)。因为 mapper 的名称与 Dao 接口名相同,可以使用这种简单注册方式。这种方式的好处是,若有多个映射文件,这里的配置也是不用改变的。当然,也可使用原来的<resource/>标签方式
在这里插入图片描述

  1. 创建Service接口和实现类,属性是dao。(通过service调用dao)
    在这里插入图片描述

  2. 创建spring的配置文件:声明mybatis的对象交给spring创建
    1)数据源DataSource
    使用 JDBC 模板,首先需要配置好数据源,数据源直接以 Bean 的形式配置在 Spring 配置文件中。根据数据源的不同,其配置方式不同:

Druid 数据源 DruidDataSource

Druid 是阿里的开源数据库连接池。是 Java 语言中最好的数据库连接池。Druid 能够提供强大的监控和扩展功能。Druid 与其他数据库连接池的最大区别是提供数据库的

官网:https://github.com/alibaba/druid

使用地址:https://github.com/alibaba/druid/wiki/常见问题。

配置连接池:
在这里插入图片描述
Spring 配置文件:
在这里插入图片描述

    <!--声明数据源DataSource, 作用是连接数据库的-->
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <!--set注入给DruidDataSource提供连接数据库信息 -->
        <!--    使用属性配置文件中的数据,语法 ${key} -->
        <property name="url" value="${jdbc.url}" /><!--setUrl()-->
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.passwd}" />
        <property name="maxActive" value="${jdbc.max}" />
    </bean>

Spring启动后,会创建DruidDataSource这个类的对象,然后DruidDataSource这个类的对象会读取urlusernamepasswordmaxActive属性创建Connection对象(创建好的Connection对象存在于Spring容器中),进而访问数据库。
2)SqlSessionFactory
在这里插入图片描述
mybatis中创建sqlsessionFactory对象,需要读取mybatis主配置文件的数据库信息mapper文件信息
在这里插入图片描述
而在spring中,同样需要数据库信息mapper文件信息在这里插入图片描述
连接数据库的信息在applicationContext.xml:
在这里插入图片描述

mapper文件在mybatis.xml:
在这里插入图片描述
这俩加起来等同于原来mybatis的主配置文件。

spring容器在读取applicationContext.xml时,扫描文件中的bean,就把sqlSessionFactoryDruidDataSource对象创建好了。
3) Dao对象
Mapper扫描配置器 MapperScannerConfigurer 会自动生成指定的基本包中 mapper 的代理对象。该 Bean 无需设置 id 属性。basePackage 使用分号或逗号设置多个包。

创建dao对象需要sqlSession(sqlSessionFactory能提供),还需要接口名字StudentDao.class(StudentDao所在的包能提供),故要注入sqlSessionFactory(这样就能通过spring容器,找到sqlSessionFactory对象,赋给属性sqlSessionFactoryBeanName)指定包名

spring通过sqlSessionFactory得到sqlSession对象,MapperScannerConfigurer会扫描这个包中的所有接口,通过sqlSession对象把每个接口都执行一次getMapper()方法,得到每个接口的dao对象。要使用这个dao对象,直接getBean反射即可。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4)声明自定义的service
ref引用的是上一步获得的DAO对象:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  1. 创建测试类,获取Service对象,通过service调用dao完成数据库的访问。
    在这里插入图片描述
    在这里插入图片描述
  2. 补充:从属性文件读取数据库连接信息
    为了便于维护,可以将数据库连接信息Spring 配置文件分离出来,写入到属性文件中,使Spring 配置文件从中读取数据。

属性文件名称自定义,但一般都是放在 src 下。
在这里插入图片描述
Spring配置文件属性文件中读取数据时,需要在<property/>value 属性中使用${ },将在属性文件中定义的 key 括起来,以引用指定属性的值。

    <!--
       把数据库的配置信息,写在一个独立的文件,编译修改数据库的配置内容
       spring知道jdbc.properties文件的位置
    -->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!--声明数据源DataSource, 作用是连接数据库的-->
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <!--set注入给DruidDataSource提供连接数据库信息 -->
        <!--    使用属性配置文件中的数据,语法 ${key} -->
        <property name="url" value="${jdbc.url}" /><!--setUrl()-->
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.passwd}" />
        <property name="maxActive" value="${jdbc.max}" />
    </bean>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以后不需要getMapper()来获取dao对象,spring容器给你自动创建好了(内部通过MapperScannerConfigurer扫描指定包的接口类,然后sqlsession.getMapper()来创建dao对象),只需读取applicationContext配置文件,并创建该文件的类对象ctx,通过类对象ctx调用getbean()方法即可获得dao对象。
在这里插入图片描述

11.4 小结

在这里插入图片描述
在这里插入图片描述

举报

相关推荐

0 条评论