1Spring整合MyBatis的准备工作
1.1在项目中加入Spring,MyBatis及相关的JAR文件
在使用Spring整合MyBatis之前,首先下载相关的Jar文件,我将本次整合的所需的jar放在云盘中大家自行下载
链接:https://pan.baidu.com/s/1z0Xinx5unAnhnFwHbdDhpw
提取码:mlcv
1.2建立开发目录结构,创建实体类
在cn.smbms.pojo包下,创建实体类User.
package cn.smbms.pojo;
import java.util.Date;
public class User {
private Integer id; //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 Integer age;//年龄
private String userRoleName; //用户角色名称
public String getUserRoleName() {
return userRoleName;
}
public void setUserRoleName(String userRoleName) {
this.userRoleName = userRoleName;
}
public Integer getAge() {
/*long time = System.currentTimeMillis()-birthday.getTime();
Integer age = Long.valueOf(time/365/24/60/60/1000).IntegerValue();*/
Date date = new Date();
Integer age = date.getYear()-birthday.getYear();
return age;
}
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;
}
}
1.3创建数据访问接口
在cn.smbms.dao.user包中创建实体类User对应的DAO接口UserMapper.这里添加一个根据用户名和角色查询用户信息的方法,其他方法可以在需要时添加.
package cn.smbms.dao.user;
import java.util.List;
import cn.smbms.pojo.User;
public interface UserMapper {
public List<User> getUserList(User user);
}
1.4配置SQL映射文件
同样在cn.smbms.dao.user包中,为UserMapper配置SQL语句映射文件UserMapper.xml,实现指定的查询映射.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.smbms.dao.user.UserMapper">
<!-- 当数据库的字段信息与对象的属性不一致是需要通过resultMaps -->
<resultMap type="User" id="userList">
<result property="userRoleName" column="roleName"/>
</resultMap>
<!-- 查询用户列表参数(参数:对象入参) -->
<select id="getUserList" resultMap="userList">
select u.*,r.roleName from smbms_user u,smbms_role r where u.userRole = r.id
<if test="userName!=null and userName!=''">
and u.userName LIKE CONCAT('%',#{userName},'%')
</if>
<if test="userRole!=null">
and u.userRole= #{userRole}
</if>
</select>
</mapper>
1.5配置MyBatis配置文件
编写MyBatis配置文件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="cn.smbms.pojo"/>
</typeAliases>
</configuration>
注意以上代码中的MyBatis配置文件和之前相比简单了许多,这是因为Spring可接管MyBatis配置信息的维护工作,这里我们把选择数据源配置和SQL映射信息转移至Spring配置文件中进行管理,以了解如何在Spring中配置MyBatis
2实现Spring对MyBatis的整合
2.1配置数据源
此处的jar文件在最前面的百度云链接里面
建立Spring配置文件applicationContext-mybatis.xml配置数据源的关键代码如下:
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
2.2配置SqlSessionFactoryBean
(1)配置完数据源,就可以在次基础上集合SQL映射文件信息以及MyBatis配置文件中的其他信息,创建SqlSessionFactory实例;
(2)在MyBatis只给你,SqlSessionFactory的实例需要使用SqlSessionFactoryBuilder创建;而在集成环境中,则可以使用MyBatis-Spring整合包中的SqlSessionFactoryBean来代替,SqlSessionFactoryBean封装了使用SqlSessionFactoryBuilder创建SqlSessionFactory的过程,我们可以在Spring中以配置文件的形式,通过配置SqlSessionFactoryBean获得SqlSessionFactory实例;
<!-- 配置sqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源组件 -->
<property name="dataSource" ref="dataSource"/>
<!-- 引用MyBatis配置文件中的配置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 配置SQL 映射文件信息-->
<property name="mapperLocations">
<list>
<value>classpath:cn/smbms/dao/**/*.xml</value>
</list>
</property>
</bean>
通过以上的xml文件中配置的id为sqlSessionFactory的Bean即可获得SqlSessionFactory实例;
2.3使用SqlSessionTemplate实现数据库操作
对于MyBatis而言,得到了SqlSessionFactory实例,就可以进一步获取SqlSession实例进行数据库操作了,而在集成环境中,为了更好地使用sqlsession,充分利用Spiring框架提供的服务,MyBatis-Spring整合包提供了SqlSessionTemplate类;
SqlsessionTemplate类实现了MyBatis的SqlSession接口,可以替换MyBatis中原有的Sqlsession实现类提供数据库访问操作.使用SqlSessionTemplate可以更好地与Spring服务融合并简化部分流程化的工作,可以保证当前Spring事务相关联,自动管理会话的生命周期,包括必要的关闭,提交和回滚操作;
配置SqlSessionTemplate并在UserMapper实现类中使用的代码如下:
package cn.smbms.dao.user;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import cn.smbms.pojo.User;
public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSession;
public SqlSessionTemplate getSqlSession() {
return sqlSession;
}
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<User> getUserList(User user) {
// TODO Auto-generated method stub
return sqlSession.getMapper(UserMapper.class).getUserList(user);
}
}
Spring配置文件中的关键代码如下:
<!-- 配置SqlSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!-- 配置DAO组件并注入SqlSessionTemplate示例 -->
<bean id="userMapper" class="cn.smbms.dao.user.UserMapperImpl">
<property name="sqlSession" ref="sqlSessionTemplate"/>
</bean>
2.4编写业务逻辑代码并测试
完成DAO组件的装配,接下来就可以在cn.smbms.service.user包中开发业务组件并通过Spring装配,代码如下:
package cn.smbms.service.user;
import java.util.List;
import cn.smbms.dao.user.UserMapper;
import cn.smbms.pojo.User;
/**
* @author Administrator
*
*/
public class UserServiceImpl implements UserService{
private UserMapper userMapper; //声明UserMapper接口引用
@Override
public List<User> getUserList(User user) {
// TODO Auto-generated method stub
return userMapper.getUserList(user); //调用DAO类方法实现查询
}
public UserMapper getUserMapper() {
return userMapper;
}
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
}
Spring中配置文件的关键代码如下:
<!-- 配置业务Bean并注入DAO示例 -->
<bean id="userService" class="cn.smbms.service.user.UserServiceImpl">
<property name="userMapper" ref="userMapper"/>
</bean>
完成所有组件开发和装配,接下来就可以测试集合的效果.测试的方法中的关键代码如图所示:
package test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.smbms.pojo.User;
import cn.smbms.service.user.UserService;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//通过ClassPathXmlApplicationContext实例化Spring的上下文
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext-mybatis.xml");
//通过ApplicationConText的getBean()方法,根据id来获得Bean的实例
UserService userService=(UserService)ctx.getBean("userService");
User user= new User();
user.setUserRole(null);
user.setUserName(null);
List<User> userList=userService.getUserList(user);
for (User userResult : userList) {
System.out.println("id: "+userResult.getId());
System.out.println("userName: "+userResult.getUserName());
}
}
}
3注入映射器实现
在上面的DAO类实现中使用SqlSessionTemplate的方法,都是采用字符串来指定映射,这种方式比较容易产生错误,如果存在拼写错误,在编译器无法识别,只能等到运行的时候才能发现.而且命名空间发生变化,会导致很多地方需要修改,不易维护;
SessionTemplate作为SqlSession接口的实现.自然也具备相同作用的getMapper()方法实现但在集成环境中,直拉在代码中使用getMapper()方法井非最佳选择。利用MyBatis-Spring提供的组件,可以不必每次调用getMapper()方法,而是通过配置的方式直接为业务对象注入映射器实现无需额外的编码。对于不包含其他非MyBais的工作的数据访问操作这是首选的做法;
3.1使用MapperScannerConfigurer注入映射器
在Spring配置文件中使用MapperFactoryBean对映射器做配置,简化了DAO模块的编码,不过如果映射器很多,相应的配置项很多。为了简化配置项工作量,MyBatis-Spring 中提供了MapperFactoryBean.它可以扫福指定包中的接口并将它们直接注册为MapperFactoryBean。MapperFactoryBean约配置方法如下:
在Sping配置文件中使用MapperFactoryBean对映射器做配置,简化了DAO模块的编码,不过如果欢射器很多,非应的配置项士会很多。为了简化配置工作量,MyBatis-Spring中提供了MapperScannerConfigurer.它可以扫福指定包中的接口并将它们直接注册为MapperFactoryBean。MapperScannerConfigurer约配置方法如下所示。
<!-- 定义MapperScannerConfigurer -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> -->
<property name="basePackage" value="cn.smbms.dao"/>
</bean>
MapperScannerConfigurer会为所有由他创建的映射器实现开启自动装配,也就是说MapperScannerConfigurer创建的所有映射器都会自动被注入SqlSessionFactory示例配置方式如下:
@Resource依赖注入时查找bean的规则:(以用在field上为例)
- 既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行查找,如果找到就注入
ServicImpl修改如下::
package cn.smbms.service.user;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.smbms.dao.user.UserMapper;
import cn.smbms.pojo.User;
/**
* @author Administrator
*
*/
@Service("userService")
public class UserServiceImpl implements UserService{
@Resource
private UserMapper userMapper; //声明UserMapper接口引用
@Override
public List<User> getUserList(User user) {
// TODO Auto-generated method stub
System.out.println("userMapper: "+userMapper);
return userMapper.getUserList(user); //调用DAO类方法实现查询
}
public UserMapper getUserMapper() {
return userMapper;
}
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
}
Spring中配置文件中的关键代码
<!-- 配置扫描注解定义的业务Bean -->
<context:component-scan base-package="cn.smbms.*"/>
本次项目下载地址:
链接:https://pan.baidu.com/s/1BW9IK0-DAVcsVWChFNMG5Q
提取码:6q9p