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。
这里有两点需要注意:
- 主配置文件中不再需要数据源的配置了。因为数据源要交给 Spring 容器来管理了。
- 这里对 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模块。