2017/12/28
Spring和Mybatis的核心是什么?
Spring的核心:IOC和AOP;单干的时候,就新建了一个applicationContext.xml,然后添加各种各样的Bean,与之对应的必要的实体类;的的确确省事省心,避免了大量冗余代码;
Mybatis的核心:SQL与实体对象的映射;单干的时候,就新建了一个mybatis-config.xml作全局配置,mapper.xml作sql映射配置,然后添加各个实体类和相关的操作接口,的的确确方便,避免一次次的jdbc连接断开;
那么要如何将两者结合到一起呢,它们之间的依赖关系是什么?
回答:
(1)spring的ioc机制,可以接管组件创建工作和依赖管理,所以“整合”主要工作就是把Mybatis框架涉及的核心组件配置到Spring容器里;
(2)Spring是老大,Mybatis是手下;业务逻辑对象依赖基于Mybatis技术实现的DAO对象,核心是获取SQLSession实例。在此之前还有依赖SQLSessionFactory实例。在此之前需要依赖SQLSessionFactoryBuilder从数据源、SQL映射文件等信息构建。
随着引入Spring框架,以上流程将全部移交给Spring,发挥Spring框架Bean容器的作用,接管创建工作和管理组件生命周期,对组件之间的依赖关系进行解耦合管理。
下面是Spring框架对Mybatis框架的一个整合示例,主要方便各位捋顺思路,抛砖引玉。
【1】导入所需的 jar 包
图1
开发文件框架:
图2
【2】建立开发目录,创建实体类User.java:
package com.smbms.pojo;
import java.util.Date;
import java.util.List;
public class User implements java.io.Serializable{
private Integer id;
private String userCode;
private String userName;
private String userPassword;
private Integer gender;
private Date birthday;
private String phone;
private String address ;
private Integer userRole;
private Integer createdBy;
private Date creationDate;
private Integer modifyBy;
private Date modifyDate;
private String userRoleName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getUserRole() {
return userRole;
}
public void setUserRole(Integer userRole) {
this.userRole = userRole;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
public String getUserRoleName() {
return userRoleName;
}
public void setUserRoleName(String userRoleName) {
this.userRoleName = userRoleName;
}
public User() {
super();
// TODO 自动生成的构造函数存根
}
}
【3】创建实体类User的DAO接口UserMapper.java:
package com.smbms.pojo;
import java.util.List;
import com.smbms.pojo.User;
public interface UserMapper {
/**
* 下面定义的方法是用于--Mybatis/Spring整合练习。
* */
public List<User> getUserList(User user);
}
【4】新建UserMapper.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="com.smbms.pojo.UserMapper">
<!-- 下面定义的映射语句是用于Mybatis/Spring整合练习。 -->
<resultMap type="com.smbms.pojo.User" id="userlist">
<result property="userRoleName" column="roleName"/>
</resultMap>
<select id="getUserList" parameterType="com.smbms.pojo.User" resultMap="userlist">
select u.* ,r.roleName from smbms_user u ,smbms_role r
where u.userName like CONCAT('%',#{userName},'%')
and u.userRole = #{userRole} and u.userRole = r.id
</select>
</mapper>【5】新建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.smbms.pojo"/>
</typeAliases>
</configuration>【6】实现Spring对Mybatis的整合--
6.1 配置数据源,添加两个jar包(commons-logging-1.0.4.jar + commons-dbcp-1.4.jar),新建applicationContext-mybatis.xml 配置文件 ;
在 applicationContext-mybatis.xml 进行数据源配置代码:
<!-- 数据源配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url">
<value><![CDATA[jdbc:mysql://127.0.0.1:3306/test?
useUnicode=true&characterEncoding=utf-8]]></value>
</property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>
6.2 配置SqlSessionFactoryBean;
在 applicationContext-mybatis.xml 进行SqlSessionFactoryBean配置代码:
<!-- SqlSessionFactoryBean 配置 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源组件 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 引用Mybatis配置文件的配置 -->
<property name="configLocation"
value="classpath:mybatis-config.xml"></property>
<!-- 配置SQL映射文件信息 ,逐个列出SQL映射文件麻烦,所以使用 mapperLocations 属性扫描加载SQL映射文件-->
<property name="mapperLocations">
<list>
<value>classpath:com/smbms/pojo/**/*.xml</value>
</list>
</property>
</bean>
6.3 配置SqlSessionTemplate:
Mybatis-Spring整合包提供了SQLSessionTemplate类,实现了Mybatis的SQLSession接口,可以替换Mybatis原有的SQLSession实现类,提供数据库访问操作。所以,配置SqlSessionTemplate,并在UserMapper实现类中使用的代码;
新建UserMapperImpl.java文件:
package com.smbms.pojo;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import com.smbms.pojo.User;
public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSession;
@Override
public List<User> getUserList(User user) {
return sqlSession.selectList("com.smbms.pojo.UserMapper.getUserList",user);
}
public SqlSessionTemplate getSqlSession() {
return sqlSession;
}
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public UserMapperImpl() {
super();
// TODO 自动生成的构造函数存根
}
public UserMapperImpl(SqlSessionTemplate sqlSession) {
super();
this.sqlSession = sqlSession;
}
}
在 applicationContext-mybatis.xml 进行SqlSessionTemplate配置代码:
<!-- 配置SQLSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
<!-- 配置DAO组件并进入SQLSessionTemplate实例 -->
<bean id="userMapper" class="com.smbms.pojo.UserMapperImpl">
<constructor-arg name="sqlSession" ref="sqlSessionTemplate"></constructor-arg>
</bean>【7】至此,配置工作大致完成,下面是业务文件的编写:
新建业务接口 UserService.java:
package com.smbms.pojo;
import java.util.List;
public interface UserService {
public List<User> findUsersWithConditions(User user);
}
新建业务接口实现类 UserServiceImpl.java:
package com.smbms.pojo;
import java.util.List;
public class UserServiceImpl implements UserService{
private UserMapper userMapper;
@Override
public List<User> findUsersWithConditions(User user) {
try{
return userMapper.getUserList(user);
}catch(RuntimeException e){
e.printStackTrace();
throw e;
}
}
public UserMapper getUserMapper() {
return userMapper;
}
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
}
在applicationContext-mybatis.xml 对业务类编写bean配置:
<!-- 配置业务Bean并注入DAO实例 -->
<bean id="userService" class="com.smbms.pojo.UserServiceImpl">
<property name="userMapper" ref="userMapper"></property>
</bean>【8】applicationContext-mybatis.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<!-- 数据源配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url">
<value><![CDATA[jdbc:mysql://127.0.0.1:3306/test?
useUnicode=true&characterEncoding=utf-8]]></value>
</property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>
<!-- SqlSessionFactoryBean 配置 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源组件 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 引用Mybatis配置文件的配置 -->
<property name="configLocation"
value="classpath:mybatis-config.xml"></property>
<!-- 配置SQL映射文件信息 ,逐个列出SQL映射文件麻烦,所以使用 mapperLocations 属性扫描加载SQL映射文件-->
<property name="mapperLocations">
<list>
<value>classpath:com/smbms/pojo/**/*.xml</value>
</list>
</property>
</bean>
<!-- 配置SQLSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
<!-- 配置DAO组件并进入SQLSessionTemplate实例 -->
<bean id="userMapper" class="com.smbms.pojo.UserMapperImpl">
<constructor-arg name="sqlSession" ref="sqlSessionTemplate"></constructor-arg>
</bean>
<!-- 配置业务Bean并注入DAO实例 -->
<bean id="userService" class="com.smbms.pojo.UserServiceImpl">
<property name="userMapper" ref="userMapper"></property>
</bean>
</beans>
【9】编写测试类 UserServiceImpTest.java(调用业务类的方法):
package com.smbms.pojo;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserServiceImpTest {
@SuppressWarnings("resource")
@Test
public void test() {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-mybatis.xml");
UserService userService = (UserService)ctx.getBean("userService");
User userCondition = new User();
userCondition.setUserName("mmb");
userCondition.setUserRole(110);
List<User> userList = new ArrayList<User>();
userList = userService.findUsersWithConditions(userCondition);
for(User userResult:userList){
System.out.println("testGetUserList userCode:"+userResult.getUserCode()+
"userName: "+userResult.getUserName()+
"userRole: "+userResult.getUserRole()+
"userRoleName: "+userResult.getUserRoleName()+
"userAddress: "+userResult.getCreationDate());
}
}
}
【10】输出结果:
testGetUserList userCode:test01userName: mmb02userRole: 110userRoleName: guan_li_yuanuserAddress: null
testGetUserList userCode:test01userName: mmb02userRole: 110userRoleName: guan_li_yuanuserAddress: null
testGetUserList userCode:test01userName: mmb02userRole: 110userRoleName: guan_li_yuanuserAddress: null
testGetUserList userCode:test01userName: mmb02userRole: 110userRoleName: guan_li_yuanuserAddress: null
testGetUserList userCode:test01userName: mmb02userRole: 110userRoleName: guan_li_yuanuserAddress: null
综上,以上是Spring对Mybatis的整合实例。注意特征:我们将Mapper接口实现了,然后调用方法才能访问数据库,是因为在实现类中有SqlSessionTemplate的存在。但是,之后我会总结另一个方法,将不用把接口实现,就能访问数据库,这也是Spring框架带来的好处。

1万+

被折叠的 条评论
为什么被折叠?



