MyBatis与Spring整合——通过官方文档进行最简单的整合

整合前先重新理下两个框架的基础的东西。
以前搭Hibernate那些,都是是自己看着别人已经搭好的视频,然后自己重新理了一次。这次Mybatis与Spring的整合。从最原始的官方文档开始搭起。要学的,是当这套东西没人搭过的时候,你自己一个人怎么搭起来。
包依赖用了maven,最后才放所有的包依赖吧。

MyBatis

MyBatis是什么,开源持久化框架。通过抽象jdbc模板代码提供简单的api交互简化持久层实现。
MyBatis的搭建了一下基础的东西还有折腾了一下注释和xml配置。
MyBatis实战——前身iBatis、基础环境搭建和如何"钓鱼" 和  MyBatis之resultMap的作用和xml配置折腾 

通过读取mybatis-config.xml,mybatis文件有相应的EmployeeMapper.xml(如果用的注释进行的映射,那么配置文件里面直接配置
带注释的接口类即可)EmployeeMapper映射了相应的JavaBean,通过SqlSessionFactory的实例化出来的SqlSession,执行对应方法,根据方法名EmployeeMapper.selectEmployee,回到EmployeeMapper.xml中找到和方法名相对应的id(注释方式的话找到接口类里面注释id对应的方法),根据sql语句,还有传入的参数,还有Bean,这几者的联系形成的映射,进行CURD操作。省去JDBC那些模板方法代码。

Spring

而Spring是什么,Spring也是开源框架。简化Java开发。主要功能是依赖注入和面向切面工程。
可以用JDBC的小例子来展示:参考Spring doc中的jdbc部分。
数据库先建了Employee的表

applicationContext.xml
<?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:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/test" />
		<property name="username" value="root" />
		<property name="password" value="root" />
	</bean>
	<bean id="TestSpringJDBC" class="DAO.TestSpringJDBC">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

TestSpringJDBC.java
public class TestSpringJDBC {
	private JdbcTemplate jt;


	public void setDataSource(DataSource dataSource) {
		this.jt = new JdbcTemplate(dataSource);
	}


	public int get() {
		int rowCount = this.jt.queryForObject("select count(*) from employee", Integer.class);
		return rowCount;
	}


	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		TestSpringJDBC t = ((TestSpringJDBC) context.getBean("TestSpringJDBC"));
		System.out.println("the number in employee"+t.get());
	}
}

这里并没有看到JdbcTemplate在构造方法中传入了什么,但他确实就是实现了。具体就是Spring帮你注入了你xml配置中的dataSource。

AOP的话先放着不用看。


两者的整合

再回到Mybatis与Spring整合的官方介绍。http://www.mybatis.org/spring/zh/index.html

需要加入mybatis-spring-x.x.x.jar包,要和 Spring 一起使用 MyBatis,你需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory 和至少一个数据映射器类。之前只有Mybatis的时候是通过SqlSessionFactory的实例化出来的SqlSession。


像前面文章写MyBatis刚开始搭建的时候一样:
一个model:省略set和get方法
public class Employee {
	private int id;
	private String first_name;
	private String last_name;
	private int salary;
}

一个Mapper:

public interface EmployeeMapper
{
	@Select("select * from employee where id = #{id}")
	Employee findEmployeeById(Integer a);
}


applicationContext.xml变为:

<?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:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">


	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/test" />
		<property name="username" value="root" />
		<property name="password" value="root" />
	</bean>


	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- datasource bean -->
		<property name="dataSource" ref="dataSource" />
	</bean>
</beans>


后面一个具体的实现我稍微改了下代码:

public class TestSpring {
	private EmployeeMapper userMapper;


	public EmployeeMapper getUserMapper() {
		return userMapper;
	}


	public void setUserMapper(EmployeeMapper userMapper) {
		this.userMapper = userMapper;
	}


	public Employee findEmployeeByID(int userId) {
		return this.userMapper.findEmployeeById(userId);
	}
}


是的,官方文档就在这里终止的,但是之前单独用Mybatis这样实现就可以了。
String configxml = "mybatis-config.xml";    
InputStream is = null;    
try {    
    is = Resources.getResourceAsStream(configxml);    
} catch (IOException e) {    
    e.printStackTrace();    
}    
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(is);    
SqlSession s = sf.openSession();    
EmployeeMapper employeeMapper =  s.getMapper(EmployeeMapper.class);  
Employee e =  employeeMapper.findEmployeeById(47);  
System.out.println(e.getFirst_name()); 

现在整合Spring要如何入手,这是要结合回之前写的JDBCTemplate的例子。
	<bean id="TestSpringJDBC" class="DAO.TestSpringJDBC">
        <property name="dataSource" ref="dataSource"/>
    </bean>

我们给TestSpringJDBC的JdbcTemplate变量传入具体的DataSource,
现在给TestSpring的userMapper传入具体的UserMapper。传入之前,我们先要注册这个Mapper,根据官方文档的关于Mapper注册的说明:

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

MapperFactoryBean处理SqlSession的创建和关闭,我们根据自己的例子改为:Mapper具体的实现类

<bean id="myuserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface" value="com.mybatis3.mappers.EmployeeMapper" />
		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
	</bean>

再把Mapper注入到TestSpring的userMapper中。

<bean id="test" class="DAO.TestSpring">
		<property name="userMapper">
			<ref bean="myuserMapper" />
		</property>
	</bean>


TestSpring添加具体实现:
public static void main(String[] args) {
	ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	TestSpring t = ((TestSpring) context.getBean("test"));
	System.out.println(t.findEmployeeByID(45).getFirst_name());
}

这时候拿到的TestSpring实例t里面的userMapper已经是注入了MapperFactoryBean。

现在重新理一下思路。SqlSessionFactory 需要一个数据源DataSource,可以看成是一个连接数据库的配置。所以我们配置了DataSoruce和sqlSessionFactory。


Spring与Mybatis的整合里面,虽然现在具体不知道MapperFactoryBean的具体实现,但是通过文档的第六章注入映射器知道SqlSession的创建和关闭交由它,还有创建的代理类实现了UserMapper接口,并且注入到应用程序中。
这就是我们为什么这样配置的一个思路。


最后通过整合Spring,我们用了3行代码做到单独用Mybatis时11行代码做到的东西。


maven的包依赖:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>ckc</groupId>
  <artifactId>Spring4Mybatis</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>Spring4Mybatis Maven Webapp</name>
  <url>http://maven.apache.org</url>
<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/jstl/jstl -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.1.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>1.0</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-all</artifactId>
			<version>1.9.5</version>
		</dependency>
	
		<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.21</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/log4j/log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.21</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-library -->
		<dependency>
			<groupId>org.hamcrest</groupId>
			<artifactId>hamcrest-library</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.4</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		    <version>5.1.34</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/taglibs/standard -->
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>4.2.0.Final</version>
		</dependency>

		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.0.0.GA</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.1.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.1.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.1.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.1.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>

			<artifactId>spring-webmvc</artifactId>
			<version>4.1.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.1.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.5.4 </version>
		</dependency>
		<dependency>
			<groupId>aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.5.4 </version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.4.0</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.1</version>
		</dependency>
		<dependency>
			<groupId>net.rossillo.mvc.cache</groupId>
			<artifactId>spring-mvc-cache-control</artifactId>
			<version>1.1.1-RELEASE</version>
			<scope>compile</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>1.2.2</version>
		</dependency>
		
	</dependencies>
  <build>
    <finalName>Spring4Mybatis</finalName>
  </build>
</project>


这次完全没看别人搭建的代码,看着官方文档加上自己的理解还有不断的试。写出了文档里面没有说明的
可以运行看到整合结果的代码。

猜你喜欢

转载自blog.csdn.net/iaiti/article/details/53467627