(五)mybatis学习之mapper代理开发方式及与spring整合

mapper代理开发方式

配置文件

使用之前的user.xml
sqlMapConfig.xml中也已经配置加载了user.xml

创建接口类

编写mapper接口的时候,需要遵循一些开发规范,mybatis就可以自动生成mapper接口实现类代理对象。
开发规范如下:
(1)在mapper.xml中的namespace的值等于mapper的接口地址
<mapper namespace="mapper.UserMapper">
(2)mapper.java接口中的方法名和mapper.xml中sql配置的id值一致
(3)mapper.java接口中的方法输入参数类型和mapper.xml中sql配置中的parameterType指定类型一致
(4)mapper.java接口中的方法返回值类型和mapper.xml中sql配置中的resultType指定类型一致

public interface UserMapper {

	
	//根据id查询用户信息
	public User findUserById(String id) throws Exception;

	//添加用户信息
	public void addUser(User user) throws Exception;
	
	//根据Id删除用户信息
	public void deleteUserById(String id) throws Exception;
}

代码测试

public class UserMapperTest {
	
	private SqlSessionFactory sqlSessionFactory;
	
	@Before
	public void setUp() throws IOException{
		//创建SqlSessionFactory
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建会话工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
	}

	@Test
	public void testFindUserById() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//获取UserMapper代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		User user = userMapper.findUserById("4028818f47e229d70147e2742f1b0005");
	
		System.out.println(user);
		
		sqlSession.close();
	}

}



mapper代理开发方式及与spring的整合

mybatis配置文件

sqlMapConfig.xml

<?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>

	<!-- 加载映射文件 -->
	<mappers>
		
		<!-- 通过package进行批量加载mapper接口
		  name:指定mapper接口的包名,mybatis自动扫描包下的mapper接口
			需要遵循一些规范:
			(1)这种方式只适用于mapper代理方式
			(2)mapper接口类名与mapper.xml配置文件名保存一致,且在一个目录
		  -->
		<package name="mapper"/>
	</mappers>
	
</configuration>

映射文件(userMaper.xml)


把之前的user.xml重命名为userMapper.xml
注:一直说mapper代理开发时,接口文件名要与配置文件名一致,但是目前我测试的时候,发现接口名称是UserMapper.java,而配置文件为UserMapper.xml或者userMapper.xml,程序运行都没问题。如果配置文件名改为user.xml,则程序运行不成功。

添加依赖包

在之前的项目基础上还需要加入spring的依赖包 、mybatis和spring的整合包
最终的pom.xml内容如下:
[html]  view plain  copy
  1. <dependencies>  
  2.    
  3.     <!-- 添加servlet的依赖包 -->  
  4. <dependency>  
  5.     <groupId>javax.servlet</groupId>  
  6.     <artifactId>javax.servlet-api</artifactId>  
  7.     <version>3.1.0</version>  
  8. </dependency>      
  9.   
  10. <!-- 添加mybatis的依赖包 -->      
  11. <dependency>  
  12.     <groupId>org.mybatis</groupId>  
  13.     <artifactId>mybatis</artifactId>  
  14.     <version>3.3.1</version>  
  15. </dependency>  
  16.   
  17. <!-- 加入mysql数据库依赖包 -->  
  18. <dependency>  
  19.     <groupId>mysql</groupId>  
  20.     <artifactId>mysql-connector-java</artifactId>  
  21.     <version>5.1.38</version>  
  22. </dependency>  
  23.   
  24. <!-- 添加log4j依赖包(slf4j和log4j) -->  
  25. <dependency>  
  26.     <groupId>org.slf4j</groupId>  
  27.     <artifactId>slf4j-log4j12</artifactId>  
  28.     <version>1.7.20</version>  
  29. </dependency>  
  30. <dependency>  
  31.     <groupId>log4j</groupId>  
  32.     <artifactId>log4j</artifactId>  
  33.     <version>1.2.17</version>  
  34. </dependency>  
  35.    
  36.     <!-- junit单元测试包 -->  
  37.    <dependency>  
  38.      <groupId>junit</groupId>  
  39.      <artifactId>junit</artifactId>  
  40.      <version>3.8.1</version>  
  41.      <scope>test</scope>  
  42.    </dependency>  
  43.      
  44.    <!-- 加入spring依赖包 -->  
  45.    <dependency>  
  46.     <groupId>org.springframework</groupId>  
  47.     <artifactId>spring-core</artifactId>  
  48.     <version>4.2.1.RELEASE</version>  
  49. </dependency>  
  50. <dependency>  
  51.     <groupId>org.springframework</groupId>  
  52.     <artifactId>spring-tx</artifactId>  
  53.     <version>4.2.1.RELEASE</version>  
  54. </dependency>  
  55. <dependency>  
  56.     <groupId>org.springframework</groupId>  
  57.     <artifactId>spring-context</artifactId>  
  58.     <version>4.2.1.RELEASE</version>  
  59. </dependency>  
  60. <dependency>  
  61.     <groupId>org.springframework</groupId>  
  62.     <artifactId>spring-beans</artifactId>  
  63.     <version>4.2.1.RELEASE</version>  
  64. </dependency>  
  65. <dependency>  
  66.     <groupId>org.springframework</groupId>  
  67.     <artifactId>spring-jdbc</artifactId>  
  68.     <version>4.2.1.RELEASE</version>  
  69. </dependency>  
  70.   
  71. <!-- c3p0依赖包 -->  
  72. <dependency>  
  73.     <groupId>com.mchange</groupId>  
  74.     <artifactId>c3p0</artifactId>  
  75.     <version>0.9.5.2</version>  
  76. </dependency>  
  77.       
  78.   
  79. <!-- mybatis和spring的整合包 -->  
  80. <dependency>  
  81.     <groupId>org.mybatis</groupId>  
  82.     <artifactId>mybatis-spring</artifactId>  
  83.     <version>1.2.4</version>  
  84. </dependency>  
  85.       
  86.       
  87.      
  88.  </dependencies>  

spring配置文件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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 配置数据源 -->
   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"/>
		<property name="user" value="root"/>
		<property name="password" value="888"/>
        <property name="minPoolSize" value="5" />
        <property name="initialPoolSize" value="5" />
        <property name="maxPoolSize" value="50" />
        <property name="maxIdleTime" value="30000" />
        <property name="checkoutTimeout" value="6000"/>
        <property name="acquireIncrement" value="5" />
        <property name="acquireRetryAttempts" value="5" />
        <property name="acquireRetryDelay" value="1000" />
        <property name="idleConnectionTestPeriod" value="1800" />
        <property name="breakAfterAcquireFailure" value="false" />
        <property name="preferredTestQuery" value="select 1" />
    </bean> 
	
	<!-- SqlSessionFactory 
		原生态的mybatis里,sqlMapConfig.xml全局配置文件里配置了environments元素【配置数据源】和一些映射文件,
		我们是通过SqlSessionFactoryBuilder加载读取解析全局配置文件,然后生成SqlSessionFactory会话工厂。
		现在mybatis和spring进行整合,则sqlMapConfig.xml里不再需要environments,数据源的配置交给了spring来管理;
		SqlSessionFactoryBuilder解脱了,SqlSessionFactory会话工厂的创建交由spring来管理了
	-->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 加载mybatis配置文件(此时配置文件里面主要是一些映射文件,一些全局的配置信息) -->
		<property name="configLocation" value="sqlMapConfig.xml"/>
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<!-- mapper配置
		针对单个mapper接口生成代理对象,之前是根据sqlSession.getMapper(UserMapper.class)生成代理对象
		现在把生成代理对象的操作交过了spring来管理
	 -->
	<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<!-- 指定mapper接口 -->
		<property name="mapperInterface" value="mapper.UserMapper"/>
		<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
	</bean>
	
</beans>


mapper接口

package mapper;

import pojo.User;

public interface UserMapper {

	
	//根据id查询用户信息
	public User findUserById(String id) throws Exception;

	//添加用户信息
	public void insertUser(User user) throws Exception;
		
	//根据Id删除用户信息
	public void deleteUserById(String id) throws Exception;
}

测试

package mybatis;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import mapper.UserMapper;
import pojo.User;

public class UserMapperTest {
	
	private ApplicationContext context;

	@Before
	public void setUp() throws Exception {
		context = new ClassPathXmlApplicationContext("classpath:ApplicationContext.xml");
	}

	@Test
	public void testFindUserById() throws Exception {
		
		//获取代理对象
		UserMapper userMapper = (UserMapper) context.getBean("userMapper");
		
		User user = userMapper.findUserById("402881bc492d83bb01492d8630ad0000");
		
		System.out.println(user);
		
		
	}

}



MapperScannerConfigurer进行mapper的包扫描

上面的测试中,我们在spring容器里中通过

<!-- mapper配置
		针对单个mapper接口生成代理对象,之前是根据sqlSession.getMapper(UserMapper.class)生成代理对象
		现在把生成代理对象的操作交过了spring来管理
	 -->
	<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<!-- 指定mapper接口 -->
		<property name="mapperInterface" value="mapper.UserMapper"/>
		<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
	</bean>
这个配置去生成一个userMaper代理对象。如果有N个mapper接口,那么根据这种方法,就需要在spring配置文件里配置N个org.mybatis.spring.mapper.MapperFactoryBean

这是非常不方便的。所以我们采用org.mybatis.spring.mapper.MapperScannerConfigurer进行mapper的扫描。

<!-- mapper的批量扫描,从mapper包中扫描mapper接口,自动创建代理对象,注入到spring容器 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		
		<!-- 通过这里配置对mapper接口的扫描,mybatis全局配置文件里对mapper的扫描就不需要配置了 。
		对mapper接口的扫描和代理对象的生成都由spring来管理了
		-->
		<property name="basePackage" value="mapper"/>
		
		<!-- 这里name使用sqlSessionFactoryBeanName而不使用sqlSessionFactory,
		原因是MapperScannerConfigurer这个配置会先加载,如果使用sqlSessionFactory,那么数据源还没开始加载,
		MapperScannerConfigurer的加载就开始了,这会导致找不到数据源。所以需要使用sqlSessionFactoryBeanName
		 -->
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
	</bean>

此时sqlMapConfig.xml的内容为:

<?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>

	
</configuration>

测试OK。

最后的spring配置文件ApplicationContent.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 配置数据源 -->
   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"/>
		<property name="user" value="root"/>
		<property name="password" value="888"/>
        <property name="minPoolSize" value="5" />
        <property name="initialPoolSize" value="5" />
        <property name="maxPoolSize" value="50" />
        <property name="maxIdleTime" value="30000" />
        <property name="checkoutTimeout" value="6000"/>
        <property name="acquireIncrement" value="5" />
        <property name="acquireRetryAttempts" value="5" />
        <property name="acquireRetryDelay" value="1000" />
        <property name="idleConnectionTestPeriod" value="1800" />
        <property name="breakAfterAcquireFailure" value="false" />
        <property name="preferredTestQuery" value="select 1" />
    </bean> 
	
	<!-- SqlSessionFactory 
		原生态的mybatis里,sqlMapConfig.xml全局配置文件里配置了environments元素【配置数据源】和一些映射文件,
		我们是通过SqlSessionFactoryBuilder加载读取解析全局配置文件,然后生成SqlSessionFactory会话工厂。
		现在mybatis和spring进行整合,则sqlMapConfig.xml里不再需要environments,数据源的配置交给了spring来管理;
		SqlSessionFactoryBuilder解脱了,SqlSessionFactory会话工厂的创建交由spring来管理了
	-->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 加载mybatis配置文件(此时配置文件里面主要是一些映射文件,一些全局的配置信息) 
		目前这里没有什么内容需要加载,因为别名的设置都由下面的typeAliasesPackage来扫描配置完成
		而对mapper接口的扫描,则通过MapperScannerConfigurer中的basePackage来完成了
		-->
<!-- 		<property name="configLocation" value="sqlMapConfig.xml"/> -->
		
		<!-- 扫描某包下的实体类,别名设置为类名(首字母大小写都可以) -->
		<property name="typeAliasesPackage" value="pojo"/>
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	
	
	<!-- mapper的批量扫描,从mapper包中扫描mapper接口,自动创建代理对象,注入到spring容器 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		
		<!-- 通过这里配置对mapper接口的扫描,mybatis全局配置文件里对mapper的扫描就不需要配置了 。
		对mapper接口的扫描和代理对象的生成都由spring来管理了
		-->
		<property name="basePackage" value="mapper"/>
		
		<!-- 这里name使用sqlSessionFactoryBeanName而不使用sqlSessionFactory,
		原因是MapperScannerConfigurer这个配置会先加载,如果使用sqlSessionFactory,那么数据源还没开始加载,
		MapperScannerConfigurer的加载就开始了,这会导致找不到数据源。所以需要使用sqlSessionFactoryBeanName
		 -->
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
	</bean>
	
	
</beans>







你可能感兴趣的:((五)mybatis学习之mapper代理开发方式及与spring整合)