Spring数据访问层管理 ▎集成MyBatis ▎AOP ▎事务管理 ▎SpringWeb配置

本文主要是介绍Spring数据访问层管理 ▎集成MyBatis ▎AOP ▎事务管理 ▎SpringWeb配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

在现代软件开发中,数据访问层的管理至关重要。Spring框架凭借其模块化结构和易用性,成为Java EE开发的首选。本文将探讨Spring在数据访问层的管理、MyBatis的集成、面向切面编程(AOP)、事务管理和Spring Web配置。

数据访问层连接应用与数据库,需关注效率和可维护性。我们将讨论如何使用Spring的JdbcTemplate和Spring Data实现数据库操作。MyBatis作为灵活的持久层框架,我们将介绍其在Spring项目中的集成方式。

AOP实现关注点分离,能将日志和安全等横切关注点与业务逻辑解耦,提高代码可重用性。我们还将讲解如何在Spring中管理事务,以确保数据一致性和完整性。

最后,我们将介绍Spring Web模块的配置方法,包括MVC架构和RESTful API的搭建,帮助开发者快速创建高效的Web应用。通过这些探讨,读者将能有效利用Spring技术提升应用开发能力。

Spring数据访问管理

引入 Spring JDBC 模块的依赖配置以及阿里巴巴的数据库连接管理组件 Druid 

        <!-- spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.2.RELEASE</version></dependency><!-- 阿里数据源  数据库连接管理组件 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>

注:我们仍然需要引入sql jar包

Spring管理阿里巴巴数据源

   <!--阿里巴巴数据库连接管理对象,负责生成数据库连接对象,以及提供数据库连接池功能让Spring管理阿里巴巴数据库连接对象--><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"></property><property name="username" value="root"></property><property name="password" value="root"></property><property name="initialSize" value="10"></property><!--初始化连接数量--><property name="maxActive" value="20"></property><!--最大连接数量--></bean>

Spring集成MyBatis

第一步:导入jar包

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

注:也需要导入MyBatis jar包

配置 sqlSessionFactory

    <!--spring管理生成SqlSessionFactory对象 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="druidDataSource"></property> <!-- 注入数据源--><property name="configLocation" value="classpath:mybatis.xml"></property> <!-- MyBatis配置文件--><property name="mapperLocations" value="classpath:mappers/*Mapper.xml"> <!-- 扫描mapper映射文件--></property></bean>

配置dao包下的所有代理对象

    <!-- 生成dao包下所有的代理对象--><bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.kid.ssm.dao"></property>   <!--接口所在的包--><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean>

AOP

AOP 为 Aspect Oriented Programming 的缩写 ,意为:面相切面编程

面相切面编程:面相切面编程是对面向对象编程的补充延续

面向切面编程思想:是将程序中非业务代码(提交事物,打印日志,权限验证,统一异常处理)提取分离出来,然后通过代理对象,然后在调用业务代码时,通过一个代理对象帮助我们调用这些提取出来的非业务代码,这样在业务代码中就不用显示调用非业务代码,做到了业务代码和非业务代码的分离,降低了耦合度

好处:模块之间的耦合度降低

原理:动态代理模式,给业务代码生成代理对象

AOP的基本概念

  1. 连接点:类中可以被增强(加功能)的方法
  2. 切入点:类中实际被增强的方法
  3. 通知:通知是指一个切面在特定的连接点要做的事情(增强的功能).通知分为方法执行前通知,方法执行后通知,环绕通知等
  4. 目标:代理的目标类(连接点和切入点所在的类)
  5. 代理:向目标对象 应用通知时 创建的代理对象

SpringAOP实现

第一步:引入jar包

        <!-- Spring AOP --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.2.RELEASE</version></dependency>

第二步:代码实现(通知实现)

常用通知类型

  1. @Before   前置通知  在业务代码之前执行
  2. @After      后置通知  在业务代码之后执行(即使业务代码出现异常也执行)
  3. @AfterReturnning  返回通知  在业务代码执行完后执行(业务代码出现异常不执行)
  4. @AfterThrowing     异常通知  在业务代码出现异常执行
  5. @Around                环绕通知  方法执行前后都有通知

代码演示:

("execution(* com.kid.springpro.Dao.AdminDao.*.*(..))") --->执行通知的方法

@Before]

@Before("execution(* com.kid.springpro.Dao.AdminDao.*.*(..))")public void printLog() {System.out.println("打印日志");}

@AfterThrowing

@AfterThrowing(value = "execution(* com.kid.springpro.Dao.AdminDao.*.*(..))",throwing = "throwable")public void exception(Throwable throwable){System.out.println("系统忙" +throwable.getMessage());throwable.printStackTrace();}

注:前四个通知都类似

 @Around :的执行顺序主要更具自己的定义编写,如下方代码

@Around(value = "execution(* com.kid.springpro.Dao.AdminDao.*(..))")public void around(ProceedingJoinPoint joinPoint){try {System.out.println("前置通知");joinPoint.proceed();System.out.println("返回通知");} catch (Throwable throwable) {throwable.printStackTrace();System.out.println("异常通知");}System.out.println("后置通知");}

joinPoint.proceed();----->业务代码 

代码解释 

Spring事务管理

事务管理:本质上是数据库提供的一种管理机制

    数据库事务管理  是对一次数据库操作过程中,执行的多条语句进行的管理,确保这一次操作过程中的多条sql要么都执行成功,要么都不执行,从而保证数据的一致性

转账: sql1 A-500  Sql2 B+500 确保转账数据的一致

Spring事务管理是spring框架对事物提交这以功能进行封装,程序员在业务开发中不需要显示的提交事务

Spring事物管理

1.编程式事务管理

在项目中很少使用,这种方式我们需要在代码中需要提交事务或回滚 事务时自己写代码实现

2.声明式事务管理

声明事务底层使用AOP思想,可以为方法添加事务功能,他的控制是方法级别的

事务管理的配置

配置spring管理器

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

id为数据库管理的id,即下方id

    <!--阿里巴巴数据库连接管理对象,负责生成数据库连接对象,以及提供数据库连接池功能让Spring管理阿里巴巴数据库连接对象--><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"></property><property name="username" value="root"></property><property name="password" value="root"></property><property name="initialSize" value="10"></property><!--初始化连接数量--><property name="maxActive" value="20"></property><!--最大连接数量--></bean>

 开启注解事务管理

<!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

 开启事务管理:在类或方法上使用@Transactional 标签即可

声明事务失败的场景:

  1. 用在了非public的方法上(权限不够)
  2. 方法中的异常被捕获,会认为方法没有出现异常,事务还会提交
  3. 方法中出现了编译器异常,还是会提交事务
  4. 数据库引擎不支持事务 mysql中只有innodb支持事务

解决失败场景的第三:

@Transactional(rollbackFor = Exception.class)

SpringWeb配置

导入jar包

        <!--Spring web--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.2.RELEASE</version></dependency>

在web.xml文件中位置spring核心分发器

    <servlet><servlet-name>application</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></init-param><load-on-startup>0</load-on-startup></servlet><!-- 请求映射 --><servlet-mapping><servlet-name>application</servlet-name><url-pattern>/</url-pattern></servlet-mapping>

在spring.xml文件中开启SpringWeb注解

<mvc:annotation-driven></mvc:annotation-driven>



 感谢大家的观看,本次分享就到这里。希望我的内容能够对您有所帮助。创作不易,欢迎大家多多支持,您的每一个点赞都是我持续更新的最大动力!如有不同意见,欢迎在评论区积极讨论,让我们一起学习、共同进步!如果有相关问题,也可以私信我,我会认真查看每一条留言。期待下次再见!

                                       希望路飞的笑容可以治愈努力路途中的你我!

博主vx:Dreamkid05 --->欢迎大家和博主讨论问题 

这篇关于Spring数据访问层管理 ▎集成MyBatis ▎AOP ▎事务管理 ▎SpringWeb配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119187

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三