玩命加载中 . . .

Spring 集成 MyBatis(03)


Spring 集成 MyBatis

将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring来管理。所以,该整合,只需要将 SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。
实现 Spring 与 MyBatis 的整合常用的方式:扫描的 Mapper 动态代理Spring 像插线板一样, mybatis 框架是插头,可以容易的组合到一起。 插线板 spring 插上 Mybatis, 两个框架就是一个整体。

Maven相关依赖

  <dependencies>
    <!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
    <!--Spring核心依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.14</version>
    </dependency>
    <!--
    spring-tx(事务包)为JDBC、Hibernate、JDO、JPA、Beans等提供的一致的声明式和编程式事务管理支持。
    -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.3.14</version>
    </dependency>
    <!--
    spring-jdbc这个依赖包含对Spring对JDBC 数据访问进行封装的所有类。
    -->
    <dependency>
      <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
      <version>5.3.14</version>
    </dependency>
    <!--JDBC驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.20</version>
    </dependency>
    <!--Mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    <!--MyBaits和Spring集成的依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.6</version>
    </dependency>
    <!--阿里druid数据库连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.8</version>
    </dependency>
  </dependencies>

  <build>
    <!--目的是把src/main/java目录中的所有包含xml的文件输出到classes目录中-->
    <resources>
      <resource>
        <!--需要不被过滤的目录-->
        <directory>src/main/resources</directory>
        <includes>
          <!--需要不被过滤的文件-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <!--filtering:是否启用过滤器:true(启用)/false(禁用)-->
        <filtering>true</filtering>
      </resource>
      <resource>
        <!--需要不被过滤的目录-->
        <directory>src/main/java</directory>
        <includes>
          <!--需要不被过滤的文件-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <!--filtering:是否启用过滤器:true(启用)/false(禁用)-->
        <filtering>true</filtering>
      </resource>
    </resources>
    <!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <!-- 同【方式一】的 maven.compiler.target -->
          <source>11</source>
          <!-- 同【方式一】的 maven.compiler.source -->
          <target>11</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

定义 MyBatis 主配置文件

在 src 下定义 MyBatis 的主配置文件,命名为 mybatis.xml。

这里有两点需要注意:

  1. 主配置文件中不再需要数据源的配置了。因为数据源要交给 Spring 容器来管理了。
  2. 这里对 mapper 映射文件的注册,使用<package/>标签,即只需给出 mapper 映射文件所在的包即可。因为 mapper 的名称与 Dao 接口名相同,可以使用这种简单注册方式。 这种方式的好处是,若有多个映射文件,这里的配置也是不用改变的。当然,也可使用原来的<resource/>标签方式。

定义Spring 配置文件

数据源的配置

使用 JDBC 模板,首先需要配置好数据源,数据源直接以 Bean 的形式配置在 Spring 配置文件中。根据数据源的不同,其配置方式不同:

Druid 数据源 DruidDataSource

Druid 是阿里的开源数据库连接池。 是 Java 语言中最好的数据库连接池。 Druid 能够提供强大的监控和扩展功能。 Druid 与其他数据库连接池的最大区别是提供数据库的官网: https://github.com/alibaba/druid。

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

常用配置:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE

 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
     <property name="url" value="${jdbc_url}" />
     <property name="username" value="${jdbc_user}" />
     <property name="password" value="${jdbc_password}" />

     <property name="filters" value="stat" />

     <property name="maxActive" value="20" />
     <property name="initialSize" value="1" />
     <property name="maxWait" value="6000" />
     <property name="minIdle" value="1" />

     <property name="timeBetweenEvictionRunsMillis" value="60000" />
     <property name="minEvictableIdleTimeMillis" value="300000" />

     <property name="testWhileIdle" value="true" />
     <property name="testOnBorrow" value="false" />
     <property name="testOnReturn" value="false" />

     <property name="poolPreparedStatements" value="true" />
     <property name="maxOpenPreparedStatements" value="20" />

     <property name="asyncInit" value="true" />
 </bean>

从属性文件读取数据库连接信息

为了便于维护,可以将数据库连接信息写入到属性文件中,使 Spring 配置文件从中读取数据。属性文件名称自定义,但一般都是放在 src/resources目录下。

jdbc.url=
jdbc.username=
jdbc.password=
jdbc.maxActive=

Spring 配置文件从属性文件中读取数据时,需要在<property/>的 value 属性中使用${ },将在属性文件中定义的 key 括起来,以引用指定属性的值。 该属性文件若要被 Spring 配置文件读取,其必须在配置文件中进行注册。 使用<context>标签。

Spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--1.通过框架Druid连接池获取数据源-->

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

    <!--声名数据源DataSource,作用是连接数据库-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
          destroy-method="close">
        <!--
            使用属性配置文件的数据,语法:${key}
        -->
        <property name="url" value="${jdbc.url}" /> <!--setUrl()-->
        <property name="username" value="${jdbc.username}" /> <!--setUsername()-->
        <property name="password" value="${jdbc.password}" /> <!--setPassword()-->
        <property name="maxActive" value="${jdbc.maxActive}" /> <!--setMaxActive()-->
    </bean>

    <!--2.通过上面的数据源和Mabatis主配置文件来获取sqlSessionFactory对象-->

    <!--声名的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory这个对象-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--set注入,把数据库连接池赋值给了dataSource属性-->
        <property name="dataSource" ref="dataSource" />
        <!--
            MyBatis主配置文件位置
            configuration属性是Resource类型用来读取配置文件
            它的赋值使用value指定文件的路径,使用classpath:表示文件的位置
        -->
        <property name="configLocation" value="classpath:mybatis.xml" />
    </bean>

    <!--3.Spring自动扫描指定包中的所有dao对象并自动将对象自动放到Spring容器中-->

    <!--创建dao对象使用SqlSession的getMapper(StudentDao.class)
        Mapper
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定SqlSessionFactory对象的id-->
        <property name="SqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--
            指定包名,包名是dao接口所在的包名。
            MapperScannerConfigurer会扫描这个包中所有的接口,把每个接口都执行一次getMapper()方法得到每个接口的dao对象。
            创建好的到对象放入到Spring的容器中,dao对象的默认名称就是接口名称的首字母小写
        -->
        <property name="basePackage" value="com.xrebirth.dao"/>
    </bean>

    <!--4.声名service对象,将dao层创建的对象赋值给service层-->
    <bean id="studentService" class="com.xrebirth.service.impl.StudentServiceImpl">
        <property name="studentDao" ref="studentDao" />
    </bean>
</beans>

详细笔记见:Spring中LearnSpring10-Spring-MyBatis模块。


文章作者: 小靳同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小靳同学 !
评论
 上一篇
SpringWeb(05) SpringWeb(05)
SpringWeb详细笔记见:Spring中LearnSpring14-SpringWeb模块。
2022-01-11
下一篇 
Spring(02) Spring(02)
AOP 面向切面编程作用 在目标类不增加代码的情况下,给目标类增加功能。 减少重复的代码。 让开发人员更加专注于业务逻辑的实现。 解耦合:将
2022-01-08
  目录