Spring和MyBatis的集成 1. Spring和各个框架的整合 2. SSM 3. Spring与MyBatis整合

Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

SpringMyBatis的整合

 

Spring目前是JavaWeb开发中最终的框架,提供一站式服务,可以其他各个框架整合集成

Spring整合方案

1.1. SSH

Ssh是早期的一种整合方案

Struts2 Web层框架

Spring : 容器框架

Hibernate : 持久层框架

2. SSM

主流的项目架构的三大框架(相对其他框架而言,最优秀)

 SpringMVC spring自己家的 Web层框架,spring的一个模块

 Spring :容器框架

 MyBatis :持久层框架

3. SpringMyBatis整合

3.1. 集成思路

实际开发,使用Maven项目,直接引入项项目在Maven仓库中的坐标即可

学习阶段: 手动导入jar包,从零开始集成(巩固基础知识)

3.2. 创建java项目

Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

3.3. 准备集成相关jar

3.3.1. Spring依赖包

Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

3.3.2. Mybatis依赖包

 Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

3.3.3. MyBatisSpring框架集成的桥梁包

Spring自己并没有集成MyBatis框架,需要MyBatis自己来集成,所以需要自己提供Spring框架集成的桥梁包

如果我们使用的mybatis3.4.4 不能直接使用mybatis内置的 桥梁包版本,版本比较低,无法正常运行,需要单独下载一个比价高的版本

 Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

3.3.4. 数据库驱动包和连接池

 Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

 Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

3.3.5. Mybatis支持的日志包log4j

 Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

3.4. 项目集成需要各种配置文件

 Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

3.5. 完成项目层与层之间spring对象的创建和依赖关系的维护

3.5.1. Service

package cn.zj.mybatis.service.impl;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import cn.zj.mybatis.mapper.UserMapper;

import cn.zj.mybatis.pojo.User;

import cn.zj.mybatis.service.UserService;

@Service

public class UserServiceImpl implements UserService {

/*

 * 问题: UserMapper 代理对象如何创建?

 * 答 :使用 SqlSession 操作对象创建 !

 *

 * 问题 : SqlSession 对象如何创建?

 *  

 * 答 : SqlSessionFactory 工厂对象创建?

 *

 * 问题: SqlSessionFactory 对象如何创建

 *

 * 1,和Spring框架集成之前

 *  MyBatis框架自己读取配置文件中的相关配置去创建

 * 2, 和Spring框架集成之后

 *  交个Spring容器来创建

 * 问题: 如何在Spring框架中配置,创建出来SqlSessionFactory对象?

 *  mybatis和spring集成的类查阅 桥梁包

 *  org.mybatis.spring.SqlSessionFactoryBean 创建 SqlSessionFactory

 *

 */

@Autowired

private UserMapper mapper;

@Override

public int insert(User user) {

return mapper.insert(user);

}

@Override

public User selectByPrimaryKey(Integer id) {

System.out.println(mapper);

return mapper.selectByPrimaryKey(id);

}

}

3.5.2. 测试代码

package cn.zj.mybatis.test;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import cn.zj.mybatis.pojo.User;

import cn.zj.mybatis.service.UserService;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")

public class UserServiceTest {

@Autowired

private UserService service;

@Test

public void testInsert() {

User user = new User(null, "乔峰", "qiaofeng", 30);

int row = service.insert(user);

System.out.println(row);

}

@Test

public void testSelectByPrimaryKey() {

User user = service.selectByPrimaryKey(8);

System.out.println(user);

}

}

3.5.3. applicationContext配置文件的配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

    http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.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

        http://www.springframework.org/schema/tx

        http://www.springframework.org/schema/tx/spring-tx.xsd

        ">

<!-- 设置注解配置包扫描位置 -->

<context:component-scan base-package="cn.zj.mybatis"/>

</beans>

3.6. MyBatis 框架SqlSessionFactory对象的创建

 * 问题: UserMapper 代理对象如何创建?

 * 答 :使用 SqlSession 操作对象创建 !

 *

 * 问题 : SqlSession 对象如何创建?

 *  

 * : SqlSessionFactory 工厂对象创建?

 *

 * 问题: SqlSessionFactory 对象如何创建

 *

 * 1,和Spring框架集成之前

 *  MyBatis框架自己读取配置文件中的相关配置去创建

 * 2, 和Spring框架集成之后

 *  交个Spring容器来创建

 * 问题: 如何在Spring框架中配置,创建出来SqlSessionFactory对象?

 *  mybatisspring集成的类查阅 桥梁包

 *  org.mybatis.spring.SqlSessionFactoryBean 创建 SqlSessionFactory

 *

 */

创建MyBatis框架工厂对象的 类在mybatis-spring1.2.1.jar 桥梁包中的

org.mybatis.spring.SqlSessionFactoryBean  如下图

Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

3.6.1. 配置文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

    http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.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

        http://www.springframework.org/schema/tx

        http://www.springframework.org/schema/tx/spring-tx.xsd

        ">

<!-- 配置读取 db.properties 数据库配置文件 -->

<context:property-placeholder location="classpath:db.properties"/>

<!-- 配置数据源连接池 -->

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

<property name="driverClassName" value="${jdbc.driverClassName}"/>

<property name="url" value="${jdbc.url}"/>

<property name="username" value="${jdbc.username}"/>

<property name="password" value="${jdbc.password}"/>

<property name="maxActive" value="${jdbc.maxActive}"/>

</bean>

<!--

配置MyBatis框架的 SqlSessionFactoryBean 类,创建

 SqlSessionFactory 工厂对象

 -->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<!-- 1.注入数据源 -->

<property name="dataSource" ref="dataSource"/>

<!-- 2.配置映射文件 -->

<property name="mapperLocations">

<array>

<!-- <value>classpath:cn/zj/mybatis/mapper/UserMapper.xml</value> -->

<!-- 可以使用通配符 * 读取 目录下面所有的配置文件 -->

<value>classpath:cn/zj/mybatis/mapper/*Mapper.xml</value>

</array>

</property>

<!-- 3. 配置别名使用包扫描 -->

<property name="typeAliasesPackage" value="cn.zj.mybatis.pojo"/>

<!-- 4.读取mybat-config.xml配置文件,此配置文件可能还会配一些mybatis框架的

其他个性化配置

实际项目开发可能不用配置

 -->

 <property name="configLocation" value="classpath:mybatis-config.xml"/>

</bean>

</beans>

3.7. 创建MyBatisMapper接口的代理对象

使用桥梁包 org.mybatis.spring.mapper.MapperFactoryBean<T> 创建 UserMapper代理对象

Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

此种方式每一个Mapper接口需要单独配置,如果Mapper过多,创建Mapper可能造成配置代码过多

    <!-- 创建UserMapper代理对象-创建单个Mapper对象

   

 使用桥梁包 org.mybatis.spring.mapper.MapperFactoryBean<T> 创建 UserMapper代理对象

  -->

  

  <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

  

   <!-- 注入SqlSessionFacotry对象 -->

   <property name="sqlSessionFactory" ref="sqlSessionFactory"/>

  

   <!-- 注入UserMapper接口类型:底层创建UserMapper的代理对象 -->

   <property name="mapperInterface" value="cn.zj.mybatis.mapper.UserMapper"/>

  

  </bean>

3.8. 使用包扫描创建MyBatisMapper接口的代理对象

Spring和MyBatis的集成
1. Spring和各个框架的整合
2. SSM 
3. Spring与MyBatis整合

<!-- 批量创建Mapper代理对象 ,使用包扫描创建Mapper代理对象

  使用桥梁包

  org.mybatis.spring.mapper.MapperScannerConfigurer

  -->

  

  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

   <!-- 配置需要创建Mapper接口代理对象对应的包 -->

   <property name="basePackage" value="cn.zj.mybatis.mapper"/>

  

   <!-- 配置SqlSessionFactoryBean 的名称,不是引用 -->

   <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

  </bean>

3.9. MyBatis的事务管理器的配置

一般开发,事务的管理都会使用aop切入到业务层

  <!-- 配置事务管理器 -->

  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

   <!-- 注入数据源 -->

   <property name="dataSource" ref="dataSource"/>

  </bean>

  

  <!-- spring事务配置 -->

  <tx:advice id="txAdvice" transaction-manager="transactionManager">

  

   <!-- 事务属性配置 -->

   <tx:attributes>

   <!-- DQL :查询操作,配置只读事务 -->

   <tx:method name="get*" read-only="true" isolation="REPEATABLE_READ"  propagation="REQUIRED"/>

   <tx:method name="select*" read-only="true" isolation="REPEATABLE_READ"  propagation="REQUIRED"/>

   <tx:method name="find*" read-only="true" isolation="REPEATABLE_READ"  propagation="REQUIRED"/>

   <tx:method name="query*" read-only="true" isolation="REPEATABLE_READ"  propagation="REQUIRED"/>

  

   <!-- 其他 SQL :非只读事务 -->

   <tx:method name="*" read-only="false" isolation="REPEATABLE_READ"  propagation="REQUIRED"/>

  

   </tx:attributes>

  

  </tx:advice>

  

  <!-- 配置AOP 切入事务 -->

  

  <aop:config>

   <!-- 切入点 -->

   <aop:pointcut expression="execution(* cn.zj.mybatis.service..*.*(..))" id="pt"/>

  

   <!-- 切面 -->

   <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>

  </aop:config>