MyBatis框架与Spring框架的整合

前言

将MyBatis框架与Spring框架进行整合,就是要解决MyBatis框架中核心对象SqISessionFactory、Sq|Session和mapper代理对象的管理问题。需要将这些对象交给spring管理:

1、将SqISessionFactory交给spring 管理,需 要spring通过单例方式管理SqISessionFactory。
2、SqISession: spring 和mybatis整合生成代理对象,使用SqISessionFactory 创建SqISession。( spring和mybatis整合自动完成)
3、mapper:持久层的mapper都需要由spring进行管理。

采用MyBatis与Spring框架整合开发时,可以采用传统DAO开发方式,也可以采取Mapper代理开发方式。这两种开发方式都可以实现所需的功能,但是我们建议使用Mapper代理开发方式,因为这种开发方式会使程序员编写更少的代码,提高工作效率。

以Mapper代理开发方式实现MyBatis框架与Spring框架的整合。

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

基于MapperFactoryBean的整合

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

mapperInterface :用于指定接口;

SqlSessionFactory :用于指定SqlSessionFactory ;

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

整合项目所需框架包

`在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

案例的具体实现

在src目录下创建四个配置文件

(1)引入log4j配置文件log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG,stdout
# MyBatis logging configuration...
log4j.logger.com.zsj=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

(2)编写数据库连接参数配置文件db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456
jdbc.maxTotal=30
jdbc.maxIdle=10
jdbc.initialSize=5

注意:我的数据库名是mybatis以及连接mysql的用户名和密码可根据自己的设置更改。

(3)编写Spring配置文件applicationContext.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-4.3.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.3.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    <!--读取db.properties -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 配置数据源 -->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <!--数据库驱动 -->
        <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="maxTotal" value="${jdbc.maxTotal}" />
        <!--最大空闲连接  -->
        <property name="maxIdle" value="${jdbc.maxIdle}" />
        <!--初始化连接数  -->
        <property name="initialSize" value="${jdbc.initialSize}" />
	</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="configLocation" value="classpath:mybatis-config.xml"/>
   </bean>
   <!-- Mapper代理开发(基于MapperScannerConfigurer) -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	     <property name="basePackage" value="com.zsj.mapper" />
	     <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />  
	</bean>
	<!-- 开启扫描 --> 
	<context:component-scan base-package="com.zsj.service" />
</beans>

(4)编写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>
	<properties resource="db.properties" />
	 <settings>
        <setting name="logImpl" value="LOG4J" />
     </settings>
		<typeAliases>
			<package name="com.zsj.po" />
		</typeAliases>
	<environments default="mysql">
		<environment id="mysql">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
	 	 <mapper resource="com/zsj/mapper/CustomerMapper.xml" />
	</mappers>
</configuration>

给项目添加JUnitjar包

JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。.
项目名右键→Properties-→Java Build Path→Libraries-→Add Library 选中JUnit,然后Next- > 选中版本,然后Finish→OK

整合项目业务层编写

项目的目录结构如下:
在这里插入图片描述
在src目录下创建以下五个包
com.zsj.po
com.zsj. mapper
test

其中核心的代码如下:

1、在com.zsj.po包中创建持久化类Customer
package com.zsj.po;
/**
 * 客户持久化类
 */
public class Customer {
	private Integer id;       // 主键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 + "]";
	}
}
2、在com.zsj.mapper包中创建==CustomerMapper接口(CustomerMapper.java) 以及对应的映射文件

( CustomerMapper.xml)。==

package com.zsj.mapper;
import com.zsj.po.Customer;
public interface CustomerMapper {
	// 通过id查询客户
	public Customer findCustomerById(Integer id);
	}
<?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.zsj.mapper.CustomerMapper">
	<!--根据id查询客户信息 -->
	<select id="findCustomerById" parameterType="Integer"
		     resultType="customer">
		select * from t_customer where id = #{id}
	</select>	
</mapper>
3、在applicationContext.xml中配置mapper

如果我们使用方法1:通过MapperFactoryBean创建代理对象,此方法需要针对每个mapper进行配置,比较麻烦。(自动忽略,不加解释;有需求的小伙伴,自己度娘搜一搜)
如果我们使用方法2:通过MapperScannerConfigurer进行mapper扫描,那么指定包路径后,会扫描该包及其子包中的所有文件,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册。
自动扫描要求遵循规范:将mapper.java 和mapper.xml映射文件名称保持一致, 且在-一个目录中。这就是为什么我们在上一步操作中在com.wz.mapper包中创建CustomerMapper.java CustomerMapper.xml。自动扫描出来的mapper的bean的id为mapper类名(首字母小写)

在applicationContext.xml最后加上MapperScannerConfigurer的配置,语句如下:
在这里插入图片描述

4、在test包中编写测试类CustomerMapperTest,并编写测试方法findCustomerByldTest()
package test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.zsj.mapper.CustomerMapper;
import com.zsj.po.Customer;
public class CustomerMapperTest {
	
	@Test
	public void findCustomerByIdMapperTest(){	
	    ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
	    CustomerMapper customerMapper = act.getBean(CustomerMapper.class);   
	    Customer customer = customerMapper.findCustomerById(2);
	    System.out.println(customer);
	}
	
}
5、运行单元测试

右键点击方法名findCustomerByldTest,选择Run As下的JUnit Test.
在这里插入图片描述
致此,本篇博客到此结束。也许细心的同学会发现我所截图的项目目录结构与我所构架的不同!!!少了几个包,其实那是事务管理的模块罢了。后续的博客中会补充的!!
如果需要部署该项目及框架包的,请各位大佬私信我,哈哈哈!!!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值