Spring 04 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 getAllUsers() throws IOException {
		SqlSessionFactory factory =  new SqlSessionFactoryUtils().getInstance();
		SqlSession session = factory.openSession();
		UserMapper allUsers =session.getMapper(UserMapper.class) ;
		List  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 后进行相关操作。




   
   
           
               classpath:db.properties
           

   









 
   

 


   


   


 

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

二、使用步骤

0. 加载 db.properties

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

Spring 04 Spring 整合 Mybatis_第1张图片

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的形式加载)



    
    
            
               classpath:db.properties
            
    








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

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

代码如下(示例):


  
   
  


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

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


   


   

开始测试,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);
		
	}

效果图:

Spring 04 Spring 整合 Mybatis_第2张图片


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



 
   

 

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

三、补充

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



 
 
 

 

 第三种方法:

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

Spring 04 Spring 整合 Mybatis_第3张图片

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



 
 
  value="SqlSessionFactory">

class = "priv.apply.service.UserService">
   

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




   
   
           
               classpath:db.properties
           

   









 
   

 




 


 
 
 


   


 

你可能感兴趣的:(Spring,Mybatis,mybatis,spring,java)