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.hqwc.cn/news/472665.html

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

相关文章

安卓学习笔记之五:Android Studio_骰子案例3(Kotlin搭配 Jetpack Compose实现)

使用 Compose 创建一款交互式 Dice Roller Android 应用。 完成&#xff1a; 定义可组合函数。使用组合创建布局。使用 Button 可组合项创建按钮。导入 drawable 资源。使用 Image 可组合项显示图片。使用可组合项构建交互式界面。使用 remember 可组合项将组合中的对象存储到…

在线Windows鼠标主题转换器(ani动态鼠标改为Xcur)

文章目录 前言在哪访问如何使用惨淡的界面简单粗暴的使用方法目前的bug 前言 在这篇文章中&#xff0c;我使用一些方法把转换脚本包装成了在线服务&#xff0c;现在我将说明如何使用服务。 在哪访问 还是说明一下&#xff0c;访问链是这个&#xff1a;https://www.sakebow.c…

【python】python入门(变量名)

Hi~ o(*&#xffe3;▽&#xffe3;*)ブ今天一起来看看python入门之变量名吧~~ 变量名的规定&#xff1a; 举个例子&#xff1a; “违法”的变量名们 my love/my &#xff01;love错误&#xff1a;中间不能是空格或者其他符号1my_love错误&#xff1a;不能数字开头"my_l…

蓝桥杯第十四届电子类单片机组程序设计

目录 前言 蓝桥杯大赛历届真题&#xff08;点击查看&#xff09; 一、第十四届比赛题目 1.比赛原题 2.题目解读 1&#xff09;任务要求 2&#xff09;注意事项 二、任务实现 1.NE555读取时机的问题 1&#xff09;缩短计数时间 2&#xff09;实时读取 2.温度传感器读…

Qt for android : Qt6.6.2 搭建 环境

环境说明 参考Qt助手: Assistant 6.6.2 (MinGW 11.2.0 64-bit) ***Gradle : Gradle wrapper, version 8.3***JDK11 SDK Tools / NDK 25.1.8937393 参考 Qt For Android : Qt5.13.1 Qt for android: Qt6.4搭建环境遇到的几个问题

.NET高级面试指南专题八【 垃圾回收机制GC】

.NET的垃圾回收&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;是一种自动内存管理机制&#xff0c;负责在运行时追踪和释放不再使用的对象&#xff0c;以避免内存泄漏和提高应用程序的性能。 垃圾回收的基本原理&#xff1a; 标记阶段&#xff08;Mark Phase&…

前端工程化面试题 | 12.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

机器学习面试:请你谈谈生成模型和判别模型的区别?

生成模型:由数据学习联合概率密度分布P(XY)&#xff0c;然后求出条件概率分布P(YIX)作为预测的模型&#xff0c;即生成模型:P(Y|X) P(X,Y)/ P(X)(贝叶斯概率)。基本思想是首先建立样本的联合概率概率密度模型P(X,Y)然后再得到后验概率P(Y|X)&#xff0c;再利用它进行分类。典型…

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章&#xff0c;转载请注明原文出处。 本文介绍嵌入式轻量化图形库LVGL 8.2移植到Linux开发板ATK-RK3568上的步骤。 主要是参考大佬博客&#xff1a; LVGL v8.2移植到IMX6ULL开发板_lvgl移植到linux-CSDN博客 一、环境 1、平台&#xff1a;rk3568 2、开发板:…

python实现多图绘制系统

文章目录 需求和框架AxisFrameAxisListDarwSystem 从零开始实现一个三维绘图系统 需求和框架 本文希望实现下图所示的绘图系统&#xff0c;下面详细分析需求变化。 和之前实现的绘图系统相比&#xff0c;首先是多了【新增】和【删除】这两个按钮&#xff0c;其功能是控制绘图数…

游戏安全组件运行时发生异常1-0-0

可能是这个服务&#xff0c;可能被禁用了。 如果是文件缺少直接修复游戏

Android 12.0 MTK Camera2 设置默认拍照尺寸功能实现

1.前言 在12.0的系统rom定制化开发中,在mtk平台的camera2关于拍照的一些功能修改中,在一些平台默认需要设置最大的分辨率 来作为拍照的分辨率,所以就需要了解拍照尺寸设置流程,然后来实现相关的功能 如图: 2.MTK Camera2 设置默认拍照尺寸功能实现的核心类 \vendor\me…