Spring+MybatisSpring整合Mybatis

Posted yongh701

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring+MybatisSpring整合Mybatis相关的知识,希望对你有一定的参考价值。

在《【Mybatis】Helloworld》(点击打开链接)大家看到使用Mybatis需要撰写一个数据库连接与配置的xml文件,而Spring具体整合JDBC的功能,具体见《【Spring】整合JDBC连接数据库》(点击打开链接),可以代替Mybatis连接数据库和配置数据库,而直接Mybatis对数据库增删改查的优良特性,这在Java尤其在Javaee的编程具有明显优势,下面举一个例子说明Spring如何整合Mybatis。


一、所需要的jar包。

除了《【Spring】Spring3.x的下载与配置》(点击打开链接)中需要的Spring包,和《【Mybatis】Helloworld》(点击打开链接)需要的Mybatis包,还需要在https://github.com/mybatis/spring/releases下载一个Spring连接Mybatis的jar包mybatis-spring-1.3.1.jar:


整合之后lib文件夹如下所示,同时,在Eclipse的Java工程加载所有的jar包。



二、制作过程

由于数据库和Java交流没有Jsp什么事情,所以这里用最简单的Javase工程做例子。处理的还是这样早已举个栗子举烂的mysql中test数据库的User用户表:


先贴上工程目录结构。


对比于《【Mybatis】Helloworld》(点击打开链接)的目录结构基本大同小异,唯一的不同,Spring整合Mybatis能减少部分代码量,同时也好管理。

1、首先是Spring的核心applicationContext.xml,这个文件,首先利用《【Spring】整合JDBC连接数据库》(点击打开链接),用Spring填充org.springframework.jdbc.datasource.DriverManagerDataSource中该被注入的变量,赋予相应的值则完成,其次在利用org.mybatis.spring.SqlSessionFactoryBean这个类,初始化数据源,然后再初始化configLocation,指明初始化文件是configuration.xml,Mybatis的初始化完成,最后是在org.mybatis.spring.mapper.MapperScannerConfigurer指明数据库接口的所在的包,这里是test.dao。通过Mybatis的自动扫描,在其它类就能直接使用dao了。尤其在Javaee,Spring自动启动之后,给dao配上getter和setter,就会自动注入好了。并初始化数据库操作的session。这些都是Spring整合Mybatis的指定动作,固定格式,知道替换相应的值适配你的数据库和Java工程即可。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd ">
	<!-- Spring连接的JDBC数据源 -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url"
			value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true" />
		<property name="username" value="root" />
		<property name="password" value="root" />
	</bean>
	<!-- 指出Mybatis的核心配置文件,关于数据库表和Java文件的映射写在里面 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="configuration.xml"></property>
	</bean>
	<!-- 指出数据库接口方法所在的包 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
		autowire="byName">
		<property name="basePackage" value="test.dao" />
		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
	</bean>
</beans> 

2、接下来是Mybatis的核心配置文件configuration.xml,这个文件由于有Spring的存在,已经不需要大篇幅在<typeAliases><environments>节点大篇幅写Mybatis连接数据源的关系,毕竟一切关于宏观上的事情都交给了Spring。Mybatis只要管好自己,书明罗列出数据库表和Java的映射关系就行。这里有几个表就指明有几个mapper.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>
	<!-- 指明在user这个表中所包含常用sql方法,test/mapper/User.xml是一个指明java方法和sql语法联系的xml文件 -->
	<mappers>
		<mapper resource="test/mapper/User.xml" />
	</mappers>
</configuration>   

3、然后在test.mapper这个包下写一个关于User表,数据库和Java的映射关系的mapper文件User.xml,具体是写明test.dao包下的数据库接口里面Java方法匹配的,关于此表的Sql查询语句。

<?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="test.dao.UserDao">
	<select id="findAllUsers" resultType="test.entity.User">
		select * from user
	</select>
</mapper> 

同时贴上数据库接口类UserDao.java:

package test.dao;

import java.util.List;

import test.entity.User;

public interface UserDao 
	public List<User> findAllUsers();


和没什么好说的实体类User.java:

package test.entity;

public class User 
	
	private Integer id;
	private String username;
	private String password;

	public Integer getId() 
		return id;
	

	public void setId(Integer id) 
		this.id = id;
	

	public String getUsername() 
		return username;
	

	public void setUsername(String username) 
		this.username = username;
	

	public String getPassword() 
		return password;
	

	public void setPassword(String password) 
		this.password = password;
	



上述三者的关系如下:


4、最后,这样配好之后,就能够在其余的Java类随便调用UserDao.java中的findAllUser()方法,得到一个充满User表的List了,比如测试的SpringMybatis.java,如下代码:

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import test.dao.UserDao;
import test.entity.User;

public class SpringMybatis 

	public static void main(String[] args) 
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
				"applicationContext.xml");// 初始化spring
		UserDao userDao = (UserDao) applicationContext.getBean("userDao");// 初始化userDao这个数据库接口类,由于Mybatis自动扫描的,可以直接拿"userDao"(首字母要小写),无须在配个idapplicationContext.xml
		List<User> user_list = new ArrayList<User>();
		user_list = userDao.findAllUsers();
		for (User user : user_list) // jdk1.5+的foreach打印,省事,不用写这么多代码了
			System.out.println(user.getId() + "\\t" + user.getUsername() + "\\t"
					+ user.getPassword());
		
		((ConfigurableApplicationContext) applicationContext).close();// 关闭Spring避免警告
	



运行结果如下所示:


将表的数据取过来,完美打印了。

以上是关于Spring+MybatisSpring整合Mybatis的主要内容,如果未能解决你的问题,请参考以下文章

mybatisSpring整合(eclipse)以及事务管理

Spring+SpringMVC+MybatisSpring+SpringMVC+Mybatis实现前端到后台完整项目

SSM的整合

spring框架学习:Spring整合Web项目整合Mybatis

Spring的事务配置+mybatis整合

Spring的事务配置+mybatis整合