Spring Mybatis整合

Sring+Mybatis

Spring具有方便继承各种框架的优点,可以与MyBatis等第三方框架进行整合,整合大概就是将MyBatis的配置文件转化成Spring的Bean进行管理,即SqlSessionFactory,从而省去了书写MyBatis配置文件

Project的Maven依赖

使用<properties></properties>进行版本控制

<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.7</maven.compiler.source>
		<maven.compiler.target>1.7</maven.compiler.target>
		<junit.version>4.12</junit.version>
		<spring.version>5.2.5.RELEASE</spring.version>
		<mybatis.version>3.5.4</mybatis.version>
		<mybatis.spring.version>2.0.4</mybatis.spring.version>
		<mysql.version>5.1.48</mysql.version>
		<commons-dbcp.version>2.7.0</commons-dbcp.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>${mybatis.spring.version}</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>${commons-dbcp.version}</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.15</version>
		</dependency>
	</dependencies>

spring-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:context="http://www.springframework.org/schema/context"
	
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	<!-- 注解自动扫描 -->
	<context:component-scan base-package="com.hlq.ch10" />
		
	<!--读取db.properties 连接数据库 -->
	<context:property-placeholder location="classpath:db.properties" />
	
	<!-- 配置数据源 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<!--数据库驱动 -->
		<property name="driverClassName" value="${jdbc.driver}" />
		<!--连接数据库的url -->
		<property name="url" value="${jdbc.url}" />
		<!--连接数据库的用户名 -->
		<property name="username" value="${jdbc.username}" />
		<!--连接数据库的密码 -->
		<property name="password" value="${jdbc.password}" />
	</bean>
	
	<!-- 事务管理器,依赖于数据源 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!--开启事务注解 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
		
		
	<!--配置MyBatis工厂 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!--注入数据源 -->
		<property name="dataSource" ref="dataSource" />
		
		<!--指定核心配置文件位置,可以省略包名 -->
		<property name="typeAliasesPackage" value="com.hlq.ch10.dao" />
		
		<!-- 自动扫描dao目录, 省掉mapper-resource里的手工配置 -->
		<property name="mapperLocations" value="classpath:com/hlq/ch10/dao/*.xml" />
	</bean>
	
	<!-- 自动配置映射 Mapper代理开发 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.hlq.ch10.dao" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
	</bean>
</beans>

各个标签的作用

xml文件

在这里插入图片描述

注解自动扫描

在这里插入图片描述

数据库连接

使用数据库连接池

<!-- 配置数据源 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
		<!--数据库驱动 -->
		<property name="driverClassName" value="${jdbc.driver}" />
		<!--连接数据库的url -->
		<property name="url" value="${jdbc.url}" />
		<!--连接数据库的用户名 -->
		<property name="username" value="${jdbc.username}" />
		<!--连接数据库的密码 -->
		<property name="password" value="${jdbc.password}" />
		
		<!-- 初始化连接大小 -->
        <property name="initialSize" value="0" />
        
        <!-- 连接池最大使用连接数量 -->
        <property name="maxActive" value="20" />
        
        <!-- 连接池最小空闲 -->
        <property name="minIdle" value="0" />
        
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="60000" />
        <property name="validationQuery" value="SELECT 1" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
        <property name="testWhileIdle" value="true" />
        
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="25200000" />
        
        <!-- 打开removeAbandoned功能 -->
        <property name="removeAbandoned" value="true" />
        
        <!-- 1800秒,也就是30分钟 -->
        <property name="removeAbandonedTimeout" value="1800" />
        
        <!-- 关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="true" />
	</bean>

在这里插入图片描述

基于注解的数据库事务管理

在这里插入图片描述

MyBatis添加到Spring进行管理

在这里插入图片描述

Mapper接口开发整合

  • 在MyBatis+Spring的项目中,虽然使用传统的DAO开发方式可以实现所需功能
  • 但是采用这种方式在实现类中会出现大量的重复代码
  • 在方法中也需要指定映射文件中执行语句的id,并且不能保证编写时id的正确性(运行时才能知道)
  • 为此,我们可以使用MyBatis提供的另外一种编程方式,即使用Mapper接口编程

基于MapperFactoryBean的整合

MapperFactoryBean是MyBatis-Spring团队提供的一个用于根据Mapper接口生成Mapper对象的类,该类在Spring配置文件中使用时可以配置以下参数:

  • mapperInterface:用于指定接口
  • SqlSessionFactory:用于指定SqlSessionFactory
  • SqlSessionTemplate:用于指定SqlSessionTemplate。如果与SqlSessionFactory同时设定,则只会启用SqlSessionTemplate

MapperFactoryBean 遵循的规范

  1. Mapper接口的名称和对应的Mapper.xml映射文件的名称必须一致
  2. Mapper.xml文件中的namespace与Mapper接口的类路径相同
  3. Mapper接口中的方法名和Mapper.xml中定义的每个执行语句的id相同
  4. Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个sql的parameterType的类型相同
  5. Mapper接口方法的输出参数类型要和Mapper.xml中定义的每个sql的resultType的类型相同

基于MapperScannerConfigurer的整合

  • 在实际的项目中,DAO层会包含很多接口,如果每一个接口都在Spring配置文件中配置,不但会增加工作量,还会使得Spring配置文件非常臃肿
  • 为此,可以采用自动扫描的形式来配置MyBatis中的映射器——采用MapperScannerConfigurer类
  • 同样应该采用Mapper和Java接口相同的规范

MapperScannerConfigurer在Spring的配置属性:

  • basePackage:指定映射接口文件所在的包路径,当需要扫描多个包时可以使用分号或逗号作为分隔符。指定包路径后,会扫描该包及其子包中的所有文件
  • annotationClass:指定了要扫描的注解名称,只有被注解标识的类才会被配置为映射器
  • sqlSessionFactoryBeanName:指定在Spring中定义的SqlSessionFactory的Bean名称
  • sqlSessionTemplateBeanName:指定在Spring中定义的SqlSessionTemplate的Bean名称。如果定义此属性,则sqlSessionFactoryBeanName将不起作用
  • markerInterface:指定创建映射器的接口
<!-- Mapper代理开发(基于MapperScannerConfigurer) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
     <property name="basePackage" value="cn.edu.ujn.ch10.dao" />
     <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
  • 通常情况下,MapperScannerConfigurer在使用时只需通过basePackage属性指定需要扫描的包即可,Spring会自动的通过包中的接口来生成映射器
  • 这使得开发人员可以在编写很少代码的情况下,完成对映射器的配置,从而提高开发效率

使用MapperScannerConfigurer进行Mapper文件与接口的装配

DAO层

  • Customer.java
@Component("customer")
public class Customer {

	private Integer id;
	private String username;
	private String jobs;
	private String phone;
	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 getJobs() {
		return jobs;
	}
	public void setJobs(String jobs) {
		this.jobs = jobs;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	@Override
	public String toString() {
		return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
	}

	
}
  • CustomerMapper.java接口
public interface CustomerMapper {
	
	Integer addOneCustomer(Customer customer);
	Customer findCustomerByPrimaryKey(Integer id);
	
}
  • CustomerMapper.xml文件
<?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.hlq.ch10.dao.CustomerMapper">
	<resultMap id="BaseResultMap" type="Customer">
		<id column="id" jdbcType="INTEGER" property="id"></id>
		<result column="username" jdbcType="VARCHAR" property="username"></result>
		<result column="jobs" jdbcType="VARCHAR" property="jobs"></result>
		<result column="phone" jdbcType="VARCHAR" property="phone"></result>
	</resultMap>
	
	<sql id="BaseColumnList">
		id, username, jobs, phone
	</sql>
	
	<select id="findCustomerByPrimaryKey" parameterType="INTEGER" resultMap="BaseResultMap">
		SELECT <include refid="BaseColumnList"></include>
		FROM customer
		WHERE id = #{id, jdbcType=INTEGER}
	</select>
	
	<insert id="addOneCustomer" parameterType="Customer" useGeneratedKeys="true" keyProperty="id">
		INSERT INTO customer(username, jobs, phone)
		VALUES(#{username, jdbcType=VARCHAR}, #{jobs, jdbcType=VARCHAR}, #{phone, jdbcType=VARCHAR})
	</insert>
	
</mapper>

Service层

  • 接口规范
public interface CustomerService {

	int addCustomer(Customer customer);
	Customer findCustomer(Integer id);
	Integer insertCustomerTransaction(Customer customer);
	
}
  • 实现类
@Service("customerService")
public class CustomerServiceImpl implements CustomerService {
	
	@Resource(name="customerMapper")
	private CustomerMapper customerMapper;
	
	@Override
	public int addCustomer(Customer customer) {
		Integer addNum = customerMapper.addOneCustomer(customer);
		return addNum;
		
	}

	@Override
	public Customer findCustomer(Integer id) {
		Customer customer = customerMapper.findCustomerByPrimaryKey(3);
		return customer;
	}

	@Override
	@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT, readOnly=false)
	public Integer insertCustomerTransaction(Customer customer) {
		Integer addNum = customerMapper.addOneCustomer(customer);
		int i = 1/0;
		return addNum;
	}

}

SpringJUnit4ClassRunner进行测试

添加注解,声明为SpringTest

  • @RunWith(SpringJUnit4Runner.clss)
  • @ContextConfiguration(locations=“classpath:spring-mybatis.xml”)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring-mybatis.xml")
public class SpringMyBatisTest {
	
	@Autowired
	private CustomerService customerService;
	
	@Autowired
	private Customer customer;
	
	@Autowired
	private CustomerMapper customerMapper;
	
	@Test
	public void addOneCustomerTest() {
		
		customer.setUsername("Hanaaaa");
		customer.setJobs("doctor");
		customer.setPhone("19861823000");
		
		int addNum = customerService.addCustomer(customer);
		
		if (addNum > 0) {
			System.out.println("Ok");
		} else {
			System.out.println("fail");
		}
		
	}
		
	@Test
	public void findCustomerTest() {
		Customer icustomer = customerService.findCustomer(2);
		System.out.println(icustomer);
	}
	
	@Test
	public void addCustomerTransactionalTest() {
		customer.setUsername("TransactionalTest");
		customer.setJobs("Transaction");
		customer.setPhone("123");
		customerService.insertCustomerTransaction(customer);
		System.out.println("获取的id: " + customer.getId());
		
	}

}

测试结果

Customer [id=2, username=lisi, jobs=student, phone=13964008726]

总结

  • Spring与MyBatis的整合就是将MyBatis配置到Spring中的Bean,并配置Mapper映射文件
  • 使用Mapper类进行操作数据库
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringMyBatis整合是非常常见且流行的,可以通过以下步骤进行整合: 1. 添加依赖:在项目的构建文件(如pom.xml)中添加SpringMyBatis的相关依赖。确保版本兼容性。 2. 配置数据源:在Spring的配置文件(如application.xml)中配置数据源,例如使用连接池(如C3P0、HikariCP)或者直接配置数据库连接。同时,配置MyBatis的一些属性,如Mapper扫描路径等。 3. 配置SessionFactoryBean:使用Spring提供的org.mybatis.spring.SqlSessionFactoryBean配置MyBatis的SqlSessionFactory。可以设置数据源、类型别名、Mapper扫描路径等。 4. 配置MapperScannerConfigurer:使用Spring提供的org.mybatis.spring.mapper.MapperScannerConfigurer配置MyBatis的Mapper扫描路径。可以通过配置basePackage属性设置扫描路径。 5. 编写Mapper接口和Mapper映射文件:创建Mapper接口,并在接口中定义需要的数据库操作方法。然后编写对应的Mapper映射文件,配置SQL语句和结果映射。 6. 注入Mapper接口:在需要使用Mapper接口的地方(如Service层),通过@Autowired或配置文件注入该接口,然后即可调用接口中定义的方法。 7. 开启事务支持:在Service层或需要事务管理的地方,使用Spring提供的@Transactional注解或配置文件声明事务。 以上是简要的整合步骤,具体配置和代码实现可能因项目需求和环境而有所不同。整合完成后,即可在Spring项目中使用MyBatis进行数据库操作,并利用Spring的特性实现更加灵活和便捷的开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值