JDBC 核心 API

引入 mysql-jdbc 驱动

  1. 驱动 jar 版本的选择:推荐使用 8.0.25+,省略时区设置
  2. java 工程导入依赖
    1. 项目创建 lib 文件夹
    2. 导入驱动依赖 jar 包
    3. jar 包右键 - 添加为库

JDBC 基本使用步骤

  1. 注册驱动
  2. 获取连接
  3. 创建发送 sql 语句对象
  4. 发送 sql 语句,并获取返回结果
  5. 结果集解析
  6. 资源关闭

基于 statement 演示查询

  1. 准备数据库数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    create database study;use study;create table t_user(id int primary key auto_increment comment '用户主键',account varchar(20) not null unique comment '账号',PASSWORD varchar(64) not null comment '密码',nickname varchar(20) not null comment '昵称');insert into t_user(account,PASSWORD,nickname) values
    ('root','123456','经理'),('admin','666666','管理员');
    
  2. 查询目标

    1. 查询全部用户信息,进行控制台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.binxin.api.statement;import com.mysql.cj.jdbc.Driver;import java.sql.*;/** 使用statement查询t_user表下全部数据* */
public class StatementQueryPart {public static void main(String[] args) throws SQLException {//1. 注册驱动/** 驱动版本:8+ com.mysql.cj.jdbc.Driver* */DriverManager.registerDriver(new Driver());//2. 获取连接/** url: jdbc:数据库厂商名://ip地址:port/数据库* */// 接口=实习类Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/study", "root", "123456");//3. 创建statementStatement statement = connection.createStatement();//4. 发送 sql 语句,并获取返回结果String sql = "select * from t_user;";ResultSet resultSet = statement.executeQuery(sql);//5. 结果集解析// 看看有没有下一行数据,有就可以获取while (resultSet.next()) {int id = resultSet.getInt("id");String account = resultSet.getString("account");String password = resultSet.getString("PASSWORD");String nickname = resultSet.getString("nickname");System.out.println(id + "--" + account + "--" + password + "--" + nickname);}//6. 资源关闭resultSet.close();statement.close();connection.close();}
}
  1. 模拟登录:控制台输入账号密码,判断是否登录成功

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    
    package com.binxin.api.statement;import com.mysql.cj.jdbc.Driver;import java.sql.*;
    import java.util.Properties;
    import java.util.Scanner;/** 控制台输入账号密码,判断是否登录成功* */
    public class StatementUserLoginPart {public static void main(String[] args) throws SQLException, ClassNotFoundException {//1. 从键盘获取输入Scanner scanner = new Scanner(System.in);System.out.print("请输入账号:");String account = scanner.nextLine();System.out.print("请输入密码:");String password = scanner.nextLine();//2. 注册驱动//方案1DriverManager.registerDriver(new Driver());//方案2//new Driver();//方案3 字符串->提取到外部配置文件Class.forName("com.mysql.cj.jdbc.Driver");  //触发类加载//3. 获取连接/** getConnection(1,2,3)方法是一个重载方法* 允许以不同形式传入参数** 核心属性*   1. 数据库软件所在的ip地址 localhost | 127.0.0.1*   2. 端口号 3306*   3. 数据库名称 study*   4. 账号 root*   5. 密码 123456*   6. 其他可选信息** 三个参数*   String url          数据库软件所在的ip地址、端口号、数据库名称、其他可选信息*                       语法:jdbc:数据库厂商名[mysql,oracle]://ip地址|主机名:port端口号/数据库?key=value*                            &key=value 可选信息*                       具体:jdbc:mysql://127.0.0.1:3306/study*                            jdbc:mysql://localhost:3306/study*                       本机的省略写法:省略本机地址和3306端口号*                            jdbc:mysql:///study*   String user         账号 root*   String password     密码 123456** 两个参数*   String url          数据库软件所在的ip地址、端口号、数据库名称、其他可选信息*   Properties info     存储账号和密码*                       Properties类似于Map,只不过key和value都是字符串形式** 一个参数*  String url          jdbc:数据库厂商名[mysql,oracle]://ip地址|主机名:port端口号/数据库?user=root&password=123456** url的可选信息*  url?user=账号&password=密码**  severTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true* */Connection connection = DriverManager.getConnection("jdbc:mysql:///study", "root", "123456");Properties info = new Properties();info.put("user", "root");info.put("password", "123456");Connection connection1 = DriverManager.getConnection("jdbc:mysql:///study", info);Connection connection2 = DriverManager.getConnection("jdbc:mysql:///study?user=root&password=123456");//4. 创建发送 sql 语句对象//statement可以发送SQL语句到数据库,并且获取返回结果Statement statement = connection.createStatement();//5. 发送 sql 语句,并获取返回结果String sql = "select * from t_user where account='"+account+"' and password='"+password+"';";ResultSet resultSet = statement.executeQuery(sql);//6. 结果集解析//while (resultSet.next()){//    int id = resultSet.getInt("id");//    String account1 = resultSet.getString("account");//    String password1 = resultSet.getString("PASSWORD");//    String nickname = resultSet.getString("nickname");//    System.out.println(id + "--" + account1 + "--" + password1 + "--" + nickname);//}if (resultSet.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}//7. 资源关闭resultSet.close();statement.close();connection.close();}}
    
  2. 存在的问题

    1. SQL 语句需要字符串拼接,比较麻烦
    2. 只能拼接字符串类型,其他的数据库类型无法处理
    3. 可能发生注入攻击

基于 prepareStatement 方式优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.binxin.api.preparedstatement;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;/** 使用预编译的statement完成用户登录* */
public class PSUserLoginPart {public static void main(String[] args) throws Exception {//1. 从键盘获取输入Scanner scanner = new Scanner(System.in);System.out.print("请输入账号:");String account = scanner.nextLine();System.out.print("请输入密码:");String password = scanner.nextLine();//2. ps的数据库流程//a. 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//b. 获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///study", "root", "123456");//c. 编写sql语句String sql = "select * from t_user where account = ? and password = ?;";//d. 创建预编译的statement并设置sql语句结果PreparedStatement prepareStatement = connection.prepareStatement(sql);//e. 设置sql语句参数prepareStatement.setString(1, account);prepareStatement.setString(2, password);//f. 执行sql语句,并返回结果ResultSet resultSet = prepareStatement.executeQuery();//g. 结果集解析if (resultSet.next()) {System.out.println("登录成功");} else {System.out.println("登录失败");}//h. 资源关闭resultSet.close();prepareStatement.close();connection.close();}
}

基于 prepareStatement 演示 curd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package com.binxin.api.preparedstatement;import org.junit.Test;import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/** 使用preparedstatement进行t_user表的curd动作* */
public class PSCURDPart {// 测试方法需要导入junit的测试包@Testpublic void testInsert() throws Exception {/** t_user表插入一条数据*  account test*  password test*  nickname 二狗子**/// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/study", "root", "123456");// 3.编写SQL语句结果,动态值的部分使用?代替String sql = "insert into t_user(account,password,nickname) values(?,?,?)";// 4.创建preparedStatement.并且传入sql语句结果PreparedStatement preparedStatement = connection.prepareStatement(sql);// 5.占位符赋值preparedStatement.setObject(1, "test");preparedStatement.setObject(2, "test");preparedStatement.setObject(3, "二狗子");// 6.发送SQL语句int rows = preparedStatement.executeUpdate();// 7.输出结果if (rows > 0) {System.out.println("插入成功");} else {System.out.println("插入失败");}// 8.关闭连接preparedStatement.close();connection.close();}@Testpublic void testUpdate() throws ClassNotFoundException, SQLException {/** 修改id=3的用户nickname="三狗子"* */// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/study", "root", "123456");// 3.编写SQL语句结果,动态值的部分使用?代替String sql = "update t_user set nickname=? where id=?";// 4.创建preparedStatement.并且传入sql语句结果PreparedStatement preparedStatement = connection.prepareStatement(sql);// 5.占位符赋值preparedStatement.setObject(1, "三狗子");preparedStatement.setObject(2, 3);// 6.发送SQL语句int rows = preparedStatement.executeUpdate();// 7.输出结果if (rows > 0) {System.out.println("修改成功");} else {System.out.println("修改失败");}// 8.关闭连接preparedStatement.close();connection.close();}@Testpublic void testDelete() throws ClassNotFoundException, SQLException {/** 删除id=3的用户数据* */// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/study", "root", "123456");// 3.编写SQL语句结果,动态值的部分使用?代替String sql = "delete from t_user where id=?";// 4.创建preparedStatement.并且传入sql语句结果PreparedStatement preparedStatement = connection.prepareStatement(sql);// 5.占位符赋值preparedStatement.setObject(1, 3);// 6.发送SQL语句int rows = preparedStatement.executeUpdate();// 7.输出结果if (rows > 0) {System.out.println("删除成功");} else {System.out.println("删除失败");}// 8.关闭连接preparedStatement.close();connection.close();}@Testpublic void testSelect() throws ClassNotFoundException, SQLException {/** 查询所有用户数据,并且封装到一个List<Map> list集合中* */// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/study", "root", "123456");// 3.编写SQL语句结果,动态值的部分使用?代替String sql = "select * from t_user;";// 4.创建preparedStatement.并且传入sql语句结果PreparedStatement preparedStatement = connection.prepareStatement(sql);// 5.占位符赋值// 6.发送SQL语句ResultSet resultSet = preparedStatement.executeQuery();// 7.结果集解析List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();//获取列的信息对象ResultSetMetaData metaData = resultSet.getMetaData();//获取列的个数int columnCount = metaData.getColumnCount();while (resultSet.next()) {Map<String, Object> map = new HashMap<>();//一行数据,对应一个map//手动取值//map.put("id",resultSet.getObject("id"));//map.put("account",resultSet.getObject("account"));//map.put("password",resultSet.getObject("password"));//map.put("nickname",resultSet.getObject("nickname"));//自动取值for (int i = 1; i <= columnCount; i++) {//获取指定下角标的值Object value = resultSet.getObject(i);//获取指定下角标的列名String columnLabel = metaData.getColumnLabel(i);map.put(columnLabel,value);}list.add(map);}System.out.println("list = " + list);// 8.关闭连接resultSet.close();preparedStatement.close();connection.close();}
}

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

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

相关文章

GPT SOVITS项目 一分钟克隆 (文字输出)

步骤流程&#xff1a;&#xff08;首先使用UVR 提取人声文件&#xff0c;然后按下面步骤进行&#xff09; 注意这里提交的音频是参考的音频

深度学习:Pytorch安装的torch与torchvision的cuda版本冲突问题与解决历程记录

今天不小心将conda环境中的一个pytorch环境中的torch包给搞混了&#xff0c;将其更新了一下&#xff0c;发生了一些问题&#xff1a; 当时运行了一下这个代码&#xff1a; pip install torchvision --upgrade 导致了环境中包的混乱&#xff1a; 只能说欲哭无泪&#xff0c;当…

C语言strstr函数

简介 strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是&#xff0c;则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串&#xff1b;否则&#xff0c;返回NULL。 实验 #include "stdio.h" #include "string.h"c…

相机图像质量研究(20)常见问题总结:CMOS期间对成像的影响--全局快门/卷帘快门

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【前端高频面试题--git篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 前端高频面试题--git篇 往期精彩内容常用命令git add 和 git stage 有什么区别怎么使用git连接…

代码随想录算法训练营DAY18 | 二叉树 (5)

一、LeetCode 513 找树左下角的值 题目链接&#xff1a;513.找树左下角的值https://leetcode.cn/problems/find-bottom-left-tree-value/ 思路一&#xff1a;递归回溯全局变量比深度。 class Solution {int Max_depth 0;int result 0;public int findBottomLeftValue(TreeNo…

“分布式透明化”在杭州银行核心系统上线之思考

导读 随着金融行业数字化转型的需求&#xff0c;银行核心系统的升级改造成为重要议题。杭州银行成功上线以 TiDB 为底层数据库的新一代核心业务系统&#xff0c;该实践采用应用与基础设施解耦、分布式透明化的设计开发理念&#xff0c;推动银行核心系统的整体升级。 本文聚焦…

2024 年 11 款最佳 iPhone 数据恢复软件和应用程序

数据丢失是任何人都无法承受的&#xff0c;因为它对每个人都至关重要。但导致数据丢失的原因有很多&#xff0c;一些常见的原因是意外删除数据、设备被盗、iOS 越狱、硬件损坏、病毒感染等。我们列出了 iOS 的顶级恢复工具&#xff0c;其中包括&#xff1a;将帮助您方便地恢复数…

【AIGC】Stable Diffusion的生成参数入门

Stable Diffusion 的生成参数是用来控制图像生成过程的重要设置&#xff0c;下面是一些常见的生成参数及其详解 1、采样器&#xff0c;关于采样器的选择参照作者的上一篇文章 2、采样步数&#xff08;Sampling Steps&#xff09;是指在生成图像时模型执行的总步数&#xff0c…

一、ActiveMQ介绍

ActiveMQ介绍 一、JMS1.jms介绍2.jms消息传递模式3.JMS编码总体架构 二、消息中间件三、ActiveMQ介绍1.引入的原因1.1 原因1.2 遇到的问题1.3 解决思路 2.定义3.特点3.1 异步处理3.2 应用系统之间解耦3.3 实际-整体架构 4.作用 一、JMS 1.jms介绍 jms是java消息服务接口规范&…

Apache POI | Java操作Excel文件

目录 1、介绍 2、代码示例 2.1、将数据写入Excel文件 2.2、读取Excel文件中的数据 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步…

基于Python实现Midjourney集成到(个人/公司)平台中

目前Midjourney没有对外开放Api&#xff0c;想体验他们的服务只能在discord中进入他们的频道进行体验或者把他们的机器人拉入自己创建的服务器中&#xff1b;而且现在免费的也用不了了&#xff0c;想使用就得订阅。本教程使用midjourney-api这个开源项目&#xff0c;搭建Midjou…

系统可靠性分析与设计

一、考点分析 可靠性相关基本概念&#xff08;※※&#xff09;系统可靠性分析&#xff08;※※※※&#xff09;软件可靠性设计&#xff08;※※※※&#xff09; 二、可靠性相关基本概念 可靠性&#xff1a;软件系统在应用或系统错误面前&#xff0c;在意外或错误使用的情况下…

搜索Agent方案

为啥需要整体方案&#xff0c;直接调用搜索接口取Top1返回不成嘛&#xff1f;要是果真如此Simple&Naive&#xff0c;New Bing岂不是很容易复刻->.-> 我们先来看个例子&#xff0c;前一阵火爆全网的常温超导技术&#xff0c;如果想回答LK99哪些板块会涨&#xff0c;你…

【初始C++】引用的概念及使用场景、引用与指针的区别、内联函数、类型推导关键字auto、范围for循环、指针空值nullptr

目录 1.引用 1.1引用的概念 1.2引用的特性 1.3使用场景 1.4引用与指针的区别 2.内联函数 2.1内联函数的概念 2.2内联函数的特征 3.auto关键字&#xff08;C11&#xff09; 4.基于范围的for循环&#xff08;C11&#xff09; 5.指针空值nullptr&#xff08;C11&#x…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第四天-ARM Linux编程之IIC与uart (物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码&#xff1a;1688 教学内容&#xff1a; 1、I2C总线&#xff1a; I2C&#xff08;Inter&#xff0d;Integrated Circuit),PHILIPS公司开发的两线式半双工同步串行总线&#xff1b;可以用来连…

C/C++重点解析——内存管理

1. C/C内存分布 我们先来看一段代码和其相关问题&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd"…

中科大计网学习记录笔记(十一):CDN

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

【读书笔记】ICS设备及应用攻击(一)

工控系统通常是由互联设备所构成的大型复杂系统&#xff0c;这些设备包括类似于人机界面&#xff08;HMI&#xff09;、PLC、传感器、执行器以及其他使用协商好的协议进行相互通信的设备。所有交互背后的驱动力都是软件&#xff0c;软件为工控系统中几乎所有部分的运行提供支撑…

2月12号

第一种判断方式 if (n 10) 更好&#xff0c;因为它具有更好的可读性、可以避免误操作&#xff0c;并符合常见的编程习惯和约定