MyBatis详解:spring和mybatis整合

MyBatis详解:spring和mybatis整合

目录

MyBatis详解:spring和mybatis整合

一、整合思路

二、环境

2.1、jar包

三、spring和mybatis整合后原始dao开发

3.1、建立mybatis的xml文件SqlMapConfig.xml

3.2、在applicationContext.xml中配置sqlSessionFactory和数据源

3.3、建立操作数据库表格时所对应的po类,查询的列构成po类的属性

3.4、编写po类的映射文件,在其中编写sql语句

3.5、在mybatis的xml文件SqlMapConfig.xml中加载po类的映射文件

3.6、编写dao(包括dao接口及其实现类)

3.7、在applicationContext.xml文件中配置dao实现类的bean

3.8、编写测试程序

3.9、mybatis和spring整合之后原始dao开发总结

四、spring和mybatis整合后mapper代理开发

4.1、编写mapper接口对应的映射文件mapper.xml

4.2、编写mapper接口mapper.java

4.3、在spring的配置文件applicationContext.xml中配置代理对象的bean

4.3.1、MapperFactoryBean配置单个代理对象的bean

4.3.2、mapper批量扫描

4.4、测试程序

 4.5、mybatis和spring整合之后mapper代理开发总结


一、整合思路

MyBatis整合Spring的思路如下:

1、SqlSessionFactory对象应该放到spring容器中作为单例存在。
2、传统Dao的开发方式中,应该从spring容器中获得sqlsession对象。
3、Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。
4、数据库的连接以及数据库连接池事务管理都交给spring容器来完成。

二、环境

2.1、jar包


数据库:mysql5.5(其他也可以)

java环境:jdk1.8(eclipse或者IDEA都可以)

spring版本:spring4

需要的jar包:ssm全部jar包,参照https://mp.csdn.net/postedit/86485520这篇博客,百度云免费下载。

2.2、工程结构

三、spring和mybatis整合后原始dao开发

3.1、建立mybatis的xml文件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>
	
	<!-- 别名定义 -->
	<typeAliases>
		<!-- 批量别名定义 
		指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
		-->
		<package name="cn.itcast.ssm.po"/>
	</typeAliases>
	
</configuration>

 

3.2、applicationContext.xml中配置sqlSessionFactory和数据源

mybatis和spring整合之前,是在mybatis的配置文件SqlMapConfig.xml中通过envirotments标签来配置数据源(包括数据库的连接、连接池的配置)和控制事务的。mybatis和spring整合之后,这些都由spring来完成。

<!-- 加载配置文件 -->
	<context:property-placeholder location="classpath:db.properties" />

	<!-- 数据源,使用dbcp -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="maxActive" value="10" />
		<property name="maxIdle" value="5" />
	</bean>

	<!-- sqlSessionFactory -->	
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 加载mybatis的配置文件 -->
		<property name="configLocation" value="mybatis/SqlMapConfig.xml" />
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>

注意:在配置sqlSessionFactory时,需要加载mybatis的配置文件 和指明数据源

3.3、建立操作数据库表格时所对应的po类,查询的列构成po类的属性

这里我们仍然选择User.java来测试,同mybatis和spring整合之前。参照MyBatis详解(一):入门程序MyBatis详解(二):mybatis开发dao

3.4、编写po类的映射文件,在其中编写sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace命名空间,作用就是对sql进行分类华管理,理解为sql隔离 
注意:如果使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="test">
	
	<!-- 在映射文件中配置很多sql语句 -->
	<!-- 通过select执行数据库查询
	id:标识 映射文件中的 sql
	将sql语句封装到mappedStatement对象中,所以将id称为statement的id
	parameterType:指定输入 参数的类型,这里指定int型 
	#{}表示一个占位符号
	#{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
	
	resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
	 -->
	<select id="findUserById" parameterType="int" resultType="cn.itcast.ssm.po.User">
	SELECT * FROM USER WHERE id = #{id}
	</select>
	
	
</mapper>

3.5、在mybatis的xml文件SqlMapConfig.xml中加载po类的映射文件

<!-- 加载映射文件 -->
	<mappers>
		<mapper resource="sqlmap/User.xml"/>
		<!-- 
		 和spring整合后,使用mapper扫描器,这里不需要配置了
		 -->
	</mappers>

3.6、编写dao(包括dao接口及其实现类)

dao接口:

package cn.itcast.ssm.dao;

import java.util.List;

import cn.itcast.ssm.po.User;

public interface UserDao {
	//根据id查询用户信息
	public User findUserById(int id) throws Exception;
		
}

dao实现类:dao实现类需要继承SqlSessionDaoSupport

在实现类中,通过this.getSqlSession()方法获得SqlSession

有人可能存在疑问:实现类中连SqlSessionFactory都没有,怎么就直接得到SqlSession了?事实上,dao实现类的bean是交给spring来管理的,我们在spring的IOC容器中配置dao实现类的bean时已经向里面注入SqlSessoinFactory了(见下文)。

package cn.itcast.ssm.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import cn.itcast.ssm.po.User;


public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
	
	@Override
	public User findUserById(int id) throws Exception {
		//继承SqlSessionDaoSupport,通过this.getSqlSession()得到sqlSession
		SqlSession sqlSession = this.getSqlSession();

		User user = sqlSession.selectOne("test.findUserById", id);

		return user;

	}			
}

3.7、在applicationContext.xml文件中配置dao实现类的bean

<!-- 原始dao接口 -->
	
	<bean id="userDao" class="cn.itcast.ssm.dao.UserDaoImpl">
		<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
	</bean>

3.8、编写测试程序

package cn.itcast.ssm.dao;

import static org.junit.Assert.*;

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

import cn.itcast.ssm.po.User;

public class UserDaoImplTest {
	private ApplicationContext applicationContext;
	//在setUp这个方法得到spring容器
	@Before
	public void setUp() throws Exception {
		applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
	}

	@Test
	public void testFindUserById() throws Exception {
		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
		
		//调用userDao的方法
		User user = userDao.findUserById(1);
		
		System.out.println(user);
	}

}

3.9、mybatis和spring整合之后原始dao开发总结

相比于mybatis和spring整合之前,mybatis和spring整合之后原始dao开发把原来在mybatis配置文件SqlMapConfig.xml中完成的连接数据源、事务控制都交给spring来完成。同时spring还配置了SqlSessionFactory的bean(不需要单例模式去造了)、配置了dao实现类的bean(不需要new了)。

步骤如下:

1、导入所需要的jar包

2、将数据库的driver、url、user、password等信息封装在db.properties

3、建立mybatis的xml文件SqlMapConfig.xml,完成别名定义、缓存设置等配置

4、建立spring的配置文件applicationContext.xml,配置数据源、SqlSessionFactory和控制事务

5、建立操作数据库表格时所对应的po类,查询的列构成po类的属性

6、编写po类的映射文件,在其中编写sql语句

7、在mybatis的xml文件SqlMapConfig.xml中加载po类的映射文件

8、编写dao接口,并在其中编写po类xml映射文件中sql语句对应的抽象方法,编写dao接口的实现类,dao实现类需要继承SqlSessionDaoSupport

9、在applicationContext.xml文件中配置dao实现类的bean

10、编写测试程序

四、spring和mybatis整合后mapper代理开发

4.1、编写mapper接口对应的映射文件mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace命名空间,作用就是对sql进行分类华管理,理解为sql隔离 
注意:如果使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址
-->
<mapper namespace="cn.itcast.ssm.mapper.UserMapper">
	
		
	<!-- 在映射文件中配置很多sql语句 -->
	<!-- 通过select执行数据库查询
	id:标识 映射文件中的 sql
	将sql语句封装到mappedStatement对象中,所以将id称为statement的id
	parameterType:指定输入 参数的类型,这里指定int型 
	#{}表示一个占位符号
	#{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
	
	resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
	 -->
	<select id="findUserById" parameterType="int" resultType="user" useCache="false">
	SELECT * FROM USER WHERE id = #{id}
	</select>
	
	
</mapper>

4.2、编写mapper接口mapper.java

package cn.itcast.ssm.mapper;

import java.util.List;

import cn.itcast.ssm.po.User;

/*
 * 开发规范:	
	1、在mapper.xml中namespace等于mapper接口地址
	
	2、mapper.java接口中的方法名和mapper.xml中statement的id一致

	3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

	4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

 */

public interface UserMapper {
	//根据id查询用户信息
	public User findUserById(int id) throws Exception;
	
}

4.3、在spring的配置文件applicationContext.xml中配置代理对象的bean

这里有两种方法,一种是MapperFactoryBean配置单个代理对象的bean,另一种是mapper批量扫描,即从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册 。推荐使用后者。这两种方法在配置代理对象的bean时都要注入SqlSessionFactory。

4.3.1、MapperFactoryBean配置单个代理对象的bean

<!-- mapper配置 
	MapperFactoryBean=:根据mapper接口生成代理对象
	-->
	<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		mapperInterface指定mapper接口
		<property name="mapperInterface" value="cn.itcast.ssm.mapper.UserMapper"></property>
		<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
	</bean>

4.3.2、mapper批量扫描

<!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册 
	遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 中
	自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
	-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 指定扫描的包名 
		如果扫描多个包,每个包中间使用半角逗号分隔
		注意:jdk1.7和spring3的jar包兼容,jdk1.8及以上和spring3的jar包不兼容!和spring4的jar包兼容
		-->
		<property name="basePackage" value="cn.itcast.ssm.mapper"/>
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
		
	</bean>

4.4、测试程序

package cn.itcast.ssm.mapper;

import static org.junit.Assert.*;

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

import cn.itcast.ssm.po.User;

public class UserMapperTest {

	private ApplicationContext applicationContext;
	//在setUp这个方法得到spring容器
	@Before
	public void setUp() throws Exception {
		applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
	}

	@Test
	public void testFindUserById() throws Exception {
		UserMapper userMapper=(UserMapper) applicationContext.getBean("userMapper");
		User user=userMapper.findUserById(1);
		System.out.println(user);
	}

}

 4.5、mybatis和spring整合之后mapper代理开发总结

和整合之后的dao开发一致,mybatis把一些事交给spring来完成。mybatis和spring整合之后mapper代理开发把原来在mybatis配置文件SqlMapConfig.xml中完成的连接数据源、事务控制都交给spring来完成。同时spring还配置了SqlSessionFactory的bean(不需要单例模式去造了)、原来在mybatis配置文件批量扫描的mapper包也交给spring来扫描。

步骤如下:

1、导入所需要的jar包

2、将数据库的driver、url、user、password等信息封装在db.properties

3、建立mybatis的xml文件SqlMapConfig.xml,完成别名定义、缓存设置等配置

4、建立spring的配置文件applicationContext.xml,配置数据源、SqlSessionFactory和控制事务

5、建立操作数据库表格时所对应的po类,查询的列构成po类的属性

6、编写mapper接口对应的映射文件mapper.xml,在其中完成sql语句的编写

注意:(1)需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中

           (2)在mapper.xml中namespace等于mapper接口地址

7、编写mapper接口mapper.java,在其中编写mapper.xml文件中对应的sql语句的抽象方法

注意:

(1)mapper.java接口中的方法名和mapper.xml中statement的id一致;

(2)mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致;

(3)mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

8、在spring的配置文件中配置代理对象的bean,推荐包扫描的方式

9、编写测试程序,完成测试

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值