Spring与Mybatis的整合可以使用MyBatis-Spring,它会将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。
使用 MyBatis-Spring 需要以下版本
使用 Maven 作为构建工具, 需要在 pom.xml 中加入依赖
org.mybatis
mybatis-spring
2.0.2
mybatis
org.mybatis
mybatis
3.5.2
spring
org.springframework
spring-webmvc
5.1.10.RELEASE
org.springframework
spring-jdbc
5.1.10.RELEASE
aop织入
org.aspectj
aspectjweaver
1.9.4
lombok注解
org.projectlombok
lombok
1.16.16
provided
单元测试junit
junit
junit
4.13.1
test
配置Maven静态资源过滤
src/main/java
**/*.xml
**/*.properties
src/main/resources
**/*.xml
**/*.properties
Spring 、MyBatis一起使用,需要在 Spring 应用上下文中定义:SqlSessionFactory 、数据映射器类。
在 MyBatis-Spring 中,可使用SqlSessionFactoryBean来创建 SqlSessionFactory。要配置这个工厂 bean,只需要把下面代码放在 Spring 的 XML 配置文件中:
注意:SqlSessionFactory需要一个 DataSource(数据源)。可以是任意的 DataSource。
这里配置DataSource使用Spring自带的JDBC 的 DataSource,具体的数据库信息使用properties文件引入
单独使用MyBatis时,是通过 SqlSessionFactoryBuilder 来创建 SqlSessionFactory 的。再使用 SqlSessionFactory 来创建 SqlSession。当程序获得一个 session 之后,便可以使用它来执行映射了的语句,提交或回滚连接,不再需要它时,可关闭 session。
而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来创建。
在 MyBatis-Spring 中,有一个常用的属性是 configLocation,它用来指定 MyBatis 的 XML 配置文件路径。
SqlSession 的一个实现是SqlSessionTemplate ,SqlSessionTemplate 是 MyBatis-Spring 的核心,可以使用它无缝代替代码中已经在使用的 SqlSession。可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象。
下面介绍具体的整合代码
代码实现
实体类:
package com.sc.pojo;
import lombok.Data;
@Data
public class Member {
private Long id;
private String memberNo;
private String mobile;
private String openId;
private Shop shop;
}
package com.sc.pojo;
import lombok.Data;
@Data
public class Shop {
private int shopInfoId;
private String shopName;
private String appKey;
private String appSecret;
private Long shopId;
private String shopCode;
private String saasTenantCode;
}
业务接口:
package com.sc.service;
import com.sc.pojo.Member;
import java.util.List;
public interface MemberMapper {
List getAllmemberInfo();
int deleteMember(Long id);
int addMember(Member member);
}
mapper.xml文件,MemberMapper.xml
数据库配置信息db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://XXXX:3306/dXXX_sit?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useJDBCCompliantTimezoneShift=true&serverTimezone=CST
jdbc.username=XXX
jdbc.password=XXX
Mybatis配置文件:
实现方式一:私有化sqlSessionTemplate
业务实现类:MemberMapperImpl
package com.sc.service;
import com.sc.pojo.Member;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class MemberMapperImpl implements MemberMapper {
//sqlSession不用我们自己创建了,Spring来管理
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List getAllmemberInfo() {
MemberMapper mapper = sqlSession.getMapper(MemberMapper.class);
return mapper.getAllmemberInfo();
}
}
spring配置文件:
测试类:
import com.sc.pojo.Member;
import com.sc.service.MemberMapper;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MyTest {
@Test
public void test()
{
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
MemberMapper mapper = (MemberMapper) context.getBean("memberMapper");
List members = mapper.getAllmemberInfo();
for(Member member:members){
System.out.println(member);
}
}
}
实现方式二:继承Support类
继承Support类 , 直接利用 getSqlSession() 获得 , 然后直接注入SqlSessionFactory . 比起方式1 , 不需要管理SqlSessionTemplate
package com.sc.service;
import com.sc.pojo.Member;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class MemberMapperImpl2 extends SqlSessionDaoSupport implements MemberMapper {
public List getAllmemberInfo() {
SqlSession sqlSession = this.getSqlSession();
MemberMapper mapper = sqlSession.getMapper(MemberMapper.class);
return mapper.getAllmemberInfo();
}
}
spring配置文件:
测试类:
import com.sc.pojo.Member;
import com.sc.service.MemberMapper;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MyTest {
@Test
public void test()
{
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
MemberMapper mapper = (MemberMapper) context.getBean("memberMapper");
List members = mapper.getAllmemberInfo();
for(Member member:members){
System.out.println(member);
}
}
}
输出: