Spring 04 Spring 整合 Mybatis

本文详细介绍了如何在Spring中整合MyBatis,包括引入相关jar包、配置数据库信息、创建SqlSessionFactory以及三种不同的DAO层实现方式。通过Spring管理MyBatis,可以实现对数据库操作的便捷控制。

Spring 与其他框架整合到一起,Spring永远是老大,由Spring整合其他框架

目录

前言

一、引入相关jar依赖包

 1.mybatis简单的回顾

2.spring 整合 mybatis 的原理

二、使用步骤

0. 加载 db.properties

1.在SpringIoc容器中 加载 JDBC 信息 

2.在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory

3.2.在SpringIoc容器中注入 service & DAO 

三、补充


Spring 整合 mybatis 测试源码


前言

 Mybatis通过使用SqlSessionFactory对象实现数据库的CRUD, Spring要想实现对 Mybatis 的整合,就需要管理该对象 。直接创建Java项目即可进行测试练习,要实现二者整合,需要许多jar包

处理mybatis 需要将 类-表 实现映射,之后 配置config.xml文件,其中的数据库信息和加载映射文件的信息,现将二者清除,相当于新建了一个空的配置文件 。 将mapper文件实现类-表映射;

新建spring的applicationContext.xml配置文件,由于mybatis是通过从config.xml文件产生的对象为 SqlSessionFactory,因此要实现spring整合mybatis,要将数据库配置信息从config.xml文件转移到spring的配置文件 applicationContext.xml 中  在该 spring 的I OC 容器中通过使用bean标签配置实现自动创建mybatis的核心类 SqlSessionFactory,在其中实现将config文件加载和DataSource(数据源)配置。

最后spring产生Mapper对象,实现完全整合控制mybatis(三种方法)。

  1. DAO层实现类 继承 SqlSessionDaoSupport类(该类提供了SqlSession类从而产生Mapper)
  2. 省略第一种方式的生成mapper对象实现类MapperFactoryBean,
  3. 在 2. 的方式基础上实现批量配置实现类MapperScannerConfigurer


 spring基础包 + spring扩展包 + mybatis包 + mybatis-spring.jar包 + 其他(commons-*.jar)

一、引入相关jar依赖包

 spring-core.jar spring-bean.jar  spring-aop.jar spring-expression.jar spring-context.jar                     spring-context-support.jar spring-tx.jar spring-jdbc.jar    spring-web.jar(非web项目可不用)                mybatis.jar  log4j.jar   commons-dbcp.jar  commons-pool.jar                                                mysql-connector-java-5.1.36-bin.jar        mybatis-spring-1.3.2.jar(mvn下载)

 1.mybatis简单的回顾

引入相关的jar包后,开始进行spring与mybatis的整合,不论spring与任何框架整合,spring永远都是 “老大” ,都是spring整合别人。

首先回顾一下mybatis的基础知识。mybatis是一款用以快速实现Java操作数据库实现对数据库中数据的CRUD ,通过使用xml文件(config.xml文件)配置JDBC信息,实现Java连接数据库的封装。conf.xml ->SqlSessionFacotry 

通过使用 mapper.xml 文件与Java对象,将CRUD的方式 通过使用 接口方法+mapper.xml 文件 的形式将相关的SQL语句进行执行。通过mapper.xml将 类、表建立映射关系。                                      最后,mybatis 可以在加载完config文件后创建工厂,实现对象的方法调用


// 分别使用普通方式与 反向代理 方式 实现Java操作数据库实现 CRUD
package priv.practice.orm;

import java.io.IOException;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import priv.practie.mapper.*;

public class ProxyApply {
	
	public static void query() throws IOException {
		String source = "mybatis-config.xml";
		
		SqlSessionFactory  factory = new SqlSessionFactoryBuilder().build
			   (Resources.getResourceAsReader(source) );
		SqlSession session=factory.openSession();
		
		String querySql ="priv.practie.mapper.UserMapper.selectById";
		User user=(User) session.selectOne(querySql, 5);
		user.toString();
	}
	
	public static void queryProxy(int id) throws IOException {
		 SqlSessionFactoryUtils utils = new SqlSessionFactoryUtils();
		 SqlSessionFactory  factory = utils.getInstance();
		 
		 SqlSession session=factory.openSession();
		 UserMapper userMapper = session.getMapper(UserMapper.class);
		 User user= userMapper.selectById(id);
		 user.toString();
		 session.close();
	}

	
//  add user  addUser(user)  name + pwd
	public static void addUser(User user) throws IOException {
		SqlSessionFactory utils = new SqlSessionFactoryUtils().getInstance();
		SqlSession session = utils.openSession();
		UserMapper adduser = session.getMapper(UserMapper.class);
		adduser.addUser(user);
		session.commit();
		session.close();
		
	}
	
	
	//delete User
	public static void deleteUser(String name) throws IOException {
		SqlSessionFactory factory = new SqlSessionFactoryUtils().getInstance();
		SqlSession session = factory.openSession();
		UserMapper dUser = session.getMapper(UserMapper.class);
		dUser.deleteUser(name);
		session.commit();
		session.close();
	}
	
//	selectAllUsers
	public static List<User> getAllUsers() throws IOException {
		SqlSessionFactory factory =  new SqlSessionFactoryUtils().getInstance();
		SqlSession session = factory.openSession();
		UserMapper allUsers =session.getMapper(UserMapper.class) ;
		List<User>  users =allUsers.selectAllUsers();
		System.out.println(users);
		 
		session.close();
		return users;
	}
	
	
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
// 		query() ;
// 		queryProxy(1) ;

	
// 	User adduser = new User("ET","aliens");//"me","ffff"
//		addUser(adduser);
//		queryProxy(12) ;
//		
		
	//delete User
//		deleteUser("me");
		
		  getAllUsers();
		
		
	
	}

}

2.spring 整合 mybatis 的原理

config.xml 存储2大类信息  数据库配置信息(JDBC) & 映射文件(mapper.xml)信息。                    1.产生 SqlSessionFactory 所需要的数据库信息 在spring的配置文件(applicationContext.xml)以bean的形式配置。

首先要将原mybatis中config.xml文件的JDBC信息加载到spring的配置文件(applicationContext)中,再 产生 mybatis的核心类 SqlSessionFactory  factory 后进行相关操作。


<!-- 加载 db.properties  -->
<bean id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <!-- db.properties 文件在 src下,就是默认的 类路径 -->
    <property name="locations">
            <array>
               <value>classpath:db.properties</value>
            </array>
    </property>
</bean>

<!-- 配置数据库信息,取代mybatis中conf.xml中的dataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"  value="${driver}"></property>
<property name="url"  value ="${url}"></property>
<property name="username"  value="${username}"></property>
<property name="password"  value= "${password}"></property>
</bean>

<!--在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory   -->
<bean id="SqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource"  ref="dataSource"></property>
  <!--  加载mybatis的配置文件conf
  <property name="configLocation" value="classpath:config.xml"></property>
--> 
<!--加载mapper文件  * 可加载多个 -->
  <property name="mapperLocations" value="priv/sm/mapper/*.xml"></property>

</bean>

<bean id ="userDaoId" class="priv.apply.dao.UserDaoImpl">
    <property name="sqlSessionFactory"  ref="SqlSessionFactory"></property>
</bean>

<bean id="userServiceId" class = "priv.apply.service.UserService">
    <property name="userDao" ref="userDaoId"></property>
</bean>
</beans>
 

生成  SqlSessionFactory   后产生 mybatis的动态代理对象  Mapper 有3种方法 

二、使用步骤

0. 加载 db.properties

在src目录下新建 db.properties文件,位置与相关文件结构 如图

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/person
username=root
password=root

1.在SpringIoc容器中 加载 JDBC 信息 

在mybatis的conf.xml中 主要就是JDBC的配置信息和加载mapper.xml的文件信息。先把JDBC的信息加载到applicationContext.xml文件中。(db.properties也通过bean的形式加载)

<!-- 加载 db.properties  -->
<bean id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <!-- db.properties 文件在 src下,就是默认的 类路径 -->
    <property name="locations">
            <array>
               <value>classpath:db.properties</value>
            </array>
    </property>
</bean>

<!-- 配置数据库信息,取代mybatis中conf.xml中的dataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"  value="${driver}"></property>
<property name="url"  value ="${url}"></property>
<property name="username"  value="${username}"></property>
<property name="password"  value= "${password}"></property>
</bean>

2.在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory

要想产生 SqlSessionFactory ,新建bean id为SqlSessionFactory,class固定值为 SqlSessionFactoryBean ,其中两个属性 1.dataSource(引用之前的JDBC信息) & 2.configLocation(加载conf文件,之后可以将mapper信息加载进来后省略)。

代码如下(示例):

<bean id="SqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource"  ref="dataSource"></property>
  <!--  加载mybatis的配置文件conf--> 
  <property name="configLocation" value="classpath:config.xml"></property>

</bean>

该处使用的configLocation可以在后期省略,使用其他方式直接将 mybatis的conf.xml中的mapper信息: <mapper resource="priv/sm/mapper/UserMapper.xml" /> 加载进IOC容器。

3.2.在SpringIoc容器中注入 service & DAO 

<bean id ="userDaoId" class="priv.apply.dao.UserDaoImpl">
    <property name="sqlSessionFactory"  ref="SqlSessionFactory"></property>
</bean>

<bean id="userServiceId" class = "priv.apply.service.UserService">
    <property name="userDao" ref="userDaoId"></property>
</bean>

开始测试,main 代码如下:

		 ApplicationContext  applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
				
		
		UserService  service =(UserService)applicationContext.getBean( "userServiceId");
		User user = new User("zds16","016");
		
		service.addService(user);

dao层除了要实现其接口,还有继承某个特定的类 SqlSessionDaoSupport,代码如下:

public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {
//extends SqlSessionDaoSupport 获取sqlsession
	@Override
	public void addUser(User user) {
		// TODO Auto-generated method stub
		SqlSession sqlSession = super.getSqlSession() ;
		UserMapper userDao =sqlSession.getMapper(priv.sm.mapper.UserMapper.class);
		userDao.addUser(user);
		
	}

效果图:


另外,可以将mybatis的配置文件省略,直接在IOC中加载mapper信息,配置如下

<!--在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory   -->
<bean id="SqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource"  ref="dataSource"></property>
  <!--  加载mybatis的配置文件conf
  <property name="configLocation" value="classpath:config.xml"></property>
--> 
<!--加载mapper文件  * 可加载多个 -->
  <property name="mapperLocations" value="priv/sm/mapper/*.xml"></property>

</bean>

 不在使用mybatis的config.xml文件,直接在产生 SqlSessionFactory 时加载,“*”表示可以加载多个mapper文件。

三、补充

除了上述通过使用dao层的具体实现类实现了整合,可以省略掉DAO层的实现类注入到IOC,可以将IOC容器中的直接使用 class="org.mybatis.spring.mapper.MapperFactoryBean" 自动生成dao层的bean,对应类的接口可以 使用 mapperInterface 属性名配置。其他代码不变。配置信息如下:

<!-- 第二种方法可以直接省略DAO的实现类,使用 MapperFactoryBean 自动生成 sqlSessionFactory-->
<bean  id ="userDaoId"  class="org.mybatis.spring.mapper.MapperFactoryBean">
 <!-- 由于不直接注入 UserDaoImpl,需要注明该类对应的接口-->
 <property name="mapperInterface"  value="priv.sm.mapper.UserMapper"></property>
  <property name="sqlSessionFactory"  ref="SqlSessionFactory"></property>
</bean>
 

 第三种方法:

使用包扫描一次可以加载多个mapper。配置信息基本如下图:

注意要产生sqlSessionFactory,在第三种的配置中有差异,name 应该修改为 sqlSessionFactoryBeanName ,ref修改为value 。 将service的bean中引用的userID更改为借口名(首字母小写),上方的bean不写id,直接只写class配置。属性中的包名有多个,通过使用逗号分隔。 <bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">。修改后配置如下

<!-- 第三种方法 直接使用扫描包 批量配置DAO层 实现类 -->
<bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
 <!-- 指定批量产生多个mapper对应的包 -->
 <property name= "basePackage"  value=" priv.sm.mapper"></property>
  <property name="sqlSessionFactoryBeanName"  value="SqlSessionFactory"></property>
</bean>

<bean id="userServiceId"  class = "priv.apply.service.UserService">
    <property name="userDao" ref="userMapper"></property>
</bean>

最终版的applicationContext.xml文件如下:


<!-- 加载 db.properties  -->
<bean id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <!-- db.properties 文件在 src下,就是默认的 类路径 -->
    <property name="locations">
            <array>
               <value>classpath:db.properties</value>
            </array>
    </property>
</bean>

<!-- 配置数据库信息,取代mybatis中conf.xml中的dataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"  value="${driver}"></property>
<property name="url"  value ="${url}"></property>
<property name="username"  value="${username}"></property>
<property name="password"  value= "${password}"></property>
</bean>

<!--在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory   -->
<bean id="SqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource"  ref="dataSource"></property>
  <!--  加载mybatis的配置文件conf
  <property name="configLocation" value="classpath:config.xml"></property>
--> 
<!--加载mapper文件  * 可加载多个 -->
  <property name="mapperLocations" value="priv/sm/mapper/*.xml"></property>

</bean>
<!-- 第一种方法 配置DAO层的实现类,继承父类注入产生 sqlSessionFactory
<bean id ="userDaoId" class="priv.apply.dao.UserDaoImpl">
    <property name="sqlSessionFactory"  ref="SqlSessionFactory"></property>
</bean>
-->
<!-- 第二种方法可以直接省略DAO的实现类,使用 MapperFactoryBean 自动生成 sqlSessionFactory
<bean  id ="userDaoId"  class="org.mybatis.spring.mapper.MapperFactoryBean">-->
 <!-- 由于不直接注入 UserDaoImpl,需要注明该类对应的接口
 <property name="mapperInterface"  value="priv.sm.mapper.UserMapper"></property>
  <property name="sqlSessionFactory"  ref="SqlSessionFactory"></property>
</bean>
-->
<!-- 第三种方法 直接使用扫描包 批量配置DAO层 实现类 -->
<bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
 <!-- 指定批量产生多个mapper对应的包 -->
 <property name= "basePackage"  value=" priv.sm.mapper"></property>
  <property name="sqlSessionFactoryBeanName"  value="SqlSessionFactory"></property>
</bean>

<bean id="userServiceId"  class = "priv.apply.service.UserService">
    <property name="userDao" ref="userMapper"></property>
</bean>
</beans>
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值