使用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&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>