Java-JDBC(重要)--待更新

1、第一个JDBC程序

步骤总结:

  1. 创建测试数据库
  2. 加载驱动,固定写法
  3. 连接数据库
  4. 获得执行SQL的对象statement
  5. 执行SQL对象去执行SQL
  6. resultset获得返回结果集
  7. 释放连接
import java.sql.*;public class Jdbc {public static void main(String args[]) throws ClassNotFoundException, SQLException {//1、加载数据库驱动,固定写法Class.forName("com.mysql.jdbc.Driver");//2、用户信息和url,连接数据库使用//注意:mysql8.0或以上必须在url加上serverTimezone=UTC,否则会出现时区异常,因为8.0加了新特性,安全性也增加了/*useUnicode=true characterEncoding=utf8serverTimezone=UTCuseSSL=true*/String url="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&&useSSL=true";String username="root";String password="123456";//3、连接数据库,数据库对象connection代表数据库Connection connection= DriverManager.getConnection(url,username,password);//4、执行SQL对象 StatementStatement statement=connection.createStatement();System.out.println("数据库连接成功");//5、执行SQL对象去执行SQL,可能存在结果,查看返回值String sql="SELECT * FROM student";ResultSet resultSet=statement.executeQuery(sql);//ResultSet是一个结果集,通常是一个列表while (resultSet.next()){System.out.println("id:"+resultSet.getObject("id"));System.out.println("name:"+resultSet.getObject("name"));System.out.println("age:"+resultSet.getObject("age"));System.out.println("===============");}//6、释放连接资源connection.close();statement.close();resultSet.close();}
}

2、JDBC对象详解

DriverManager

  //DriverManager.registerDriver(new com.mysql.jdbc.Driver());//1、加载数据库驱动,固定写法Class.forName("com.mysql.jdbc.Driver");
//connection 代表数据库
//数据库设置自动提交
//事务提交
//事务回滚
connection.rollback();
connection.commit();
connection.setAutoCommit();

URL

String url="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&&useSSL=true";
//mysql-3306
//协议:主机地址端口号/数据库名?参数1&参数2&参数3 
//oracle--1521
//jdbc:oracle:thin:@localhost:1521:sid

Statement执行SQL对象

String sql="SELECT * FROM student";String findSql="";String insertSql="";String updateSql="";String delSql="";ResultSet resultSet=statement.executeQuery(sql);statement.executeQuery(findSql);//执行查询statement.executeUpdate(insertSql);//更新、插入、删除都是用这个statement.execute(delSql);//执行任何SQL//ResultSet是一个结果集,通常是一个列表

ResultSet查询的结果集:封装了我们的所有查询 结果
获得指定的数据类型

	   resultSet.getObject();//不知道列类型的情况下使用//如果知道列的类型就使用指定的类型resultSet.getString();resultSet.getInt();resultSet.getFloat();resultSet.getDate();resultSet.getObject();

遍历,指针

resultSet.beforeFirst();//移动到最前面resultSet.afterLast();//移动到最后面resultSet.next();//移动到下一个数据resultSet.previous();//移动到前一行resultSet.absolute(row);//移动到指定行

释放资源

//6、释放连接资源connection.close();statement.close();resultSet.close();

3、statement对象

jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象想数据库发送增删改查语句即可。

Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)

Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结构的ResultSet对象

  • 工具类
package com.test.util;import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JdbcUtils {private static String driver=null;private static String url=null;private static String username=null;private static String password=null;static {try {//获取到配置文件流InputStream inputStream=JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");//用关键字new创建properties对象Properties properties= new Properties();//load方法将流加载进properties对象properties.load(inputStream);//调用方法获取相关属性driver=properties.getProperty("driver");url=properties.getProperty("url");username=properties.getProperty("username");password=properties.getProperty("password");Class.forName(driver);} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url,username,password);}public static void release(Connection connection, Statement statement, ResultSet resultSet){if (resultSet!=null){try {resultSet.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (statement!=null){try {statement.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (connection!=null){try {connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}}
}
  • CRUD操作-insert
package com.test.util;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import static com.test.util.JdbcUtils.*;public class JdbcInsert {public void insert() {Connection connection=null;Statement statement=null;ResultSet resultSet=null;try {//1、获取连接connection = JdbcUtils.getConnection();} catch (SQLException e) {throw new RuntimeException(e);}//2、获得执行SQL对象try {statement = connection.createStatement();String sqlInsert="INSERT INTO student(id,name,age) VALUES (6,'李白',99)";int i=statement.executeUpdate(sqlInsert);if (i>0){System.out.println("插入成功");}} catch (SQLException e) {throw new RuntimeException(e);}//3、关闭资源release(connection,statement,resultSet);}}
  • CRUD操作-update
package com.test.util;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import static com.test.util.JdbcUtils.release;
public class JdbcUpdate {public void update() {Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {connection = JdbcUtils.getConnection();} catch (SQLException e) {throw new RuntimeException(e);}try {statement=connection.createStatement();String sqlUpdate="UPDATE student SET name='杜甫' WHERE id=1";int i=statement.executeUpdate(sqlUpdate);if (i>0){System.out.println("更新成功");}} catch (SQLException e) {throw new RuntimeException(e);}release(connection,statement,resultSet);}}

CRUD操作-delete

package com.test.util;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import static com.test.util.JdbcUtils.release;public class JdbcDel {public void del(){Connection connection=null;Statement statement=null;ResultSet resultSet=null;//1、调用工具类的方法获取连接try {connection=JdbcUtils.getConnection();} catch (SQLException e) {throw new RuntimeException(e);}try {statement=connection.createStatement();String sqlDel="DELETE FROM student WHERE id=3";int i=statement.executeUpdate(sqlDel);if (i>0){System.out.println("删除成功");}} catch (SQLException e) {throw new RuntimeException(e);}release(connection,statement,resultSet);}}
  • CRUD操作-selecet
package com.test.util;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class JdbcSelect {public void select(){Connection connection=null;Statement statement=null;ResultSet resultSet=null;try {connection=JdbcUtils.getConnection();} catch (SQLException e) {throw new RuntimeException(e);}try {statement=connection.createStatement();} catch (SQLException e) {throw new RuntimeException(e);}String  sqlSelect="SELECT * FROM student";try {resultSet=statement.executeQuery(sqlSelect);while (resultSet.next()){System.out.println("id:"+resultSet.getObject("id")+'\t');System.out.println("name:"+resultSet.getObject("name")+'\t');System.out.println("age:"+resultSet.getObject("age")+'\t');System.out.println();}} catch (SQLException e) {throw new RuntimeException(e);}}
}

4、SQL注入问题

sql存在漏洞,会被攻击冬至数据泄露,SQL会被拼接 or

5、PreparedStatement对象

PreparedStatement可以防止SQL注入,效率更高。

package com.test.util;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import static com.test.util.JdbcUtils.release;
public class JdbcPsDel {public void psDel() {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet=null;try {connection=JdbcUtils.getConnection();//获得连接String sqlDel="DELETE FROM student WHERE id=?";//定义预编译SQL,参数用?代替preparedStatement=connection.prepareStatement(sqlDel);//预编译preparedStatement.setInt(1,3);//手动给参数值int i= preparedStatement.executeUpdate();//执行if (i>0){System.out.println("删除成功");}} catch (SQLException e) {throw new RuntimeException(e);}release(connection,preparedStatement,resultSet);//释放资源}}

6、JDBC操作事务

要么成功,要么失败

  • ACID原则
    原子性:要么全部完成,要么都不完成
    一致性:总数不变
    隔离性:多个进程互不干扰
    持久性:一旦提交不可逆,持久化到数据库

隔离性问题:
脏读:一个事务读取了另一个没有提交的事务
不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变
虚读(幻读):在一个事务内,读取到了别人插入的数据,导致前后读出来结果不一致

7、数据库连接池

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

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

相关文章

线程(四)

线程(一) ~ 线程(四)章节导图 导图https://naotu.baidu.com/file/07f437ff6bc3fa7939e171b00f133e17 线程安全 什么是线程安全? 业务中多线程同时访问一个对象或方法时我们不需要做额外的处理(像单线程编程一样)程序可以正常运行并能获取…

11_12-Golang中的运算符

**Golang **中的运算符 主讲教师:(大地) 合作网站:www.itying.com** **(IT 营) 我的专栏:https://www.itying.com/category-79-b0.html 1、Golang 内置的运算符 算术运算符关系运算符逻辑运…

JS模块化规范之ES6及UMD

JS模块化规范之ES6及总结 前言ES6模块化概念基本使用ES6实现 UMD(Universal Module Definition)总结 前言 ESM在模块之间的依赖关系是高度确定的,与运行状态无关,编译工具只需要对ESM模块做静态分析,就可以从代码字面中推断出哪些模块值未曾被…

RocketMQ系统性学习-RocketMQ原理分析之Broker接收消息的处理流程

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…

Leetcode 53 最大子数组和

题意理解: 给定一个数列,求连续的子序列的和最大可以是多少? 子数组 是数组中的一个连续部分。 比如: nums [-2,1,-3,4,-1,2,1,-5,4] 最大子序列的和:6(4-121) 解题思路: 使用贪心的…

回溯法之计算操作符

问题: 设计一个算法在 1,2,……9(顺序不变)数值之间插入或者-或者什么都不插入, 使得计算结果总是 100 的程序。 //例如 1 2 34 - 5 67 - 8 9 100。 思路: 创建一个长度为9的数组arr,其中存放数字1到9。创建一个长度为9的字…

【git学习笔记 01】打标签

文章目录 一、声明二、对标签的基本认知什么是标签?为什么要打标签?如何生成类似github中readme的图标 三、标签相关命令四、示例操作 一、声明 本帖持续更新中如有纰漏,望批评指正!参考视频链接,非常感谢原作者&…

HTMLCSS旋转的圣诞树源码附注释

css代码附注释 *{/* 初始化 */margin: 0;padding: 0; } body{align-content: center;align-items: center;background-color: #9f0000;

5 分钟内搭建一个免费问答机器人:Milvus + LangChain

搭建一个好用、便宜又准确的问答机器人需要多长时间? 答案是 5 分钟。只需借助开源的 RAG 技术栈、LangChain 以及好用的向量数据库 Milvus。必须要强调的是,该问答机器人的成本很低,因为我们在召回、评估和开发迭代的过程中不需要调用大语言…

ARFoundation系列讲解 - 93 绘制圆

案例中使用的软件版本 Unity2023.1.20.f1c1ARFoundtaion 5.1.0Apple ARKit XR Plugin 5.1.0 Google ARCore XR Plugin 5.1.0技术分析 我们可以实时检测用户手指触摸的屏幕位置,从触摸位置投射一条射线(Raycast),再射线命中的目标位置创建一个点,放置一个圆,手指拖动来设置…

Backtrader 文档学习-Data Feeds(下)

Backtrader 文档学习-Data Feeds(下) 1. Data Resampling 当数据仅在单个时间范围内可用,需要在不同的时间范围内进行分析时,就需要进行一些重采样。 “重采样”实际上应该称为“上采样”,因为它是从一个源时间区间到…

C++的泛型编程—模板

目录 一.什么是泛型编程? ​编辑 ​编辑 二.函数模板 函数模板的实例化 当不同类型形参传参时的处理 使用多个模板参数 三.模板参数的匹配原则 四.类模板 1.定义对象时要显式实例化 2.类模板不支持声明与定义分离 3.非类型模板参数 4.模板的特化 函数模板…

MySQL的安装及如何连接到Navicat和IntelliJ IDEA

MySQL的安装及如何连接到Navicat和IntelliJ IDEA 文章目录 MySQL的安装及如何连接到Navicat和IntelliJ IDEA1 MySQL安装1.1 下载1.2 安装(解压)1.3 配置1.3.1 添加环境变量1.3.2 新建配置文件1.3.3 初始化MySQL1.3.4 注册MySQL服务1.3.5 启动MySQL服务1.3.6 修改默认账户密码 1…

Windows中安装nvm进行Node版本控制

1.nvm介绍 nvm英文全程也叫node.js version management,是一个node.js的版本管理工具。nvm和npm都是node.js版本管理工具,但是为了解决node各种不同之间版本存在不兼容的问题,因此可以通过nvm安装和切换不同版本的node。 2.nvm下载 可在点…

6个免费设计资源站,设计师们赶紧收藏!

本期给大家分享5个免费的设计资源站,设计师必备的设计设计神奇,绝对能帮助你在工作中事半功倍,赶紧收藏吧~ 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站,主要是站内素材多,像…

PHPStorm一站式配置

phpstorm安装好之后,先别急着编码。工欲善其事,必先利其器,配置好下面这些之后让编码事半功倍。 主题 Appearance & Behavior -> Appearance -> Theme 选中 [Light with Light Header] 亮色较为护眼 关闭更新 Appearance & …

C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 方法

C# 入门基础知识 - 方法 第8节 方法8.1 C# 函数/方法简介8.2 方法的声明及调用8.2.1 参数列表方法的声明及调用8.2.2 参数数组方法的声明及调用8.2.3、引用参数与值参数 8.3 静态方法和实例方法8.3.1 静态、实例方法的区别8.2.3 静态、实例方法的声明及其调用 8.4 虚方法8.4.1 …

Linux学习(3)——基本命令-文件

1、cat:查看文件内容--上下合并文件 注意:cat只能查看普通的文本文件 如果文件内容过多会显示不全 选项效果-n显示行号包括空行-b跳过空白行编号;注意,在一行打了空格不算空白行,enter键直接跳过这一行才算-s将所有连续…

【JAVA】CyclicBarrier源码解析以及示例

文章目录 前言CyclicBarrier源码解析以及示例主要成员变量核心方法 应用场景任务分解与合并应用示例 并行计算应用示例 游戏开发应用示例输出结果 数据加载应用示例 并发工具的协同应用示例 CyclicBarrier和CountDownLatch的区别循环性:计数器的变化:用途…

[c]用指针进行四个数排序

#include<stdio.h> void swap(int*p1,int*p2)//定义函数&#xff0c;实现两个数值交换 {int temp;temp*p1;*p1*p2;*p2temp; } void psort( int *pa, int *pb,int *pc,int *pd) {int i1;for(i1;i<3;i)//对四个数排序&#xff0c;至少3次循环&#xff0c;交换过后是升序…