韩顺平Java | C25 JDBC和连接池(中)

JDBCUtils工具类

JDBC操作中获取连接和释放资源操作可以封装到JDBCUtils工具类中。

工具类代码

完成mysql的连接和关闭资源

package com.hspedu.jdbc.utils;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;public class JDBCUtils {//定义相关属性(4个),因为只需要一份,因此做成静态的staticprivate static String user; //用户名private static String password; //密码private static String url; //urlprivate static String driver; //驱动//在static代码块初始化static {try {Properties properties = new Properties();properties.load(new FileInputStream("src\\mysql.properties"));//读取相关属性值user = properties.getProperty("user");password = properties.getProperty("password");url = properties.getProperty("url");driver = properties.getProperty("driver");} catch (IOException e) {//将编译异常转成运行异常抛出,调用者可以选择捕获或默认处理该异常throw new RuntimeException(e);}}//连接数据库,返回Connectionpublic static Connection getConnection() {try {return DriverManager.getConnection(url, user, password);} catch (SQLException e) {throw new RuntimeException(e);}}//关闭相关资源:ResultSet、Statement或PreparedStatement、Connectionpublic static void close(ResultSet set, Statement statement, Connection connection) {//如果传入对象则关闭,否则传nulltry {if(set != null){set.close();}if(statement != null){statement.close();}if(connection != null){connection.close();}} catch (SQLException e) {throw new RuntimeException(e);}}
}

使用JDBCUtils工具类完成DML和select

package com.hspedu.jdbc.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class JDBCUtils_Use {@Testpublic void testDML(){//1 得到连接Connection connection = JDBCUtils.getConnection();//2 组织sqlString sql = "update actor set name = ? where id = ?";PreparedStatement preparedStatement = null;//3 创建PreparedStatement对象try {preparedStatement = connection.prepareStatement(sql);//给占位符赋值preparedStatement.setString(1, "周星驰");preparedStatement.setInt(2, 1);//执行preparedStatement.executeUpdate();} catch (SQLException e) {throw new RuntimeException(e);} finally {//关闭资源JDBCUtils.close(null, preparedStatement, connection);}}@Testpublic void testSelect(){Connection connection = JDBCUtils.getConnection();String sql = "select * from actor where id = ?";PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, 1);resultSet = preparedStatement.executeQuery();//遍历该结果集while (resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");String sex = resultSet.getString("sex");Date borndate = resultSet.getDate("borndate");String phone = resultSet.getString("phone");System.out.println(id + "\t" + name + "\t" + sex + "\t" + borndate + "\t" + phone);}} catch (SQLException e) {throw new RuntimeException(e);}finally {JDBCUtils.close(resultSet, preparedStatement, connection);}}
}

※事务

JDBC程序中创建一个Connection对象时,默认自动提交事务:每当成功执行一个SQL语句时,就会像数据库自动提交,而不能回滚。
JDBC程序中为让多个SQL语句整体执行,需要使用事务。connection.setAutoCommit(false)取消自动提交事务,执行完成后connection.commit()提交事务,通过connection.rollback()回滚。

public class Transaction_ {@Testpublic void useTransaction() {//1 得到连接Connection connection = JDBCUtils.getConnection();//2 组织sqlString sql = "update accout set balance = balance - 100 where id = 1";String sql2 = "update accout set balance = balance + 100 where id = 2";PreparedStatement preparedStatement = null;//3 创建PreparedStatement对象try {//将connection设置为不自动提交connection.setAutoCommit(false);//开启事务preparedStatement = connection.prepareStatement(sql);//执行preparedStatement.executeUpdate(); //执行第一条sql// int i = 1 / 0; //执行中断preparedStatement.executeUpdate(sql2);//执行完成,提交事务connection.commit();} catch (SQLException e) {// 这里可以进行回滚,即撤销执行的sqlSystem.out.println("执行发生了异常,撤销执行的sql");try {connection.rollback(); //默认回滚到事务开始的状态} catch (SQLException ex) {throw new RuntimeException(ex);}throw new RuntimeException(e);} finally {//关闭资源JDBCUtils.close(null, preparedStatement, connection);}}
}

批处理

批处理机制:需成批插入或更新数据,允许多条语句一次性提交数据库批量处理。
jdbc连接mysql时,若需要使用批处理,须在url中添加参数?rewriteBatchedStatements=true
批处理一般和PrepareStatement一起使用。

addBatch() //添加需要批处理的sql语句或参数
excuteBatch() //执行批量处理语句
clearBatch() // 清空批处理包的语句
public class Batch_ {@Testpublic void noBatch() throws SQLException {Connection connection = JDBCUtils.getConnection();String sql = "insert into admin2 values(null, ?, ?)";PreparedStatement preparedStatement = connection.prepareStatement(sql);System.out.println("开始执行");long start = System.currentTimeMillis();for (int i = 0; i < 5000; i++) {preparedStatement.setString(1, "jack" + i);preparedStatement.setString(2, "666");preparedStatement.executeUpdate();}long end = System.currentTimeMillis();System.out.println("传统方式耗时" + (end - start));JDBCUtils.close(null, preparedStatement, connection);}@Testpublic void useBatch() throws SQLException {Connection connection = JDBCUtils.getConnection();String sql = "insert into admin2 values (null, ?, ?)";//values后须有空格 否则批处理失效PreparedStatement preparedStatement = connection.prepareStatement(sql);System.out.println("开始执行");long start = System.currentTimeMillis();for (int i = 0; i < 5000; i++) {preparedStatement.setString(1, "jack" + i);preparedStatement.setString(2, "666");//将sql语句加入到批处理包preparedStatement.addBatch();//每当有1000条记录时再批量执行if((i + 1) % 1000 == 0) {preparedStatement.executeBatch();preparedStatement.clearBatch();//清空}}long end = System.currentTimeMillis();System.out.println("批处理方式耗时" + (end - start));JDBCUtils.close(null, preparedStatement, connection);}
}

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

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

相关文章

数据结构--双向链表

在讲双向链表之前&#xff0c;我们先了解一下链表的分类&#xff1a; 链表的结构⾮常多样&#xff0c;主要分为带头与不带头、单向与双向、循环与不循环。三个种类可以任意搭配&#xff0c;所以总共可以形成八种链表&#xff0c;但是最常用的是单向不带头不循环链表和双向带头循…

如何从零开始创建React应用:简易指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

经典目标检测YOLOV1模型的训练及验证

1、前期准备 准备好目录结构、数据集和关于YOLOv1的基础认知 1.1 创建目录结构 自己创建项目目录结构&#xff0c;结构目录如下&#xff1a; network CNN Backbone 存放位置 weights 权重存放的位置 test_images 测试用的图…

Tomcat命令行窗口、IDEA中Tomcat控制台 中文乱码问题解决方案

Tomcat出现中文乱码问题 打开Tomcat文件夹下的conf/logging.properties文件&#xff0c;将下图位置中的编码由UTF-8全部替换成GBK 然后重启Tomcat服务器&#xff0c;问题解决 Intellij IDEA启动Tomcat服务器控制台出现中文乱码 解决方案非常简单&#xff0c;按照下图设置控制…

【MySQL】表的增删改查

目录 前言&#xff1a; 新增&#xff08;Create&#xff09;&#xff1a; 查询&#xff08;Retrieve&#xff09;&#xff1a; 别名&#xff1a; 去重&#xff1a;DISTINCT 排序&#xff1a;ORDER BY &#xff1a; 条件查询&#xff1a;WHERE &#xff1a; 分页查询&am…

c++实数排序

例&#xff1a;数的三次方跟 描述&#xff1a;给定一个浮点数n&#xff0c;求它的三次方根。 输入描述&#xff1a;一个浮点数 输出描述&#xff1a;问题的解 保留6位小数 #include<bits/stdc.h> using namespace std; double n,eps1e-8; bool check (double x){retu…

【新手入门必看】从零开始学指针

我使用VS CODEMSYS2的编译环境进行学习&#xff0c;想使用VS CODE进行C/C代码编写的小伙伴参考这篇文章进行环境配置VS Code 配置 C/C 编程运行环境&#xff08;保姆级教程&#xff09; 一、指针的引入 指针地址 #include <stdio.h>int main() {int a 10;printf(&quo…

Git的操作和使用

一、基本操作 1、创建git本地仓库 &#xff08;1&#xff09;创建目录&#xff1a;mkdir gitcode &#xff08;2&#xff09;进入目录&#xff1a;cd gitcode/ &#xff08;3&#xff09;查询目录内容&#xff1a;ls &#xff08;4&#xff09;在当前目录下创建git本地仓库…

java算法day3

移除链表元素设计链表翻转链表两两交换链表中的结点 移除链表元素 ps&#xff1a;有时候感觉到底要不要写特判&#xff0c;你想到了就写&#xff01;因为一般特判有一劳永逸的作用。 解法有两种&#xff0c;一种是不用虚拟头结点&#xff0c;另一种就是用虚拟头结点。 这里我…

QT中表格控件使用

一、QTableView表头设置样式 //控件样式 QString setcolor"QHeaderView{""border:0px solid #ffffff;""outline:0px;""background:#000000;""}""QHeaderView::section:horizontal:first{""border:1px solid…

React-基础语法学习

1、教程&#xff1a;井字棋游戏 本教程将引导你逐步实现一个简单的井字棋游戏&#xff0c;并且不需要你对 React 有任何了解。在此过程中你会学习到一些编写 React 程序的基本知识&#xff0c;完全理解它们可以让你对 React 有比较深入的理解。 1.1、教程分成以下几个部分&am…

3D感知生成对抗网络的高斯溅射解码器

Gaussian Splatting Decoder for 3D-aware Generative Adversarial Networks 3D感知生成对抗网络的高斯溅射解码器 Florian Barthel1, 2  Arian Beckmann1  Wieland Morgenstern1  Anna Hilsmann1  Peter Eisert1,2 Florian Barthel 1, 2 阿里安贝克曼Wieland晨星Anna Hils…

关于动画这一篇就够了

Android动画框架是一个强大的工具集合&#xff0c;用于创建和管理各种动画效果。它提供了一系列的类和接口&#xff0c;使得开发者能够轻松地定义和控制动画的行为&#xff0c;包括动画的持续时间、插值器、动画类型等。在Android中&#xff0c;动画主要分为三类&#xff1a;补…

【Godot4自学手册】第三十九节利用shader(着色器)给游戏添加一层雾气效果

今天&#xff0c;主要是利用shader给游戏给地宫场景添加一层雾气效果&#xff0c;增加一下气氛&#xff0c;先看一下效果&#xff1a; 一、新建ParallaxBackground根节点 新建场景&#xff0c;根节点选择ParallaxBackground&#xff0c;命名为Fog&#xff0c;然后将该场景保…

不要小看在线文档编辑工具,它才是提高工作效率的法宝

在数字化的今天&#xff0c;工作方式正变得越来越灵活&#xff0c;远程办公和团队协作已成日常。这个时候&#xff0c;传统的文档处理方式已经无法满足快速发展的业务需求。在线文档编辑工具&#xff0c;正逐渐成为提高团队工作效率的秘密武器。它能够让团队成员无论身处何地&a…

从预训练损失的角度,理解语言模型的涌现能力

原文&#xff1a;Understanding Emergent Abilities of Language Models from the Loss Perspective 摘要 本文从预训练损失的角度重新审视语言模型的涌现能力&#xff0c;挑战了以往以模型大小或训练计算量为标准的观念。通过实验&#xff0c;作者发现预训练损失是预测下游任…

【剪映专业版】15绿幕抠图:应用技巧、注意事项

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 1.绿幕抠图 背景为绿色的素材&#xff08;其他颜色也可以扣取&#xff0c;只是绿色背景更普遍、抠图效果更好&#xff09; 选择色度抠图&#xff0c;通过取色器选取背景颜色&#xff0c;调整强度实现抠图 剪映的色度抠…

使用Python Tkinter创建文件生成工具

我们将使用Python的Tkinter模块创建一个简单的文件生成工具。这个工具可以用来创建Excel、文本、Python脚本和Word文档等不同类型的文件。 1、准备工作 首先&#xff0c;确保你已经安装了Python和所需的第三方库&#xff1a;Tkinter、openpyxl和python-docx。你可以使用pip来…

python项目练习——30.俄罗斯方块

游戏初始化: 设置游戏窗口的大小和标题。创建游戏区域和方块的初始状态。初始化游戏得分和级别。游戏主循环: 不断监听用户的输入,控制方块的移动、旋转和下落。在游戏区域中逐帧显示方块的位置和状态。检测方块是否触底或与其他方块重叠,如果是,则生成新的方块。方块的移…

【软件测试】通过决策表例题学会使用决策表

【软件测试】通过决策表例题学会使用决策表 例题1答案 例题2答案 例题1 有一个程序可以计算某年某月有多少天&#xff0c;请依照决策表测试技术产生测试用例。 要求&#xff1a; 1.每个条件的取值有多种选择&#xff0c;而不再是简单的Yes/No。 2. 需要写出合并后的决策表 3.…