小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

Spring框架整合Mybatis持久层框架

# Spring,spring,java-ee,数据库 额外说明

收录于:17天前

Spring对mybatis的优势

以下是spring jdbc的数据库操作(核心部分):

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!--数据库驱动-->
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <!--连接数据库的Url-->
        <property name="url" value="jdbc:mysql://localhost:3306/db_spring"/>
        <!--连接数据库的用户名密码-->
        <property name="username" value="root"/>
        <property name="password" value=""/>

    </bean>
    <!--配置jdbc模板-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--默认必须使用数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 事务管理器,依赖于数据源 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 注册事务管理器驱动 -->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
    <context:component-scan base-package="com.ssm.jdbc"/>
    

```java
public class JdbcTemplateTest {
    
    public static void main(String[] args) {
    
        //加载配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("resources/applicationContext.xml");
        //获取实例
        JdbcTemplate jdbcTemplate= (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
        //使用execute()方法执行sql语句,创建用户表
        jdbcTemplate.execute("create table user("+"id int primary key auto_increment,"+"username varchar(10),"+"password varchar(10))");

    }

sql融合在代码中,不方便维护和修改,而mybatis将sql提取出来放在Mapper.xml中通过dao层的接口去实现,只需要在映射文件中配置一些基本sql语句实现业务,配置也比spring jdbc简单了许多。

环境配置

  • maven项目导入相关依赖,包括数据库驱动和mybatis工具包。
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
  • 创建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>
  <!--下面使用druid的DataSource这些不用配置 <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="..."/> </mappers> -->
</configuration>

连接信息可以指直接在配置文件中写入,也可以创建properties文件然后导入xml配置文件。

  • 添加 Spring 依赖
<dependency>
   <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.19.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.2.19.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.19.RELEASE</version>
</dependency>

<!--导入context会自动给将其他集合核心都导入,aop依赖aspects,spring-jdbc的orm是整合其他持久层框架的基础-->
  • 创建Spring核心配置文件
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

   <context:annotation-config/>
   <!-- 注解扫描 -->

</beans>

  • 导入mybatis与spring通信的依赖mybatis-spring
<dependency>
   <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>
  • 集成Druid连接池

Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池。 SQLParser 对sql的支持。
在这里插入图片描述

<!--导入druid依赖-->
<dependency>
   <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.24</version>
</dependency>
<!--druid驱动配置-->
<bean id="DataSource" class="com.alibaba.druid.pool.DruidDataSource" scope="singleton">
        <property name="driver" value=""></property>
        <property name="url" value=""></property>
        <property name="username" value=""></property>
        <property name="password" value=""></property>
        
        <property name="initialSize" value=""></property>
        <property name="minIdle" value=""></property>
        <property name="maxActive" value=""></property>
        <property name="maxWait" value=""></property>
    </bean>

druid有整合了jdbc,就不需要jdbc或者mybatis提供数据源了,由于spring整合式Spring Data/Acess框架提供了数据源DataSource管理,将druid提供给的数据源交由spring管理,scope要为单例模式

DataSource是数据连接的核心,有数据库密码,url,驱动等属性,有了DataSource就调用框架的接口操作数据库。spring IoC只起管理作用,mybatis使用druid数据源,既优化连接数据库有提供了连接池的支持。

  • spring IoC容器管理数据源DataSource注意scope要为单例模式:
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" scope="singleton">
        <property name="driver"></property>
        <property name="url"></property>
        <property name="username"></property>
        <property name="password"></property>

        <property name="initialSize" value=""></property>
        <property name="minIdle" value=""></property>
        <property name="maxActive" value=""></property>
        <property name="maxWait" value=""></property>
    </bean>

连接信息可以直接在xml中配置,也可以创建一个新的属性文件并将其导入到xml中:

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

Spring管理Mybatis工厂类

经过上面的配置已将DataSource整合到IoC容器中,但mybatis还没有整合,核心步骤就是将Mybatis的工厂类交由IoC容器管理。

Mybatis操作数据的核心:

  • 数据源
  • SqlSessionFactory
  • 会话
  • 映射器

DataSource没用mybatis自带的而是druid目的是:Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

SqlSessionFactory需要调用DataSource,再将SqlSessionFactory交由IoC容器管理,就完成整合了。但是SqlSessionFactory是mybatis的接口,不是java的对象没办法直接交由IoC管理,Spring提供了SqlSessionFactoryBean作为SqlSessionFactory的同类型类。同时通过输出流读入mybatis配置文件就能创建创建SqlSessionFactory,再自动装配给或继承就可以交由IoC容器管理了。

Mybatis的SqlSessionFactory创建:

String resource = "xxx/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

导入mybatis-spring工具包使用工具包实现SqlSessionFactoryBean

<!--mybatis与spring结合-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>

更简单的方法:

Spring的SqlSessionFactoryBean对象提供了configLocation属性读入配置文件,同时创建SqlSessionFactory对象,dataSource属性配置DataSource对象,mapperLocation配置Mapper映射等功能完成了再IoC容器中对SqlSessionFactory的创建。

上面mybatis的核心配置文件没有配置参数,依赖SqlSessionFactoryBean接口提供了一些属性用来在IoC容器中对DataSourceMapper等核心功能进行配置。

<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
     <property name="dataSource" ref=""></property>
     <property name="mapperLocation" value="classpath:xxx.Mapper.xml"></property>
     <property name="typeAliasesPackage" value="cms.pojo.mapper"></property><!--Mapper接口位置-->
     <property name="configLocation" value="classpath:xxx/mybatis-config.xml"></property>
 </bean>

在IoC容器中创建SqlSessionFactory对象后,mybatis就集成到Spring中了。

IoC管理Mapper

如果IoC容器可以管理SqlSessionFactory对象,那么它也可以管理SqlSession对象。同样的,Mapper映射(dao)也可以通过自动配置来赋值。

import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDao {
    
    ApplicationContext context=new ClassPathXmlApplicationContext("spring配置文件");
    SqlSessionFactory sqlSessionFactory=(SqlSessionFactory) context.getBean("sqlSessionFactory");
    
    //获取到SqlSessionFactory后其他的就是Mybatis的操作了
}

java代码对SqlSessionFactory的操作

SqlSession sqlSession=SqlSessionFactory.openSession();
UserMapper(& UserDao) mapper  = sqlSession.getMapper(UserMapper.class & UserDao.class)   
mapper.select()  //定义的数据库的操作方法

//映射怎么命名自定义

....

实现Mapper的IoC管理
dao层有很多的Mapper对象,需要将多有的类都交由IoC管理吗?并不需要,mybatis提供了MapperScannerConfigurer类自动包路径下所有的Mapper进行bean生产。当然Mapper是由SqlSession对象调用的,MapperScannerConfigurer需要引用IoC容器的SqlSessionFactory创建SqlSession对象,提供sqlSessionFacotyName属性用来引入IoC容器中的SqlSessionFactory。
还提供basePackage属性指明dao路径。

<!--加载dao路径下所有Mapper接口,并注入IoC容器-->
<bean class=org.mybatis.spring.mapper.MapperScannerConfigurer>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
	<property name="basePackgae" value="dao的路径" />
</bean>

从 IoC 容器获取 Mapper

//创建IoC容器
ApplicationContext context=new ClassPathXmlApplicationContext("spring配置文件");

//从容器中获取bean,实现MapperScannerConfigurer后直接获取Mapper对象
UserMapper mapper=(UserMapper) context.getBean("userMapper");  
/* ** 自动将接口的首字母转为小写,映射为接口的bean的id属性 */

服务层封装映射器
dao层和service共同完成ORM模型,service层调用dao层实现业务处理,自动装配实现:

@Service
public class DoUserService implements Userservice{
    
	@Autowired
	private UserDao userDao;

	public List<User> userList(){
    
		return userDao.queryUser()  //dao层定义的方法返回用户列表
	}
}

AOP实现声明式事务管理

事务是数据库的基本单位。

  • jdbc模块xml配置事务管理器
 <!--该配置会对所有异常实行回滚-->
    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
        <property name="dataSource" ref="druidDataSource"></property>
    </bean>

<!--tx模块定义股那里的规则-->
<tx:advice id="" transaction-manager="">
  <!--主要定义了事务的隔离级别和传播机制-->
</tx:advice>

上面的配置只定义了一个事务管理器,还需要声明管理方法。声明后,方法对数据的操作将由事务管理来管理。

<aop:config>
       <aop:pointcut id="" expression=""/>
       <aop:advisor advice-ref=""></aop:advisor>  <!--不同于aspect,advisor是面向事务的切面。-->
   </aop:config>

至此交易xml配置完成。

  • 注解完成声明式事务管理

处理xml配置注解也可以完成,当然由配置完的也可以由注解完成。参考弹簧基础知识

<!--声明事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
        <property name="dataSource" ref="druidDataSource"></property>
    </bean>

<!--开启事务注解驱动-->
<tx:annotation-driven transaction-manager="" />
@Transaction("隔离级别","传播机制")
public List<User> userList(){
    ...}
. . .

相关推荐

额外说明

【Python面向对象编程】第14章特殊方法__bool__

本篇将会介绍如何利用 Python __bool__ 方法定义对象的布尔值。 __bool__ 方法简介 自定义类的对象存在一个相关的布尔值。默认情况下该布尔值为 True。例如: class Person: def __init__(self,

额外说明

Unsupported major.minor version 51.0

今天遇到一个异常,信息如下: java.lang.UnsupportedClassVersionError: com/sysc/common/Main : Unsupported major.minor version 51.0 at java.lan

额外说明

【Redis读书笔记】Redis集群的三大模式

为什么要有集群 单个Redis存在不稳定性,当Redis服务宕机或硬盘故障,系统崩溃之后,就没有可用的服务了,还会造成数据的丢失 单个Redis的读写能力也是有限的 还由于互联网的三高架构,高并发,高性能,高可用 概念 通过添加服务器的数量,提供相同的服

额外说明

jQuery之从零开始的学习(完整整理)

** jQuery入门 一、简介 ** jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal

额外说明

【架构方案】数据库、JVM、缓存、SQL等性能调优方法和原则

性能优化基本是BAT等一线互联网公司程序员必备的技能,以下为大家完整揭晓性能完整的优化方案和方法:包含web网站调优、数据库、JVM调优、架构调优等方案。 第一:Web网站调优 1、尽可能减少HTTP请求:图片合并 (css sprites),Js脚本文

额外说明

浏览器解析URL全部流程

1,解析URL:将输入的URL解析成协议,域名,路径等信息 2,解析DNS:将域名解析成对应的IP( ip 指的是网络为每一台电脑分配的一个地址。由于 ip 地址不容易被记住,所以有了域名,浏览器拿到域名后,首先要先把域名解析成 ip,然后找到 ip 对

额外说明

AI时代:探索机器学习与深度学习的融合之旅

文章目录 1. 机器学习和深度学习简介 1.1 机器学习 1.2 深度学习 2. 为什么融合是必要的? 2.1 数据增强 2.2 模型融合 3. 深入分析:案例研究 3.1 传统机器学习方法 3.2 深度学习方法 3.3 融合方法 4. 未来展望 结论

额外说明

【Python 随练】将一个数组逆序输出

题目: 将一个数组逆序输出 简介: 在本篇博客中,我们将解决一个数组操作问题:将一个数组逆序输出。我们将介绍数组逆序的概念,并提供一个完整的代码示例来实现逆序输出数组。 问题分析: 我们需要将给定的数组逆序输出。 解决方案: 为了实现数组的逆序输出,我们

额外说明

Java项目课程01:课程概述

文章目录 一、课程目的 二、课程项目简介 三、项目开发思维导图 四、拓展阅读 - Java工程师笔试考点 (一)选择题考察知识点 (二)编程题考察知识点 (三)问答题考察知识点 (四)面试八股文题目 1、Java基础 2、集合类 3、IO 4、多线程 5

额外说明

jdk1.7和jdk1.8的堆内存模型

jvm的内存模型在1.7和1.8有较大的区别,虽然本文是以1.8为例进行讲解,但是我们也是需要对1.7的内存模型有所了解。 jdk1.7的堆内存模型 Young 年轻区(代) Young区被划分为三部分,Eden区和两个大小严格相同的Survivor区,

ads via 小工具