Spring JDBC配置与讲解

目录

  • 一、Spring JDBC概述
    • 1、Spring JDBC需要配置的依赖
    • 2、Spring配置项文件配置
  • 二、Spring JDBC的使用
    • 1、Spring JDBC的增加操作
    • 2、Spring JDBC的修改操作
    • 3、Spring JDBC的删除操作
    • 4、Spring JDBC的查询操作
  • 三、Spring JDBC的事务
    • 1、xml的形式进行事务
    • 2、@Transactional注解

一、Spring JDBC概述

Spring Data JDBC 是 Spring Data 项目的一部分,它提供了一种简化的数据访问方式,用于与关系型数据库进行交互。与传统的 ORM 框架相比,Spring Data JDBC 更加轻量级,并且更注重直接映射数据库表结构和 SQL 查询的控制。它基于 JDBC 驱动程序,提供了一套简洁的 API 和注解,使开发人员能够通过简单的 Java 对象来表示数据库表,并通过自动生成的 SQL 语句执行常见的 CRUD 操作。Spring Data JDBC 还支持复杂的关联关系、查询方法的定义和自定义 SQL 查询等功能,使开发人员能够更灵活地操作数据库。

1、Spring JDBC需要配置的依赖

我们创建好maven项目之后,需要对maven项目添加相对应的依赖,在本文章当中如果我们想要使用Spring JDBC的时候需要添加如下的依赖 :

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.21</version></dependency><!--mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--AOP联盟--><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency>

其中使用jdbc的核心依赖是:

    <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.21</version></dependency><!--mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency>

使用AOP的依赖是:

 <!--AOP联盟--><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency>

2、Spring配置项文件配置

我们使用Spring AOP、SpringIoC、Spring JDBC的情况下,我们需要在maven项目中的resources文件下创建Spring的配置项文件,并且进行配置。
在这里插入图片描述

在这里插入图片描述
Spring.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:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置数据源 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/springjdbc"/><property name="username" value="root"/><property name="password" value="12171032"/></bean><!-- 配置 JdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>
</beans>

其中: xmlns:tx="http://www.springframework.org/schema/tx"是为了防止事务爆红把必须添加的,不添加使用事务的时候会爆红。
需要在Spring配置自己的数据库,以及配置jdbcTemplate,需要将这两部分交给IoC容器管理。

二、Spring JDBC的使用

该项目的目录如下创建:
在这里插入图片描述
entity目录中查询返回来的结果。
dao层用来存放执行和数据库交互的文件的目录。
User类创建如下:

package com.example.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;}

如果想要使用lombok的情况下,就得按照上面情况引入lombok依赖:
在这里插入图片描述
建立的数据库可执行代码如下(需要自己建立好数据库,这里只提供创建表的sql语句):

CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'老王','2018-02-27
17:47:08','男','北京'),(2,'熊大','2018-03-02 15:09:37','女','上海'),(3,'熊二','2018-03-04
11:34:34','女','深圳'),(4,'光头强','2018-03-04 12:04:06','男','广州');

Test测试文件:

public class Test1 {private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");private JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean(JdbcTemplate.class);}

测试文件得利用DI将jdbcTemplate加载到当前文件当中

1、Spring JDBC的增加操作

jdbc中的新增操作:

    @Testpublic void add(){String sql = "insert into user(username,sex,address) values('as','男','上海')";jdbcTemplate.execute(sql);}

2、Spring JDBC的修改操作

    @Testpublic void update(){String sql = "update user set username ='刘纯亚' where id = 1";jdbcTemplate.update(sql);}

3、Spring JDBC的删除操作

    @Testpublic void delete(){String sql = "delete from user where id = ?";jdbcTemplate.update(sql,1);}

4、Spring JDBC的查询操作

    @Testpublic void searchAll(){String sql = "select * from user";List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));for(User user:userList){System.out.println(user);}}

三、Spring JDBC的事务

案列A对B转账,A的钱少100,B的钱多100,两者具有原子性,要不同时成功,要不同时失败。数据库中的数据如下:
在这里插入图片描述

1、xml的形式进行事务

对Spring.xml进行修改:

    <bean id="txtManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><bean id="adaoImpl" class="com.example.dao.impl.AdaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate"></property></bean><tx:advice id="txAdvice" transaction-manager="txtManager"><tx:attributes><tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/></tx:attributes></tx:advice><aop:config><aop:pointcut id="pc" expression="execution(* com.example.dao.impl.AdaoImpl.transfer(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config>
 <bean id="txtManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean>

用来加载DataSourceTransactionManager,上面的操作是通过AOP对原本的事务进行增强,而不是通过修改原本的代码。
AOP操作:

    <aop:config><aop:pointcut id="pc" expression="execution(* com.example.dao.impl.AdaoImpl.transfer(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config>

Adao和Adaoimpl中的代码如下:

package com.example.dao.impl;import com.example.dao.Adao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
@NoArgsConstructor
@Data
@AllArgsConstructor
public class AdaoImpl implements Adao {private JdbcTemplate jdbcTemplate;@Overridepublic void transfer(String A, String B, int money) {String sql1 = "update peoplemoney set money = money-? where id = ?";String sql2 = "update peoplemoney set money = money+? where id = ?";jdbcTemplate.update(sql1,money,A);jdbcTemplate.update(sql2,money,B);}
}
package com.example.dao;public interface Adao {public void transfer(String A,String B,int money);
}

测试类中的代码:

    @Testpublic void  m1(){Adao adaoImpl = (Adao) applicationContext.getBean("adaoImpl");adaoImpl.transfer("1","2",100);System.out.println(adaoImpl);}

当事务没有回滚的时候,可以实现A减少100,B增加100。
在这里插入图片描述
自动添加错误之后;
在这里插入图片描述
测试结果:
在这里插入图片描述
在这里插入图片描述
数据库中的数据没有发生改变出现了事务回滚。

2、@Transactional注解

AdaoImpl中的代码修改如下:

package com.example.dao.impl;import com.example.dao.Adao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@NoArgsConstructor
@Data
@AllArgsConstructorpublic class AdaoImpl implements Adao {private JdbcTemplate jdbcTemplate;@Override@Transactional(rollbackFor = Exception.class)public void transfer(String A, String B, int money) {String sql1 = "update peoplemoney set money = money-? where id = ?";String sql2 = "update peoplemoney set money = money+? where id = ?";jdbcTemplate.update(sql1,money,A);System.out.println(1/0);jdbcTemplate.update(sql2,money,B);}
}

Spring.xml中的代码修改如下:

<!--    <tx:advice id="txAdvice" transaction-manager="txtManager">-->
<!--        <tx:attributes>-->
<!--            <tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>-->
<!--        </tx:attributes>-->
<!--    </tx:advice>-->
<!--    <aop:config>-->
<!--        <aop:pointcut id="pc" expression="execution(* com.example.dao.impl.AdaoImpl.transfer(..))"/>-->
<!--        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>-->
<!--    </aop:config>--><tx:annotation-driven transaction-manager="txtManager"></tx:annotation-driven><context:component-scan base-package="com.example"></context:component-scan>

注释掉AOP等保留DataSourceTransactionManager,配合@Transactional使用就可以完成事务。

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

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

相关文章

【AI智能体】Spring AI MCP 服务常用开发模式实战详解

目录 一、前言 二、MCP 介绍 2.1 MCP是什么 2.2 MCP 核心特点 2.3 Spring AI MCP 介绍 2.3.1 Spring AI MCP架构 2.3.2 Spring AI MCP分层说明 2.4 两种模式介绍 三、本地开发SSE模式 3.1 搭建mcp-server 3.1.1 导入工程核心依赖 3.1.2 添加配置文件 3.1.3 提供两个…

OpenStack 入门与实践

一、云计算概述 1.1 云计算的定义与本质 云计算&#xff08;Cloud Computing&#xff09;是一种基于网络的超级计算模式&#xff0c;它能够根据用户的不同需求&#xff0c;动态提供所需的计算资源、存储资源和网络资源等。这种模式就像我们日常生活中使用水电煤气一样&#x…

AntV L7入门教程

以下教程将系统地介绍 AntV L7 的核心 Scene 类用法&#xff0c;涵盖实例化、地图配置、视图操作、图层管理、事件监听及资源销毁等常用 API&#xff0c;并为每个方法给出完整示例代码。所有示例均基于官方 API 文档 ([l7.antv.antgroup.com][1])。 一、安装与引入 # 安装 L7…

【边缘计算】场景

工业互联网 对现场采集的数据进行数据预处理&#xff0c;将现场有用的信息提取出来实时上传给平台&#xff0c;为平台大大减轻了处理的工作量。 汇聚现场数据统一接口上传数据到云端&#xff0c;大大提高系统多样部署的安全性&#xff0c;解决现场数据跨域访问的问题。制造企业…

【FPGA学习】DDS信号发生器设计

目录 一、设计原理与准备​ 1.1 DDS 原理​ 1.2 IP 核学习与准备​&#xff1a;FPGA开发中常用IP核——ROM/RAM/FIFO 2、ROM文件的设置 1.3 开发环境搭建​ 二、DDS 信号发生器设计实现 2.1 系统架构设计​ 2.2 代码编写与模块实现​ 三、测试结果与总结​ 参考文献&…

pyqt 简单条码系统

生产数据管理系统说明 系统概述 这是一个基于PyQt5和pyodbc开发的生产数据管理系统&#xff0c;主要用于管理生产过程中的物料绑定和查询操作。系统提供了上料绑定和下料查询功能&#xff0c;支持与SQL Server数据库交互&#xff0c;实现数据的插入、查询、更新和删除操作。界…

【unitrix】 4.1 类型级加一操作(Add1.rs)

一、原码 这段代码实现了一个类型级的加一操作(Add1 trait)&#xff0c;用于在Rust的类型系统中进行数值加一运算。 //! 加一操作特质实现 / Increment operation trait implementation //! //! 说明&#xff1a; //! 1. Z0、P1,、N1 1&#xff0c;常规计算 //! 2. …

git工作中常用

1.管理本地文件 git init//初始化生成一个本地仓库 git add * //添加到暂存区 git commit–m “message” //提交到本地仓库 2.删除本地分支 git branch -d local_branch_name3.隐藏及解除隐藏 git stashgit stash pop4.远程新建分支&#xff0c;在本地签出时候怎么看到 …

Golang 中接口嵌套的详细说明和使用示例

在 Go 语言中&#xff0c;接口嵌套&#xff08;也称为接口组合&#xff09;是一种强大的特性&#xff0c;它允许你通过组合现有接口来创建新的接口。这种方式遵循了 Go 的组合优于继承的设计哲学。 接口嵌套的基本概念 接口嵌套是指在一个接口中嵌入其他接口&#xff0c;从而…

数智管理学(二十四)

第二章 数智化重塑管理的核心 第三节 动态资源配置与实时优化 在当今数智化浪潮的席卷下&#xff0c;企业管理面临着前所未有的变革与挑战。资源配置作为企业管理的核心环节之一&#xff0c;其方式和效率直接影响着企业的运营成本、生产效率和市场竞争力。传统的静态资源配置…

Redis 各版本差异及性能测试指标对比

Redis 各版本差异及性能测试指标对比 Redis 主要版本差异 Redis 2.x 系列 主要特性&#xff1a; 支持主从复制支持简单的持久化(RDB和AOF)发布/订阅功能事务支持 局限性&#xff1a; 单线程模型集群功能有限 Redis 3.x 系列 重大改进&#xff1a; 引入Redis Cluster(官方…

Python图形化秒表:使用Turtle打造精确计时工具

⏱️ 编程基础第一期《6-30》–简易计时器/秒表&#xff0c;这是一个使用Python的turtle和time模块实现的简易计时器/秒表程序&#xff0c;提供简洁的数字时间显示。 目录 &#x1f31f; 功能特点&#x1f680; 使用方法&#x1f9e9; 程序架构设计&#x1f4bb; 代码详解窗口和…

【轨物方案】轨物科技|LoRaWAN 赋能智能光伏清扫,解锁电站高效运维新时代

在大型集中式光伏电站的广袤土地上&#xff0c;清扫机器人的高效运行是保障发电效率的关键。然而&#xff0c;传统的无线通信方式在这些偏远、无4G/5G信号覆盖的区域&#xff0c;往往步履维艰。作为专注于工业物联网解决方案的轨物科技&#xff0c;我们深知这些痛点&#xff0c…

Python函数实战:从基础到高级应用

Python-函数 Python 中可以使用def关键字来定义函数。 函数定义规则&#xff1a; 函数代码块以 def 关键词开头&#xff0c;后接函数标识符名称和圆括号 ()。任何传入参数和自变量必须放在圆括号中间&#xff0c;圆括号之间可以用于定义参数。函数的第一行语句可以选择性地使…

Mac在局域网中突然很慢(包括SMB、NFS、SCP、SSH、Ping等场景均很慢)

今天 SMB 又突然好慢&#xff0c;大概只有 8-9 MB/s&#xff0c;而苹果 SMB 很容易突然很慢是出了名的。我就想装 NFS&#xff0c;但是 NFS 弄好之后还是很慢&#xff0c;我服了&#xff0c;我就检查了scp等场景&#xff0c;都很慢&#xff0c;但是互联网下载速度还是很快的。 …

UMAP:用于降维的均匀流形近似和投影实验

关键词&#xff1a; Uniform Manifold Approximation and Projection (UMAP)&#xff1a;均匀流形近似与投影 一、说明 对于降维&#xff0c;首先看数据集是否线性&#xff0c;如果是线性的用pca降维&#xff1b;如果是非线性数据&#xff0c;t-SNE或者UMAP&#xff0c;本文针…

【Datawhale组队学习202506】YOLO-Master task03 IOU总结

系列文章目录 task01 导学课程 task02 YOLO系列发展线 文章目录 系列文章目录前言1 功能分块1.1 骨干网络 Backbone1.2 颈部网络 Neck1.3 头部网络 Head1.3.1 边界框回归头1.3.2 分类头 2 关键概念3 典型算法3.1 NMS3.2 IoU 总结 前言 Datawhale是一个专注于AI与数据科学的开…

Spring IOC容器核心揭秘:BeanFactory创建、配置加载解析并注册为BeanDefinition

文章目录 一、为何这个阶段如此重要&#xff1f;二、整体流程全景图三、源码级深度解析1. BeanFactory的诞生源码入口&#xff1a;refresh()方法核心方法&#xff1a;obtainFreshBeanFactory()核心实现&#xff1a;refreshBeanFactory()BeanFactory实例化 2. ★ 核心&#xff1…

解锁n8n:开启工作流自动化的无限可能(5/6)

文章摘要&#xff1a;n8n 是一款开源低代码工作流自动化平台&#xff0c;通过可视化拖放节点创建复杂工作流&#xff0c;无需大量代码。具有强大集成能力、数据转换、错误处理等功能&#xff0c;适用于数据同步、客户关系管理、IT 自动化等场景。相比 Zapier、IFTTT 等工具&…

数据赋能(308)——合作共享——数据交流

概述 重要性如下&#xff1a; 信息准确性&#xff1a;数据交流原则确保在数据传递过程中信息的准确性&#xff0c;这是决策和业务活动的基础。决策支持&#xff1a;准确的数据交流为决策提供有力支持&#xff0c;帮助组织做出更明智的决策。业务效率&#xff1a;有效的数据交…