jdbc连接回顾

不使用任何工具类手动连接

package com.oracle.jdbc;import java.sql.*;/***jdbc查询 jdbc数据库下,user表中所有数据并打印在控制台* jdbc操作数据库步骤*  1注册驱动*  2创建数据库连接对象*  3获取传输器对象*  4执行sql*  5处理结果集*  6释放资源*/public class JDBCDemo1 {public static void main(String[] args) throws ClassNotFoundException, SQLException {Class.forName("com.mysql.cj.jdbc.Driver");String root = "root";String password = "root";// String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";String url = "jdbc:mysql://localhost:3306/jdbc";Connection connection = DriverManager.getConnection(url, root, password);System.out.println(connection);Statement statement = connection.createStatement();String sql = "select * from user";ResultSet resultSet = statement.executeQuery(sql);while(resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");String gender = resultSet.getString("gender");int age = resultSet.getInt("age");String address = resultSet.getString("address");System.out.println(id +"," +name +","+gender+","+age+","+address );}resultSet.close();statement.close();connection.close();}
}

初步封装一下,变成工具类

package com.march.mysql0314;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DBUtil {private static final String URL = "jdbc:mysql://localhost:3306/empdb?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai";private static final String U = "com.mysql.cj.jdbc.Driver";private static final String USERNAME = "root";private static final String PASSWORLD = "root";private static Connection connection = null;private DBUtil(){};public static Connection getConnection() throws SQLException, ClassNotFoundException {if (connection == null || connection.isClosed()){Class.forName(U);connection = DriverManager.getConnection(URL, USERNAME, PASSWORLD);}return connection;}public static void closeConnection(){try {if (!connection.isClosed()&&connection == null){connection.close();}} catch (SQLException e) {e.printStackTrace();}}}

使用属性集文件连接,方便改写用户登录的数据

package com.march.mysql0314;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;public class DBUtilPro {private static Connection connection = null;private DBUtilPro(){};private static Properties properties = new Properties();static{try(InputStream inputStream = DBUtilPro.class.getResourceAsStream("/mysql.properties");){properties.load(inputStream);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static Connection getConnection() throws SQLException, ClassNotFoundException {if (connection == null || connection.isClosed()){Class.forName(properties.getProperty("Driver"));connection = DriverManager.getConnection(properties.getProperty("URL"),properties.getProperty("USERNAME"),properties.getProperty("PASSWORLD"));}return connection;}public static void closeConnection(){try {if (!connection.isClosed()&&connection == null){connection.close();}} catch (SQLException e) {e.printStackTrace();}}
}

使用线程集合ThreadLocal实现同一事务的同一连接

package com.march.mysql0314;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;public class DBUtilProMax {private DBUtilProMax(){};private static Properties properties = new Properties();private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();static{try(InputStream inputStream = DBUtil.class.getResourceAsStream("/mysql.properties");){properties.load(inputStream);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static Connection getConnection() throws SQLException, ClassNotFoundException {Connection connection = threadLocal.get();if (connection == null || connection.isClosed()){Class.forName(properties.getProperty("Driver"));connection = DriverManager.getConnection(properties.getProperty("URL"),properties.getProperty("USERNAME"),properties.getProperty("PASSWORLD"));threadLocal.set(connection);}return connection;}public static void closeConnection(){Connection connection = threadLocal.get();try {if (!connection.isClosed()&&connection == null){connection.close();}} catch (SQLException e) {e.printStackTrace();}}
}

使用德鲁伊连接池

package com.march.mysql0314;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;public class DButilFinally {// 私有的构造方法private DButilFinally(){}//---1定义静态变量 : Propertiesprivate  static Properties pro =new Properties();//========================> 1 创建DataSource对象private  static DataSource ds = null;//---2使用静态代码块,读取配置文件static{try(//==>2 获取流, 文件存储在src目录下InputStream in = DBUtil.class.getResourceAsStream("/druid.properties");){//把IO中的属性集加载到properties对象中pro.load(in);//==================>获取数据源对象ds = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}// ---- 使用ThreadLocal存储连接对象//1 定义ThreadLocalprivate  static ThreadLocal<Connection> local = new ThreadLocal<>();/*** 获取连接的方法* @return* @throws SQLException* @throws ClassNotFoundException*/public  static Connection getConn() throws SQLException, ClassNotFoundException {// --2 从ThreadLocal中获取连接对象Connection conn = local.get();if(conn ==null  || conn.isClosed()){//=============================>通过DataSource获取连接对象conn = ds.getConnection();// ---3 向ThreadLocal中存储连接对象local.set(conn);;}return  conn;}/*** 关闭连接的方法*/public static   void closeConn(){//  // --2 从ThreadLocal中获取连接对象Connection conn = local.get();try {if(conn!=null  && !conn.isClosed()){  //conn不是null ,同时也没有关闭conn.close();}} catch (SQLException e) {e.printStackTrace();}finally {// -- 删除ThreadLocal中存储的数据local.remove();}}}

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

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

相关文章

OSCP靶场--Crane

OSCP靶场–Crane 考点(CVE-2022-23940sudo service提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.229.146 -sC -sV --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-25 08:07 EDT Nmap scan report for 192.16…

python环境移植(本机windows到离线windows环境)

Python环境整体迁移(包括无网络情况)_python 迁移 新老无法联网-CSDN博客

Java 算法和数据结构 答案整理,最新面试题

Java中如何使用动态规划求解背包问题&#xff1f; 1、定义子问题&#xff1a; 首先确定动态规划状态&#xff0c;通常以物品数量和背包容量为变量定义子问题&#xff0c;例如dp[i][j]表示前i件物品放入容量为j的背包所能获得的最大价值。 2、确定状态转移方程&#xff1a; 基…

vue 重新渲染dom

当我们用 v-if"pane_persuser" 之类的属性值&#xff08;true和false&#xff09;在父页面来控制子页面弹窗打开关闭时&#xff0c;在第二次打开子页面时&#xff0c;子页面并不会重新执行mounted&#xff0c;也就不会重新执行我们写的某些函数来加载界面的值&#x…

数字和

输入一个整数 n,求各个位上的数字和,最长 200 位 输入 123456789987654321123456789987654321 输出 180 样例输入 45676475645643535479097091092198721753297409443093983432 样例输出 268 代码 #include<bits/stdc.h> using namespace std; int main(){ …

手撕算法-盛最多水的容器

描述 分析 两个板之间能盛下的水的量&#xff0c;取决于短板。想让两个板之间能盛下更多的水&#xff0c;需要改变短板的长度。就像水桶效应&#xff1a;那么用两个指针指向容器的两个板&#xff0c;然后每次移动较短的板即可。移动较短的板&#xff0c;可能会增大容积&#x…

计算机网络常见题(持续更新中~)

1 描述一下HTTP和HTTPS的区别 2 Cookie和Session有什么区别 3 如果没有Cookie,Session还能进行身份验证吗&#xff1f; 4 BOI,NIO,AIO分别是什么 5 Netty的线程模型是怎么样的 6 Netty是什么&#xff1f;和Tomcat有什么区别&#xff0c;特点是什么&#xff1f; 7 TCP的三次…

解决 cv2.imread读取带中文路径图片问题

http://t.csdnimg.cn/i8CXn 1.问题&#xff1a; # 中草药数据集样本可视化展示 import cv2 import matplotlib.pyplot as plt %matplotlib inline plt.title("heshouwu") plt.imshow(cv2.imread(r"D:\home\aistudio\data1\archive\train\何首乌\heshouwu_0001.…

[C语言]结构体、位段、枚举常量、联合体

目录 结构体 结构体的使用方法 结构体所占用的大小 位段 位段的使用方法 位段所占用的大小 枚举常量 枚举常量的使用方法 枚举常量的优势 联合体 联合体的使用方法 结构体 结构体的使用方法 结构体是一些值的集合&#xff0c;我们可以定义一个结构体&#xff0c;里…

ARMday5

风扇蜂鸣器 1.main.c #include"led.h" //封装延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}} } int main() {//外设初始化all_pplout_init();while(1){BUZZER_ON();delay(2000);BUZZER_OFF();delay(2000);MOTOR_ON();delay(2000)…

突破编程_C++_C++11新特性(多线程编程的互斥锁 mutex )

1 std::mutex 的基础概念 1.1 std::mutex 的定义与声明 std::mutex 是 C11 标准库中的一个互斥量&#xff08;mutex&#xff09;类&#xff0c;用于保护共享资源的并发访问。在多线程环境中&#xff0c;当多个线程试图同时访问和修改同一资源时&#xff0c;可能会发生数据竞争…

MySQL存储引擎的区别与选择

MySQL存储引擎是数据库用来处理不同表类型的内核组件&#xff0c;每个引擎都有独特的特性和适用场景。以下是MySQL中几种常见存储引擎的主要区别与选择建议&#xff1a; ### 1. InnoDB - 特性 - 支持事务处理&#xff08;ACID属性&#xff09;&#xff0c;适合对数据完整性…

数据结构入门框架

博主b站入口&#xff1a;Uncertanity的个人空间 参考资料&#xff1a; 《大话数据结构》程杰 《数据结构C语言(第二版)》严蔚敏

为什么静态成员函数不能是虚函数

在面向对象编程中&#xff0c;静态成员函数和虚函数都是常见的概念&#xff0c;但它们之间存在着本质上的差异。由于其特性上的差异&#xff0c;静态成员函数不能声明为虚函数。下面我们来探讨一下为什么静态成员函数不能是虚函数。 我在网上查到最多的说法是静态函数没有this指…

【OpenModelica】1 OpenModelica项目架构

1 OpenModelica项目架构 文章目录 1 OpenModelica项目架构一、 架构总览图二、OpenModelica各部分作用 一、 架构总览图 OpenModelica 环境由几个相互连接的子系统组成&#xff0c;如图 1.1 所示。 其中包括&#xff1a; MDT Eclipse 插件图形模型编辑器/浏览器文本模型编辑器…

Vue reactive函数的使用

reactive函数可以定义一个响应式对象。 在div中引用对象里的数据就可以 <template><div class"ttt"><li v-for"data in reactive2" :key"data.name">{{data.name}}</li><h2>{{reactive3.name}}</h2><h2…

开始喜欢上了runnergo,JMeter out了?

RunnerGo是一款基于Go语言、国产自研的测试平台。它支持高并发、分布式性能测试。和JMeter不一样的是&#xff0c;它采用了B/S架构&#xff0c;更灵活、更方便。而且&#xff0c;除了API测试和性能测试&#xff0c;RunnerGo还加上了UI测试和项目管理等实用功能&#xff0c;让测…

代码随想录day30(2)回溯:组合(leetcode77)

题目要求&#xff1a;给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 思路&#xff1a;首先定义两个变量&#xff0c;一个存放符合条件的单一结果&#xff0c;另一个存放符合条件结果的集合&#xff0c;for循环用来横向遍历&#xff0c;递归用来纵…

C语言例4-6:格式字符d的使用例子

代码如下&#xff1a; //格式字符d的使用例子 #include<stdio.h> int main(void) {int num1123;long num2123456;printf("num1%d,num1%5d,num1%-5d,num1%2d\n",num1,num1,num1,num1);//以四种不同格式&#xff0c;输出int型数据num1的值printf("num2%ld,…

基于Spring Boot网络相册设计与实现

摘 要 网络相册设计与实现的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&am…