Spring整合Mybatis


使用Spring和Mybatis进行整合,将mybatis-config配置文件和映射配置文件Mapper.xml与Spring中的applicationContext.xml进行整合,可以讲mybatis- config.xml配置文件中的关于数据库的配置如dataSource放置到applicationContext.xml中,整合只是整合applicationContext与mybatis-config这两个配置文件

一、Spring整合基于DAO开发的Mybatis

1. UserDao

package com.smbms.dao;

import java.util.List;

import com.smbms.pojo.User;

public interface UserDao {

	List<User> getList();

}

2. UserDao的实现类UserDaoImpl

通过set的方式进行注入SqlSession,最终需要通过SqlSession中的seletList方法进行操作数据库,其中userDaoXML是namespace

public class userDaoImpl implements UserDao {
	private SqlSession sqlSession;
	@Override
	public List<User> getList(){
		return sqlSession.seletList("userDaoXML.getList);
	}
	//通过set 进行 注入
	public void setSqlSession(SqlSession sqlSession){
		this.sqlSession = sqlSession;
	}

在UserMapper.xml映射配置文件中,实现getList的方法

<?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">
<!-- DAO接口实现类 -->
<mapper namespace="userDaoXML">
	<select id="getList" resultType="User">
		select * from smbms_user
	</select>
</mapper>

3. 完成控制反转IOC和依赖注入DI

在applicationContext.xml文件中进行与Mybatis相关的配置

首先,将SqlSession和SqlSessionFactory交给Spring IOC来管理。Spring中有一个SqlSessionFactoryBean类,在这个类中有一个属性就是SqlSessionFactory,因此,我们可以通过SqlSessionFactoryBean来获得SqlSessionFactory。如果还想保留mybatis-config.xml主配置文件,那么我们可以借助SqlSessionFactoryBean中的configLocation属性,SqlSessionFactory中有一个setConfigLocation方法,通过set注入方法,可以修改configLocation,这个就是用来指定本地的mybatis-cofnig主配置文件的位置的。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="configLocation" value="mybatis-config.xml"/>
	</bean>

将SqlSession交给SpringIOC管理,在Mybatis-spring-1.2.2.jar包有一个SqlSessionTemplate类,这个类中有一个属性SqlSession属性,但是这个属性并不是通过set方法设置的,因为set方法设置的时候,是无法给这个属性加final修饰的,final修饰的属性必须初始化的时候就有值,而且无法修改。因此在注入的时候只能采用构造注入

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory"/>
</bean>

完整的applicationContext.xml配置文件中关于Mybatis的部分

<!-- 构建数据源连接池 你可以采用DBCP、Druid、C3P0 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&amp;characterEncoding=utf-8"/>
		<property name="username" value="root"/>
		<property name="password" value="root"/>
	</bean>
	
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="configLocation" value="mybatis-config.xml"/>
	</bean>
	
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory"/>
	</bean>
	

<bean id="userDao" class="com.smbms.dao.impl.UserDaoImpl">
		<property name="sqlSession" ref="sqlSession"></property>
</bean>

<bean id="userService" class="com.smbms.service.impl.UserServiceImpl">
		<property name="userDao" ref="userDao"></property>
</bean>

以后直接可以在某个地方直接调用UserService,就可以直接实现操作数据库的操作了

4. 测试

public class Test2 {
	public static void main(String[] args) throws Exception {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		UserService userService = ac.getBean(UserService.class);
		
		List<User> userList = userService.getList();
	}

}

二、Spring整合基于Mapper接口开发的Mybatis

1. 修改mybatis-config.xml

既然是基于Mapper接口的开发,因此首先对mybatis-config.xml中的配置文件进行修改,将

<mappers>
	<mapper resource="com/smbms/dao/impl/UserMapper.xml"/> 
</mappers>

改成

<mappers>
		<!-- 包扫描【推荐但仅限于在Mapper接口开发使用】 -->
		<package name="com.smbms.mapper"/>
</mappers>

然后,在基于Mapper接口开发中,不再需要Dao的实现类,因此也不再需要了。

<bean id="userDao" class="com.smbms.dao.impl.UserDaoImpl">
		<property name="sqlSession" ref="sqlSession"></property>
</bean>

2. UserMapper接口

这里我们不再使用Dao了,而是使用Mapper接口了

package com.smbms.mapper;

import java.util.List;

import com.smbms.pojo.User;

public interface UserMapper {

	List<User> getList();

}

3. UserMapper.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">
<!-- DAO接口实现类 -->
<mapper namespace="com.smbms.mapper.UserMapper">
	<select id="getList" resultType="User">
		select * from smbms_user
	</select>
</mapper>

4. 配置applicationContext.xml

在mybatis-spring-1.3.1中有一个MapperFactoryBean类,这个MapperFactoryBean又继承自SqlSessionDaoSupport,在使用SqlSessionDaoSupport的时候需要注入SqlSessionFactory

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

然后在UserService中注入UserMapper,具体配置如下

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

<bean id="userService" class="com.smbms.service.impl.UserServiceImpl">
	<property name="userMapper" ref="userMapper"></property>
</bean>

我们可以发现,在文件命名时,接口名UserMapper.java和UserMapper.xml配置文件名字一样,而且namespace和文件名也是绑定的,id和接口文件中的方法名称也是对应的。所以我们需要在applicationContext.xml配置文件中,有多少个接口,就需要写多少个MapperFactoryBean,这样太麻烦了,因此Mybatis进行了优化。

mybatis使用MapperScannerConfigurer自动扫描Mapper接口和映射文件,自动生成对应的MapperFactoryBean。只需要配一个basePackge属性,就可以自动扫描com.smbms.mapper下的mapper包中的文件,而且生成的bean的名称都会以当前类名的小驼峰形式命名。

实际上还需要在配置一个SqlSessionFactory属性,但是既然使用了mybatis开发,大家都知道需要SqlSessionFactory,因此mybatis自动注入了。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.smbms.mapper"/>
</bean>

此外,我们还发现,基于接口的Mapper中,并不在需要我们自己去配置SqlSession了,因此之前的下面这段代码在基于接口的开发中不再需要了

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory"/>
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值