Spring-基础知识二

news2024/11/19 6:38:07

Spring

  • 9.Spring JdbcTemplate的使用
    • 9.1 JdbcTemplate入门
      • 9.1.1 需要的包
      • 9.1.2 代码测试
    • 9.2 将数据源和jdbcTemplate交给Spring来管理
      • 9.2.1 druid连接池
      • 9.2.2 使用外部文件配置数据连接信息
    • 9.3 基于JdbcTemplate实现DAO
  • 9.Spring的事务管理机制
    • 9.1 PlatformTransactionManager 事务管理器
    • 9.2 TransactionDefinition 事务定义信息

9.Spring JdbcTemplate的使用

Spring对不同持久化技术的支持,Spring为各种支持的持久化技术,都提供了简单操作的模板和回调

ORM持久化技术模板类
JDBCorg.springframework.jdbc.core.JdbcTemplate
Hibernate5.0org.springframework.orm.hibernate5.HibernateTemplate
IBatis(MyBatis)org.springframework.orm.ibatis.SqlMapClientTemplate
JPAorg.springframework.orm.jpa.JpaTemplate

9.1 JdbcTemplate入门

9.1.1 需要的包

<dependencies>

   <!-- unit测试 -->
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
     <scope>compile</scope>
   </dependency>

   <!-- jdbc包 -->
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-jdbc</artifactId>
     <version>5.2.10.RELEASE</version>
   </dependency>

   <!-- 事务相关 -->
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-tx</artifactId>
     <version>5.2.10.RELEASE</version>
   </dependency>

   <!-- mysql -->
   <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.29</version>
   </dependency>

 </dependencies>

9.1.2 代码测试

public class JdbcTemplateTest {

    @Test
    public void test(){
        //目标:使用jdbctemplate执行一段sql
        //1.构建数据源
        //spring内置了一个数据源
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/my_database");
        dataSource.setUsername("root");
        dataSource.setPassword("root");

        //2.创建jdbctemplate实例
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        //3.执行sql,创建表test001
        jdbcTemplate.execute("create table test001(id int,name varchar(20))");
    }
}

9.2 将数据源和jdbcTemplate交给Spring来管理

9.2.1 druid连接池

  • DriverManagerDataSource(Spring内置数据源)
  • DBCP连接池
  • C3P0连接池
  • druid连接池

此处我们使用druid连接池

<!-- druid连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/my_database"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!-- 注入数据源 -->
    <property name="dataSource" ref="dataSource"/>
</bean>

9.2.2 使用外部文件配置数据连接信息

druid.properties

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/my_database
jdbc.username=root
jdbc.password=root
<!-- druid连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driverClass}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

9.3 基于JdbcTemplate实现DAO

为了方便Dao中注入JdbcTemplate,Spring为每一个持久化技术都提供了支持类,如图
在这里插入图片描述
此处我们使用JDBC的支持类:JdbcDAOSupport

操作方式分为

  • 1.编写dao类,并继承JdbcDAOSupport
public class BookDao extends JdbcDaoSupport {

    //保存图书
    public void save(Book book) {
        String sql = "insert into book values(null,?,?)";
        // 调用jdbctemplate
        // jdbcTemplate.update(sql, book.getName(),book.getPrice());
        super.getJdbcTemplate().update(sql, book.getName(), book.getPrice());
    }

    // 更新
    public void update(Book book) {
        String sql = "update book set name =? ,price =? where id =?";
        super.getJdbcTemplate().update(sql, book.getName(), book.getPrice(), book.getId());
    }

    // 删除
    public void delete(Book book) {
        super.getJdbcTemplate().update("delete from book where id =?", book.getId());
    }

    //根据id查询
    public Book findById(Integer id) {
        String sql = "select * from book where id = ?";
        return super.getJdbcTemplate().queryForObject(sql, BeanPropertyRowMapper.newInstance(Book.class), id);
    }

    //查询所有
    public List<Book> findAll() {
        String sql = "select * from book";
        return super.getJdbcTemplate().query(sql, BeanPropertyRowMapper.newInstance(Book.class));
    }

    //条件查询: 根据图书名称模糊查询信息
    public List<Book> findByNameLike(String name) {
        String sql = "select * from book where name like ?";
        return super.getJdbcTemplate().query(sql, BeanPropertyRowMapper.newInstance(Book.class), "%" + name + "%");
    }

}
  • 2.在Spring配置文件中,将jdbcTemplate注入到dao类(或者直接注入数据源)
<!-- jdbctemplate对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	<!-- 注入数据源 -->
	<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置dao,注入jdbctemplate -->
<bean id="bookDao" class="cn.itcast.spring.dao.BookDao">
	<!-- 方案一:在BookDao中提供jdbcTempate属性,通过set方法注入 jdbcTemplate-->
	<!-- <property name="jdbcTemplate" ref="jdbcTemplate"/> -->
	<!-- 方案二:BookDao类继承JdbcDaoSupport,直接注入数据源,就拥有了jdbctempate对象 -->
	<property name="dataSource" ref="dataSource"/>
</bean>

9.Spring的事务管理机制

Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的:

  • PlatformTransactionManager:事务管理器—主要用于平台相关事务的管理
  • TransactionDefinition: 事务定义信息(隔离、传播、超时、只读)—通过配置如何进行事务管理。
  • TransactionStatus:事务具体运行状态—事务管理过程中,每个时间点事务的状态信息。

9.1 PlatformTransactionManager 事务管理器

Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现:

事务说明
org.springframework.jdbc.datasource.DataSourceTransactionManager使用Spring JDBCiBatis进行持久化数据时使用
org.springframework.orm.hibernate5.HibernateTransactionManager使用Hibernate5.0版本进行持久化数据时使用
org.springframework.orm.jpa.JpaTransactionManager使用JPA进行持久化时使用
org.springframework.jdo.JdoTransactionManager当持久化机制是Jdo时使用
org.springframework.transaction.jta.JtaTransactionManager使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用

DataSourceTransactionManager针对JdbcTemplate、MyBatis 事务控制 ,使用Connection(连接)进行事务控制 :

  • 开启事务 connection.setAutoCommit(false);
  • 提交事务 connection.commit();
  • 回滚事务 connection.rollback();

用户根据选择和使用的持久层技术,来选择对应的事务管理器

9.2 TransactionDefinition 事务定义信息

该接口主要提供的方法:

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

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

相关文章

第十章 面向对象编程(高级)

一、类变量和类方法&#xff08;P374&#xff09; 1. 类变量 定义语法&#xff1a; 访问修饰符 static 数据类型 变量名&#xff1b; 类变量也叫静态变量/静态属性&#xff0c;是该类的所有对象共享的变量&#xff0c;任何一个该类的对象去访问它时&…

微服务 热点流控 规则-授权 系统规则 自定义返回

微服务 热点流控 规则-授权 系统规则 自定义返回Sentinel-热点流控操作示例Sentinel规则-授权操作示例Sentinel规则-系统规则Sentinel自定义异常返回Sentinel-热点流控 拿商品举例&#xff0c;当一个商品的查询请求量异常火爆的时候&#xff0c;应该对该商品的查询请求进行限流…

FineReport使用

目录报表命名规范数据集命名规则参数命名规则条件属性命名规则超链接命名规范决策报表组件命名规则普通报表悬浮元素命名规则用户权限模版版本管理FineDB内置数据库外置数据库配置外接数据库新建数据库外接数据库配置入口配置外接数据库数据表权限控制&#xff1a;用户-部门职位…

【JavaEE】锁策略 + synchronized原理 + CAS + JUC下常用类和接口 + 死锁

目录 锁策略 乐观锁VS悲观锁 轻量级锁VS重量级锁 自旋锁VS挂起等待锁 互斥锁VS读写锁 公平锁VS非公平锁 可重入锁VS不可重入锁 synchronized原理 synchronized特性 synchronized优化机制 加锁过程优化 锁消除 锁粗化 CAS CAS概念 CAS原理 CAS应用 自旋锁的实…

Vite+Vue3+TypeScript 搭建开发脚手架

Vite前端开发与构建工具 开发环境中&#xff0c;vite无需打包&#xff0c;可快速的冷启动 真正的按需编译&#xff0c;不需要等待整个应用编译完成 一个开发服务器&#xff0c;它基于原生ES模块 提供了丰富的内建功能&#xff0c;速度快模块热更新&#xff08;HMR&#xff0…

2022年10个最流行Blender插件

如果你从事平面设计、动画或 3D 建模&#xff0c;您可能听说过Blender&#xff0c;这是一款开源的一体化 3D 图形软件。Blender 配备了适用于各种领域的工具和功能&#xff0c;包括 3D 动画、计算机辅助设计、纹理编辑、特殊效果等。 Blender 的最新版本3.0于 2021 年 12 月上…

LeetCode题目笔记——1566. 重复至少 K 次且长度为 M 的模式

文章目录题目描述题目难度——简单方法一&#xff1a;模拟代码/C总结题目描述 给你一个正整数数组 arr&#xff0c;请你找出一个长度为 m 且在数组中至少重复 k 次的模式。 模式 是由一个或多个值组成的子数组&#xff08;连续的子序列&#xff09;&#xff0c;连续 重复多次…

【面试】vue组件style中scoped的作用是什么?什么是scoped穿透?

vue组件style中scoped的作用是什么&#xff1f; 在Vue文件中的style标签上有一个特殊的属性——scoped。scoped属性是 HTML5 中的新属性&#xff0c;是一个布尔属性&#xff0c;如果使用该属性&#xff0c;则css样式仅仅只能应用到当前的Vue组件&#xff0c;避免组件之间样式相…

EfficientNet v1 v2

EfficientNet v1 增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深会面临梯度消失&#xff0c;训练困难的问题。增加网络的width能够获得更高细粒度的特征并且也更容易训练&#xff0c;但对于width很大而深度较浅的网络往往很…

Base64编码

介绍 Base64 编码 Base64 是一种使用 64 个可打印字符来表示二进制数据的编码方式。 Base64 中的 64 个可打印字符包括&#xff1a;大小写字母 a - z、阿拉伯数字 0 - 9&#xff0c;这样共有 62 个字符&#xff0c;另外两个可打印字符在不同的系统中而不同。RFC 4648 标准中&…

程序员可以不看书,但不可以不知道这些网站!

程序员可以不看书&#xff0c;但是不能停止学习。如果你不喜欢看书&#xff0c;这些网站可以先收藏下来&#xff01; 花了两天整理出的程序员常看的网站&#xff0c;纯纯干货来了↓↓ 一、学习网站 ①菜鸟教程 这个网站有HTML、CSS、Javascript、PHP、C、Python等各种基础编…

关于python常用软件用法:Pycharm 常用功能

一.Pycharm的基本使用 1.在Pycharm下为你的Python项目配置Python解释器 &#xff08;1&#xff09;.Setting>Project Interpreter>源码资料电子书:点击此处跳转文末名片获取 二.在Pycharm下创建Python文件、Python模块 1.File>New>Python File2.File>New>P…

Mysql高级部分学习笔记(一)——底层及索引

0. 概述 我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能 就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题…

使用windows电脑SSH客户端链接Iphone手机的sshd服务(免越狱)

最近有需求使用电脑导出手机中特定app的文件。 当然可以直接连上数据线将手机中的文件下载下来。 为了能做到代码自动化导出&#xff0c;将手机作为一台电脑使用&#xff0c;将手机中的文件导出来。 关键问题是如何将手机作为电脑使用&#xff0c;这里有几个步骤(我使用的是…

关于接口测试自动化的总结与思考

关于接口测试自动化的总结与思考 目录&#xff1a;导读 什么是服务端? 什么是接口? 什么是接口测试? 为什么要做接口测试? 如何做接口测试&#xff1f; 什么是接口测试自动化? 为什么要做接口测试自动化? 接口测试自动化的规范 文档准备 明确接口测试自动化需…

CRI 与 ShimV2:一种 Kubernetes 集成容器运行时的新思路

作者|张磊 CRI 与 ShimV2&#xff1a;一种 Kubernetes 集成容器运行时的新思路-阿里云开发者社区 Kubernetes 项目目前的重点发展方向&#xff0c;是为开发者和使用者暴露更多的接口和可扩展机制&#xff0c;将更多的用户需求下放到社区来完成。其中&#xff0c;发展最为成熟…

再探前端低代码的“野路子”

之前码过很多低代码的文章&#xff0c;发现大家口中的低代码挺不一样的&#xff0c;这次心血来潮想探探低代码的野路子。 只需要拖拽操作或者几行基础代码&#xff0c;就能完成以往需要程序员才能搭建的各类应用系统&#xff0c;对效率要求较高的企业而言&#xff0c;是不是很有…

命令执行简介、命令执行函数

数据来源 命令执行简介 01 命令执行漏洞产生原因 02 命令执行漏洞的危害 03 远程代码执行 1&#xff09;远程代码执行- eval函数 2&#xff09;远程代码执行 - assert函数 3&#xff09;远程代码执行 - preg_replace函数 使用方法和一句话木马一样 示例&#xff1a; 在ph…

9 多分类问题

文章目录问题引入网络设计改进网络方法softmax层lossMINIST引入代码实现课程内容来源&#xff1a; 链接课程文本借鉴&#xff1a; 链接以及Birandaの突然发现的也挺好&#xff1a;链接 问题引入 前篇中&#xff0c;对糖尿病数据集的问题是一个二分类问题&#xff0c;但实际问…

vue-node解决 rollbackFailedOptional: verb npm-session fd23ceb3f5797b77进度条卡住的问题

一、文章引导 #mermaid-svg-qv5tmCFBaoUwQojc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qv5tmCFBaoUwQojc .error-icon{fill:#552222;}#mermaid-svg-qv5tmCFBaoUwQojc .error-text{fill:#552222;stroke:#55222…