(五)mybatis学习之mapper代理开发方式及与spring整合
来源:互联网 发布:手机游戏拍摄软件 编辑:程序博客网 时间:2024/05/29 11:53
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;@Beforepublic void setUp() throws IOException{//创建SqlSessionFactoryString resource = "sqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//创建会话工厂sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic 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 configurationPUBLIC "-//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内容如下:
- <dependencies>
- <!-- 添加servlet的依赖包 -->
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>3.1.0</version>
- </dependency>
- <!-- 添加mybatis的依赖包 -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.3.1</version>
- </dependency>
- <!-- 加入mysql数据库依赖包 -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.38</version>
- </dependency>
- <!-- 添加log4j依赖包(slf4j和log4j) -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.7.20</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- <!-- junit单元测试包 -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- <!-- 加入spring依赖包 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>4.2.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-tx</artifactId>
- <version>4.2.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>4.2.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>4.2.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>4.2.1.RELEASE</version>
- </dependency>
- <!-- c3p0依赖包 -->
- <dependency>
- <groupId>com.mchange</groupId>
- <artifactId>c3p0</artifactId>
- <version>0.9.5.2</version>
- </dependency>
- <!-- mybatis和spring的整合包 -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>1.2.4</version>
- </dependency>
- </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;@Beforepublic void setUp() throws Exception {context = new ClassPathXmlApplicationContext("classpath:ApplicationContext.xml");}@Testpublic 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 configurationPUBLIC "-//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>
0 0
- (五)mybatis学习之mapper代理开发方式及与spring整合
- Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合
- Spring与Mybatis的整合之Mapper代理的整合方式
- Mybatis-Spring整合Mapper代理开发
- Spring和Mybatis整合(mapper代理开发)
- (四)mybatis学习之原始Dao开发方式及与spring整合
- Mybatis之Spring整合Mapper代理
- mybatis和spring整合开发(mapper代理)
- Mybatis之Mapper代理开发方式(四)
- 【Spring+SpringMVC+MyBatis深入学习及搭建】02.MyBatis原始Dao开发和mapper代理开发
- mybatis开发Mapper代理方式
- 基于Maven的Mybatis+spring+springMVC框架整合(mapper代理方式)
- spring整合mybatis(原始dao和mapper代理两种方式)
- MyBatis之 mapper代理方式
- Mybatis和Spring整合(原始Dao)非mapper代理
- Spring整合MyBatis (使用扫描包配置mapper代理)
- Mybatis和Spring整合mapper代理
- Mybatis框架学习(二)—DAO开发方式和Mapper代理的开发方式
- (四)mybatis学习之原始Dao开发方式及与spring整合
- Ruby语言基础学习十:Ruby文件输入输出
- XAudio2学习之混音
- 抽象类 面积与周长
- JAVA中的管道流
- (五)mybatis学习之mapper代理开发方式及与spring整合
- 常规功能和模块自定义系统 (cfcmms)—039模块记录(数据)的权限设计(4)
- LeetCode:计算相同数组元素的下标差(Contains Duplicate II)
- HDFS的备份机制
- ACM常用的C++头文件!
- 基于AVPlayer 自定义播放器
- HTML学习笔记(十四)URL
- leetcode之Power of Two
- 1003. Emergency