MyBatis与Spring整合——通过官方文档进行最简单的整合

整合前先重新理下两个框架的基础的东西。
以前搭Hibernate那些,都是是自己看着别人已经搭好的视频,然后自己重新理了一次。这次Mybatis与Spring的整合。从最原始的官方文档开始搭起。要学的,是当这套东西没人搭过的时候,你自己一个人怎么搭起来。
包依赖用了maven,最后才放所有的包依赖吧。

MyBatis

MyBatis是什么,开源持久化框架。通过抽象jdbc模板代码提供简单的api交互简化持久层实现。
MyBatis的搭建了一下基础的东西还有折腾了一下注释和xml配置。
MyBatis实战——前身iBatis、基础环境搭建和如何"钓鱼" 和  MyBatis之resultMap的作用和xml配置折腾 

通过读取mybatis-config.xml,mybatis文件有相应的EmployeeMapper.xml(如果用的注释进行的映射,那么配置文件里面直接配置
带注释的接口类即可)EmployeeMapper映射了相应的JavaBean,通过SqlSessionFactory的实例化出来的SqlSession,执行对应方法,根据方法名EmployeeMapper.selectEmployee,回到EmployeeMapper.xml中找到和方法名相对应的id(注释方式的话找到接口类里面注释id对应的方法),根据sql语句,还有传入的参数,还有Bean,这几者的联系形成的映射,进行CURD操作。省去JDBC那些模板方法代码。

Spring

而Spring是什么,Spring也是开源框架。简化Java开发。主要功能是依赖注入和面向切面工程。
可以用JDBC的小例子来展示:参考Spring doc中的jdbc部分。
数据库先建了Employee的表

applicationContext.xml


	
		
		
		
		
	
	
        
    

TestSpringJDBC.java
public class TestSpringJDBC {
	private JdbcTemplate jt;


	public void setDataSource(DataSource dataSource) {
		this.jt = new JdbcTemplate(dataSource);
	}


	public int get() {
		int rowCount = this.jt.queryForObject("select count(*) from employee", Integer.class);
		return rowCount;
	}


	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		TestSpringJDBC t = ((TestSpringJDBC) context.getBean("TestSpringJDBC"));
		System.out.println("the number in employee"+t.get());
	}
}

这里并没有看到JdbcTemplate在构造方法中传入了什么,但他确实就是实现了。具体就是Spring帮你注入了你xml配置中的dataSource。

AOP的话先放着不用看。


两者的整合

再回到Mybatis与Spring整合的官方介绍。http://www.mybatis.org/spring/zh/index.html

需要加入mybatis-spring-x.x.x.jar包,要和 Spring 一起使用 MyBatis,你需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory 和至少一个数据映射器类。之前只有Mybatis的时候是通过SqlSessionFactory的实例化出来的SqlSession。


像前面文章写MyBatis刚开始搭建的时候一样:
一个model:省略set和get方法
public class Employee {
	private int id;
	private String first_name;
	private String last_name;
	private int salary;
}

一个Mapper:

public interface EmployeeMapper
{
	@Select("select * from employee where id = #{id}")
	Employee findEmployeeById(Integer a);
}


applicationContext.xml变为:





	
		
		
		
		
	


	
		
		
	


后面一个具体的实现我稍微改了下代码:

public class TestSpring {
	private EmployeeMapper userMapper;


	public EmployeeMapper getUserMapper() {
		return userMapper;
	}


	public void setUserMapper(EmployeeMapper userMapper) {
		this.userMapper = userMapper;
	}


	public Employee findEmployeeByID(int userId) {
		return this.userMapper.findEmployeeById(userId);
	}
}


是的,官方文档就在这里终止的,但是之前单独用Mybatis这样实现就可以了。
String configxml = "mybatis-config.xml";    
InputStream is = null;    
try {    
    is = Resources.getResourceAsStream(configxml);    
} catch (IOException e) {    
    e.printStackTrace();    
}    
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(is);    
SqlSession s = sf.openSession();    
EmployeeMapper employeeMapper =  s.getMapper(EmployeeMapper.class);  
Employee e =  employeeMapper.findEmployeeById(47);  
System.out.println(e.getFirst_name()); 

现在整合Spring要如何入手,这是要结合回之前写的JDBCTemplate的例子。
	
        
    

我们给TestSpringJDBC的JdbcTemplate变量传入具体的DataSource,
现在给TestSpring的userMapper传入具体的UserMapper。传入之前,我们先要注册这个Mapper,根据官方文档的关于Mapper注册的说明:


  
  

MapperFactoryBean处理SqlSession的创建和关闭,我们根据自己的例子改为:Mapper具体的实现类


		
		
	

再把Mapper注入到TestSpring的userMapper中。


		
			
		
	


TestSpring添加具体实现:
public static void main(String[] args) {
	ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	TestSpring t = ((TestSpring) context.getBean("test"));
	System.out.println(t.findEmployeeByID(45).getFirst_name());
}

这时候拿到的TestSpring实例t里面的userMapper已经是注入了MapperFactoryBean。

现在重新理一下思路。SqlSessionFactory 需要一个数据源DataSource,可以看成是一个连接数据库的配置。所以我们配置了DataSoruce和sqlSessionFactory。


Spring与Mybatis的整合里面,虽然现在具体不知道MapperFactoryBean的具体实现,但是通过文档的第六章注入映射器知道SqlSession的创建和关闭交由它,还有创建的代理类实现了UserMapper接口,并且注入到应用程序中。
这就是我们为什么这样配置的一个思路。


最后通过整合Spring,我们用了3行代码做到单独用Mybatis时11行代码做到的东西。


maven的包依赖:


  4.0.0
  ckc
  Spring4Mybatis
  war
  0.0.1-SNAPSHOT
  Spring4Mybatis Maven Webapp
  http://maven.apache.org

		
			junit
			junit
			4.11
			test
		
		
		
			jstl
			jstl
			1.1.2
		
		
		
			commons-lang
			commons-lang
			1.0
		
		
		
		
			org.mockito
			mockito-all
			1.9.5
		
	
		
		
			org.slf4j
			slf4j-api
			1.7.21
		
		
		
			log4j
			log4j
			1.2.17
		
		
		
			org.slf4j
			slf4j-log4j12
			1.7.21
		

		
		
			org.hamcrest
			hamcrest-library
			1.2
		
		
		
			org.apache.commons
			commons-lang3
			3.4
		
		
		
		    mysql
		    mysql-connector-java
		    5.1.34
		
		
			javax.servlet
			javax.servlet-api
			3.1.0
			provided
		
		
		
			taglibs
			standard
			1.1.2
		
		
			org.hibernate
			hibernate-validator
			4.2.0.Final
		

		
			javax.validation
			validation-api
			1.0.0.GA
		

		
			org.springframework
			spring-jdbc
			4.1.6.RELEASE
		
		
			org.springframework
			spring-core
			4.1.4.RELEASE
		
		
			org.springframework
			spring-web
			4.1.4.RELEASE
		
		
			org.springframework
			spring-test
			4.1.4.RELEASE
		
		
			org.springframework

			spring-webmvc
			4.1.4.RELEASE
		
		
			org.springframework
			spring-test
			4.1.6.RELEASE
		
		
			aspectj
			aspectjrt
			1.5.4 
		
		
			aspectj
			aspectjweaver
			1.5.4 
		
		
			com.fasterxml.jackson.core
			jackson-databind
			2.4.0
		
		
			org.mybatis
			mybatis
			3.2.1
		
		
			net.rossillo.mvc.cache
			spring-mvc-cache-control
			1.1.1-RELEASE
			compile
		
		
		
		    org.mybatis
		    mybatis-spring
		    1.2.2
		
		
	
  
    Spring4Mybatis
  


这次完全没看别人搭建的代码,看着官方文档加上自己的理解还有不断的试。写出了文档里面没有说明的
可以运行看到整合结果的代码。

你可能感兴趣的:(Java框架)