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

news2024/11/16 13:42:47

前言:

在现代软件开发中,数据访问层的管理至关重要。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 --->欢迎大家和博主讨论问题 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Material-UI】Select组件中的Native Select与TextField详解

文章目录 一、Select 组件概述1. 组件介绍2. Native Select 与 TextField 的区别 二、Native Select 组件详解1. 何为 Native Select2. Native Select 的基本用法3. Native Select 的优势与适用场景4. 自定义 Native Select 的样式 三、TextField 与 Select 的结合使用1. TextF…

BMS(三)

BAT (Pin 1): 连接到电池组的最高电压端&#xff08;CELL5&#xff09;。芯片通过该引脚监控整个电池组的总电压。 VC5 (Pin 2): 连接到第五节电池的正极&#xff0c;用于监控第五节电池的电压。 VC4 (Pin 3): 连接到第四节电池的正极&#xff0c;用于监控第四节电池的电压。 V…

【Datawhale X 李宏毅苹果书 AI夏令营】《深度学习详解》Task2 打卡

文章目录 前言学习目标一、线性模型二、分段线性曲线总结 前言 本文是【Datawhale X 李宏毅苹果书 AI夏令营】的Task2学习笔记打卡。 学习目标 李宏毅老师对应视频课程&#xff1a;https://www.bilibili.com/video/BV1JA411c7VT?p3 《深度学习详解》第一章主要介绍了深度学习…

Windows中Jupyter notebook设置默认目录

起因是我想白嫖实验室的显卡&#xff0c;就想在实验室电脑上安一个jupyter&#xff0c;就有了一系列问题 默认位置是这样的 方法一&#xff1a;配置文件 step1&#xff1a;生成jupyter配置文件 打开cmd&#xff0c;输入【jupyter notebook --generate-config】&#xff0c;输…

基于yolov8的行人跌倒检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的行人跌倒检测系统是利用先进的深度学习技术&#xff0c;特别是YOLOv8模型&#xff0c;来实现高效、准确的行人跌倒行为检测。YOLOv8作为YOLO系列的最新版本&#xff0c;通过改进的网络架构和训练策略&#xff0c;在保持高检测速度的同时&#xff0c;…

opencv实战项目十七:透射变换仪表表盘校正

文章目录 前言一、透射变换介绍&#xff1a;二、opencv实现2.1 cv2.getPerspectiveTransform()2.2 cv2.warpPerspective&#xff08;&#xff09; 三&#xff0c;代码实现&#xff1a;四&#xff0c;矫正效果&#xff1a; 前言 在这个信息化时代&#xff0c;图像处理技术在众多…

Python 利用rasterio库进行坐标转换

这是一篇必应上找的手册上的文章&#xff0c;特此记录 参考链接&#xff1a; 原文 参考链接2 影像中的RPC信息 目录 1、仿射变换矩阵转换2、使用控制点转换3、使用RPC进行坐标点转换 1、仿射变换矩阵转换 上面说的利用仿射转换矩阵进行转换&#xff0c;一些注意事项可以参考原文…

TQRFSOC开发板47DR LWIP自环测试

本例程基于RFSOC 47DR开发板实现LWIP自环通讯测试。使用开发板的网口与电脑或路由器等设备连接&#xff0c;使开发板与电脑在同一局域网内&#xff0c;使用telnet工具连接开发板&#xff0c;进行LWIP自环测试。 LWIP自环测试工程在Hello World项目上进行修改&#xff0c;首先打…

eclipse 配置 ABAP 连接操作手册

参考 GUI配置 按选择是否勾选single sign-on的方式&#xff0c;选择是否输入密码 点击NEXT 点击完成。

sqli-labs靶场通关攻略(46-50关)

第46关 &#xff08;ORDER BY数字型注入&#xff09; 输入?sort1 修改参数为2试一下 看到按照字母顺序进行了排序&#xff0c;所以它便是一个使用了order by语句进行排序的查询的一种查询输出方式 1出现报错&#xff0c;那么我们使用报错注入 查库 ?sort1 and updatexml(1,…

go.uber.org/ratelimit 源码分析

go.uber.org/ratelimit 源码分析 go 提供了一用来接口限流的包。其中"go.uber.org/ratelimit" 包正是基于漏桶算法实现的。 使用方式&#xff1a; 通过 ratelimit.New 创建限流器对象&#xff0c;参数为每秒允许的请求数&#xff08;RPS&#xff09;。使用 Take()…

8.29T2 国际象棋(构造:棋盘拆分成小方阵)

http://cplusoj.com/d/senior/p/NODSX2303B 暴力显然&#xff0c;因为肯定是从奇点到偶点&#xff0c;所以二分图匹配一下就好 首先我们手模一下&#xff0c;比如&#xff08;11,11&#xff09;&#xff0c;我们可以手模出一个情况&#xff0c;也就是DInic跑出来的情况&#…

培训第三十九天(了解docker-compose,docker-compose编排容器,配置harbor服务)

一、回顾 1、拉取私有仓库镜像 # 配置dockerdocker pull 10.0.0.10:5000/centosnginx:v0 2、容器网络类型 brideg(net) default# docker启动之后会生成新的虚拟网卡&#xff0c;网卡的名称docker0# 网段默认是172.17.0.1# 所有的容器都桥接docker0&#xff0c;通过桥接共享网…

对物料分别评估

业务示例 在公司中&#xff0c;某些物料是同时在内部进行生产和在外部进行采购的。由于必须根据值区分内部零件和外部零件&#xff0c;因此应为这些物料设置分别评估。 有关工厂内的评估&#xff0c;可使用分别评估根据特定标准区分物料的部分库存&#xff0c;并且可以不同方…

Python画笔案例-019 绘制阴影丫字

1、绘制阴影丫字 通过 python 的turtle 库绘制一个阴影丫字的图案&#xff0c;如下图&#xff1a; 2、实现代码 绘制一个阴影丫字图&#xff0c;以下为实现代码&#xff1a; """阴影丫字.py """ import turtleturtle.delay(0) turtle.speed(0)d…

Linux —— 驱动——platform平台总线

platform平台总线是Linux内核中一个重要的概念&#xff0c;主要用于管理那些不通过传统物理总线&#xff08;如USB、I2C、SPI等&#xff09;连接的设备&#xff0c;特别是SoC&#xff08;System on Chip&#xff0c;片上系统&#xff09;内部集成的外设。以下是对platform平台总…

mysql8.0查询等级排名可使用窗口函数,那5.7的版本呢?

1、需求&#xff1a;查询用户详情的同时查询用户的排名 2、首先看下数据库表设计 分为会员用户表member_user和会员等级表member_level&#xff0c;升级的条件是根据经验值升级&#xff0c;表结构如下&#xff1a; 用户表 member_user CREATE TABLE member_user (id bigint(…

C#操作ms office实现office转pdf

前提 安装office 2019 安装vs 2022 新建项目 引入4个com包 编写代码 代码结构 代码如下 using Microsoft.Office.Interop.Excel;namespace UseMsOffice {internal class Program{static void Main(string[] args){WordToPdf();ExcelToPdf();PPTToPdf();}static void W…

SpringBoot3与AOP完美结合:轻松追踪用户操作,实现精准日志记录

程序员必备宝典https://tmxkj.top/#/ 1.pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.alibaba</groupId&g…

LlamaIndex 实现 Agent

RAG 是在数据层面为大模型提供更多、更新的外部知识&#xff0c;而 Agent &#xff08;智能体&#xff09;&#xff0c;为大模型扩展了推理业务的能力。数据是静态的&#xff0c;数据周期可能是天、小时甚至到秒&#xff0c;通过 RAG 实现时&#xff0c;需要调用对应系统的 API…