mybatis和spring的整合

现有需求:要求查询user表的所有用户信息。

jar包准备:

依照数据库的表写好user实体类,略。

 dao层书写:

准备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">
<mapper namespace="com.bdqn.dao.UserMapper">
	<select id="queryUserList" resultType="user">
		select * from easybuy_user
	</select>
</mapper>

书写接口:

public interface UserMapper {
	public List<User>queryUserList();
}

 service层:

首先是UserService接口:

public interface UserService {
	public List<User>getUserList();
}

它的实现类,UserServiceImpl:

public class UserServiceImpl implements UserService {
	private UserMapper userDao;

	public UserMapper getUserDao() {
		return userDao;
	}

	public void setUserDao(UserMapper userDao) {
		this.userDao = userDao;
	}

	public List<User> getUserList() {
		// TODO Auto-generated method stub		
		return userDao.queryUserList();
	}
	
}

它有一个属性,UserMapper。

创建resource文件夹,准备配置文件,数据库配置文件,database.properties。mybatis的配置文件Mybatis-config.xml,spring的配置文件ApplicationContext.xml。

Mybatis-config.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>
	<package name ="com.bdqn.entity" />
</typeAliases>
	<mappers>
		<mapper resource="com/bdqn/dao/UserMapper.xml"/>
	</mappers>
</configuration>

方式一:在dao层增加UserMapperImpl实现类。这种方式符合我们以前的思维方式,通过创建实现类来创建对象,因为接口是不能实例化的,而我们又需要在service层引用该实例对象。

UserMapperImpl:

public class UserMapperImpl implements UserMapper {
private SqlSessionTemplate sqlSession;
	public SqlSessionTemplate getSqlSession() {
	return sqlSession;
}
public void setSqlSession(SqlSessionTemplate sqlSession) {
	this.sqlSession = sqlSession;
}
	public List<User> queryUserList() {
		// TODO Auto-generated method stub
		List<User> queryUserList = sqlSession.getMapper(UserMapper.class).queryUserList();
		return queryUserList;
	}
}

 sqlSessionTemplate负责管理MyBatis的SqlSession,调用SQL映射语句,实现对数据库的访问。由mybatis-spring.1.2.0.jar提供。可以理解是sqlSession。

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"    
       xmlns:p="http://www.springframework.org/schema/p" 
       xmlns:aop="http://www.springframework.org/schema/aop"  
       xmlns:context="http://www.springframework.org/schema/context" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
    	   http://www.springframework.org/schema/context/spring-context-3.2.xsd
    	   http://www.springframework.org/schema/aop
    	   http://www.springframework.org/schema/aop/spring-aop.xsd">
    	   <!-- 导入数据库配置文件 -->
    	<context:property-placeholder location="classpath:database.properties"/>
    	<!-- dbcp数据库连接池 -->
    	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    		<property name="driverClassName" value="${jdbc.driver}"/>
    		<property name="url" value="${jdbc.url}"/>
    		<property name="username" value="${jdbc.username}"/>
    		<property name="password" value="${jdbc.password}"/>
    	</bean> 
    	<!-- sqlSessionFactory -->
    	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    		<property name="dataSource" ref="dataSource"></property>
    		<property name="configLocation" value="classpath:Mybatis-config.xml"></property> 
    	</bean> 
    	<!-- sqlSession -->
    	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
    	</bean> 
    	<bean id="userDao" class="com.bdqn.dao.UserMapperImpl">
    		<property name="sqlSession" ref="sqlSession"></property>
    	</bean> 	
    	<bean id="userService" class="com.bdqn.service.UserServiceImpl">
    		<property name="userDao" ref="userDao"></property>
    	</bean>  
</beans>

 sqlSessionFactoryBean由mybatis-spring.1.2.0.jar提供。可以理解是sqlSessionFactory。

这种方式不会采用,通过创建实现类多次一举。

方式二:

采用数据映射器(MapperFactoryBean)的方式完成对数据库操作
根据Mapper接口获取Mapper对象,它封装了原有的SqlSession.getMapper()功能的实现

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"    
       xmlns:p="http://www.springframework.org/schema/p" 
       xmlns:aop="http://www.springframework.org/schema/aop"  
       xmlns:context="http://www.springframework.org/schema/context" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
    	   http://www.springframework.org/schema/context/spring-context-3.2.xsd
    	   http://www.springframework.org/schema/aop
    	   http://www.springframework.org/schema/aop/spring-aop.xsd">
    	   <!-- 导入数据库配置文件 -->
    	<context:property-placeholder location="classpath:database.properties"/>
    	<!-- dbcp数据库连接池 -->
    	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    		<property name="driverClassName" value="${jdbc.driver}"/>
    		<property name="url" value="${jdbc.url}"/>
    		<property name="username" value="${jdbc.username}"/>
    		<property name="password" value="${jdbc.password}"/>
    	</bean> 
    	<!-- sqlSessionFactory -->
    	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    		<property name="dataSource" ref="dataSource"></property>
    		<property name="configLocation" value="classpath:Mybatis-config.xml"></property> 
    	</bean> 
    	<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface" value="com.bdqn.dao.UserMapper"></property>
		<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
		</bean>
    	<bean id="userService" class="com.bdqn.service.UserServiceImpl">
    		<property name="userDao" ref="userDao"></property>
    	</bean>  
</beans>

不用创建接口的实现类。因为使用MapperFactoryBean创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。它有两个属性需要注入:1.mapperInterface,指定映射器,只能是接口类型。2.sqlSessionFactory,注入SqlSessionFactory以提供SqlSessionTemplate实例。因此原先的如下代码:

<!-- sqlSession -->
    	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
    	</bean> 
    	<bean id="userDao" class="com.bdqn.dao.UserMapperImpl">
    		<property name="sqlSession" ref="sqlSession"></property>
    	</bean> 	

就可以删除了。

方式三:
MapperScannerConfigurer

 采用方式二有一个问题:若映射器很多的话,相应的配置项也会很多。

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"    
       xmlns:p="http://www.springframework.org/schema/p" 
       xmlns:aop="http://www.springframework.org/schema/aop"  
       xmlns:context="http://www.springframework.org/schema/context" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
    	   http://www.springframework.org/schema/context/spring-context-3.2.xsd
    	   http://www.springframework.org/schema/aop
    	   http://www.springframework.org/schema/aop/spring-aop.xsd">
    	   <!-- 导入数据库配置文件 -->
    	<context:property-placeholder location="classpath:database.properties"/>
    	<!-- dbcp数据库连接池 -->
    	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    		<property name="driverClassName" value="${jdbc.driver}"/>
    		<property name="url" value="${jdbc.url}"/>
    		<property name="username" value="${jdbc.username}"/>
    		<property name="password" value="${jdbc.password}"/>
    	</bean> 
    	<!-- sqlSessionFactory -->
    	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    		<property name="dataSource" ref="dataSource"></property>
    		<property name="configLocation" value="classpath:Mybatis-config.xml"></property> 
    	</bean> 
		<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
			<property name="basePackage" value="com.bdqn.dao"></property>
		</bean>
    	<bean id="userService" class="com.bdqn.service.UserServiceImpl">
    		<property name="userDao" ref="userMapper"></property>
    	</bean>  
</beans>

MapperScannerConfigurer自动扫描指定包下的Mapper接口,并将它们直接注册为MapperFactoryBean

MapperScannerConfigurer递归扫描基准包下所有接口,若它们在SQL映射文件中定义过,则动态注册为MapperFactoryBean,如此即可批量产生映射器实现类。

basePackage属性:指定扫描的基准包

测试类:

public class Test1 {
	@Test
	public void test() {
	ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
	UserServiceImpl us = (UserServiceImpl) ctx.getBean("userService");
	List<User> userList = us.getUserList();
	for (User user : userList) {
		System.out.println("用户名:"+user.getLoginName());
	}
	}
}

测试结果:

猜你喜欢

转载自blog.csdn.net/anewmonkey/article/details/83305588