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. 创建statement
        Statement 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. 注册驱动
            //方案1
            DriverManager.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的测试包
    @Test
    public 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();
    }

    @Test
    public 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();
    }

    @Test
    public 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();
    }

    @Test
    public 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();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

清华AutoGPT:掀起AI新浪潮,与GPT4.0一较高下

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域迎来了一个又一个突破。最近&#xff0c;清华大学研发的AutoGPT成为了业界的焦点。这款AI模型以其出色的性能&#xff0c;展现了中国在AI领域的强大实力。 目录 引言&…

字符串拼接 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 给定 M 个字符( a-z ) &#xff0c;从中取出任意字符(每个字符只能用一次)拼接成长度为 N 的字符串&#xff0c;要求相同的字符不能相邻。 计算出给定的字符列表…

突发!亚马逊创始人贝索斯抛售60亿美元股票,外网疑其或加仓比特币

号外&#xff1a;2.16教链内参《内参&#xff1a;OpenAI Sora惊艳发布&#xff0c;加密圈有人获利超700倍》 前世界首富、全球知名电商平台亚马逊&#xff08;amazon&#xff09;创始人杰夫贝索斯&#xff08;Jeff Bezos&#xff09;最近一周以来接连抛售自家公司股票&#xff…

BulingBuling[Beyond the To-Do List] - 《让金钱为你服务》 [ Make Money Work for You ]

与《财务自由: 赚到足够的钱的有效方法》作者Grant的简短访谈 让钱为你工作 超越待办事项清单 主持人&#xff1a;Erik Fisher Make Money Work for You Beyond the To-Do List Hosted by Erik Fisher 与Erik Fisher一起探索如何确定你生活中最大的财务杠杆以及使用它们的最佳方…

【Linux系统化学习】文件重定向

目录 文件内核对象 文件描述符的分配规则 重定向 重定向的概念 dup2系统调用 输出重定向 追加重定向 输入重定向 stderr解析 重定向到同一个文件中 分离常规输出和错输出 文件内核对象 上篇文章中我们介绍到了操作系统中的文件&#xff0c;操作系统为了方…

什么是智慧公厕,智慧公厕有哪些功能

1.什么是智慧公厕&#xff1f; 随着智慧城市的快速发展&#xff0c;公共厕所作为城市基础设施的一部分&#xff0c;也在逐步升级转型。那么&#xff0c;什么是智慧公厕&#xff1f;智慧公厕作为智慧城市的重要组成部分&#xff0c;将公共厕所的建设、设计、使用、运营和管理等…

报错405(errAxiosError: Request failed with status code 405)

errAxiosError: Request failed with status code 405 前端调用接口的方法跟后台定义接口的方法不一致

docker (四)-docker网络

默认网络 docker会自动创建三个网络&#xff0c;bridge,host,none bridge桥接网络 如果不指定&#xff0c;新创建的容器默认将连接到bridge网络。 默认情况下&#xff0c;使用bridge网络&#xff0c;宿主机可以ping通容器ip&#xff0c;容器中也能ping通宿主机。 容器之间只…

UE4学习笔记 FPS游戏制作5 动画蒙太奇制作开枪动画

创建一个蒙太奇 选择角色的骨骼&#xff0c;并重命名 编辑蒙太奇 将我们需要的动画拖动到Default下的两个白杠的上边那个里 然后在下方的Sections节点中&#xff0c;点击Preview后的Default&#xff0c;选中后&#xff0c;再点击PreviewAllScetions上百年的长的绿色的Defalut&…

使用miniconda管理Python环境

之前经常使用pipenv管理虚拟环境&#xff0c;但是有一个问题就是代码给别人使用的时候&#xff0c;别人使用的Python版本和自己的不一致时&#xff0c;安装依赖包的时候会有问题。所以现在使用miniconda来管理虚拟环境&#xff0c;不仅小巧方便&#xff0c;还能为每个环境指定不…

Gitee入门之工具的安装

一、gitee是什么&#xff1f; Gitee&#xff08;码云&#xff09;是由开源中国社区在2013年推出的一个基于Git的代码托管平台&#xff0c;它提供中国本土化的代码托管服务。它旨在为个人、团队和企业提供稳定、高效、安全的云端软件开发协作平台&#xff0c;具备代码质量分析、…

LeetCode 100题目(python版本)待续...

一.哈希 1.两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复…

【LeetCode: 103. 二叉树的锯齿形层序遍历 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

QGIS004:【10栅格地形分析工具箱】-坡度、坡向、山体阴影

摘要&#xff1a;QGIS栅格地形分析工具箱常用工具有坡度、坡向、山体阴影等选项&#xff0c;本文介绍各选项的基本操作。 实验数据&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1gYZ_om4AlSdal0bts2mt-A?pwd4rrn 提取码&#xff1a;4rrn 一、坡度 工具功能&…

VitePress-17- 配置- appearance 的作用详解

作用说明 appearance : 是进行主题模式的配置开关&#xff0c;决定了是否启用深色模式。 可选的配置值&#xff1a; true: 默认配置&#xff0c;可以切换为深色模式&#xff1b; false: 禁用主题切换&#xff0c;只使用默认的配置&#xff1b; dark: 默认使用深色模式&#xff…

软件工程师,超过35岁怎么办

概述 随着科技行业的飞速发展&#xff0c;软件开发工程师的职业道路充满了各种机遇和挑战。对于已经在这个行业摸爬滚打了十多年的软件开发工程师来说&#xff0c;当他们步入35岁这个年纪时&#xff0c;可能会感到一些迷茫和焦虑。许多人担忧&#xff0c;在以创新、活力、快速迭…

SUSAN关键点检测以及SAC-IA粗配准

一、SUSAN关键点检测 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/visualization/pcl_visualizer.h> #include <boost/thread/thread.hpp> #include <…

[]人的成功离不开气运这么一说!

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

代码随想录刷题笔记-Day17

1. 路径总和 112. 路径总和https://leetcode.cn/problems/path-sum/ 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true …

【分享】JLINK的SW调试模式连线方式

大家知道&#xff0c;JLINK有2种调试模式&#xff1a;JTAG和SWD&#xff08;串行模式&#xff09;。 JTAG是常用模式&#xff0c;大家都熟悉、不废话了&#xff1b;如果使用SW模式&#xff0c;需要&#xff08;只需要&#xff09;4根连线&#xff0c;连接方式如下&#xff1a; …