说明
根据学习计划,之前学了纯粹的mybatis如何简单地操作mysql数据库。但是实际上我并不知道这种做法应用的如何,因为在我以往的项目中并没有这种做法,几乎清一色的都是spring+mybatis。
因此,我决定这第三篇就先入手一下spring和mybatis的整合。
依赖
既然是spring+mybatis,自然是spring和mybatis的相关包都需要导入,maven的配置如下:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.14.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.14.RELEASE</version> </dependency>
上边配置需要特别说明的是,spring-context是为了在spring配置文件中引入config.properties文件;spring-jdbc主要是为了配置数据源;而mybatis-spring很显然就是spring整合mybatis的主要依赖;另外两个是使用mybatis的基础依赖,在上一篇已经有过出现。
整合
使用spring整合mybatis,除了mybatis的基础之外,自然也需要spring的基础知识,通常在使用spring的过程中,都有一个入口文件,一般叫做application.xml或者spring.xml。
在我们这里整合mybatis的时候,就需要如下基本的配置:
<?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" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd"> <context:property-placeholder location="classpath:config.properties"/> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis.xml" /> </bean> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="study.tuzongxun.mapper.UserMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> </beans>
上边配置的说明如下:
首先,这个文件有一个代表xml文件的文件头,这里不多说;
然后就是spring配置文件的文件头,也就是beans里的内容,其实可以理解为java代码导包;就像在java类中需要用到其他类的功能需要先导包一样,这里也是只有有了相应的引入之后,才能在之后使用某些特定的功能;
就例如接下来使用context:property-placeholder来引入config.properties文件一样,只有在上边文件头中有了spring-context的配置,才能够使用这个功能;
引入配置文件之后就是对于数据源的配置,这里需要指定一个具体处理类,也正是因为这样,所以才引入了spring-jdbc;不过,一般在正是项目中可能就会使用连接池相应的处理类;
在数据源的配置之后,声明了一个SqlSessionFactoryBean,上一篇其实有说过,SqlSessionFactoryBean是mybatis的关键;在这个SqlSessionFactoryBean中有一个必须指定的参数,就是dataSource,所以必须在这之前有dataSource的配置,无论是放在其他文件,在这段之前引入,还是如上边例子一样,在这个文件中声明;至于里边的mybatis.xml,从功能角度来说不是必要的,但是实际项目中可能一般都会要,因为里边会有更多详细的与性能等相关配置,例如打印mybatis日志的配置;
那么最后边还有一个bean,依赖于sqlSessionFactory,这是一个数据映射bean,指定了操作数据库的接口;但是需要注意的是,这个地方的实现并不唯一,还有其他的实现方式,待后续再说。
mybatis配置
就像上边所说的,一般都会用一个专门的mybatis的配置,上边的例子中其实就配了个日志,如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- 控制台打印sql等日志 --> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> </configuration>
java代码
上边所有的都是配置,既然还有接口和实体类,自然就有java代码,不过在当前的例子中,使用的还是上一篇一样的代码,只是改了配置,因此就不再罗列,可参考之前所写:
https://blog.csdn.net/tuzongxun/article/details/80097321
测试
为了证明上边的配置和原本纯mybatis的使用具有同等效果,需要一个测试类运行一下测试结果,这个类代码如下:
package study.tuzongxun.test; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import study.tuzongxun.mapper.UserMapper; import study.tuzongxun.model.UserModel; /** * 测试 * @author 涂宗勋 * @date 2018年5月8日 */ public class SpringTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper"); List list = userMapper.findUsers(); for (UserModel user : list) { System.out.println(user); } } }