JDBC 核心 API

news2024/11/26 10:02:06

引入 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();
    }
}

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

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

相关文章

讲解用Python处理Excel表格

我们今天来一起探索一下用Python怎么操作Excel文件。与word文件的操作库python-docx类似&#xff0c;Python也有专门的库为Excel文件的操作提供支持&#xff0c;这些库包括xlrd、xlwt、xlutils、openpyxl、xlsxwriter几种&#xff0c;其中我最喜欢用的是openpyxl&#xff0c;这…

LEETCODE 315. 计算右侧小于当前元素的个数(归并)

class Solution { public: // 将count声明为publicvector<int> count; vector<int> indexs,tmp;public:vector<int> countSmaller(vector<int>& nums) {//归并int left0;int rightnums.size()-1;//计数// vector<int> count(nums.size()); …

题解37-42

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,nul…

【C++】友元、内部类和匿名对象

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 1. 友元 1.1 友元函数 1.2 友元类 2. 内部类 2.1 成员内部类 2.2 局部内部类 3. 匿名对象 3.1 基本概念 3.1 隐式转换 1…

(10)Hive的相关概念——文件格式和数据压缩

目录 一、文件格式 1.1 列式存储和行式存储 1.1.1 行存储的特点 1.1.2 列存储的特点 1.2 TextFile 1.3 SequenceFile 1.4 Parquet 1.5 ORC 二、数据压缩 2.1 数据压缩-概述 2.1.1 压缩的优点 2.1.2 压缩的缺点 2.2 Hive中压缩配置 2.2.1 开启Map输出阶段压缩&…

threejs之使用shader实现雷达扫描

varying vec2 vUv; uniform vec3 uColor; uniform float uTime;mat2 rotate2d(float _angle){return mat2(cos(_angle),-sin(_angle),sin(_angle),cos(_angle)); }void main(){vec2 newUv rotate2d(uTime*6.18)*(vUv-0.5);float angle atan(newUv.x,newUv.y);// 根据uv坐标获…

那些杠鸿蒙的现在怎么样了?

别杠&#xff0c;要杠就是你对。 一个纯血鸿蒙就已经打了那些杠精的嘴&#xff0c;以前是套壳Android&#xff0c;大家纷纷喷鸿蒙。现在鸿蒙已经全栈自研&#xff0c;并且已经展开各大企业生态合作。不管什么独立系统&#xff0c;都是一定要走一遍套壳Android的道路的&#xf…

幻兽帕鲁云服务器搭建零基础教程,新手小白一看就会

以下教程基于阿里云服务器ECS 来搭建幻兽帕鲁游戏服务器&#xff0c;通过一键部署的方式&#xff0c;最快1分钟即可完成部署。 阿里云一键部署幻兽帕鲁的活动地址&#xff1a;1分钟畅玩&#xff01;一键部署幻兽帕鲁联机服务器 首先&#xff0c;打开阿里云的这个游戏服务器活…

laravel_进程门面_简单介绍

文章目录 Facade是什么&#xff1f;Facade能干什么Facade有哪些方法&#xff1f;怎么使用Facade呢&#xff1f;详细的代码解释Symfony Process是什么&#xff1f;介绍Symfony总结 Facade是什么&#xff1f; 在 Laravel 框架中&#xff0c;Facade 是一种设计模式。 它提供了一…

Javaweb基础-会话

会话&#xff1a; 会话管理&#xff1a;Cookie和Session配合解决 cookie是在客户端保留少量数据的技术,主要通过响应头向客户端响应一些客户端要保留的信息 session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息 cookie和session配合记录…

奇异递归模板模式应用3-克隆对象

需求&#xff1a;希望某些类提供拷贝自身对象的功能&#xff0c;实现如下 template <typename T> class A { public:T *clone() {return new T(static_cast<T &>(*this));}private:friend T;A() default; };class B : public A<B> { public:B(int valu…

基于Java (spring-boot)和微信小程序的奶茶点餐小程序

一、项目介绍 基于Java (spring-boot)和微信小程序的奶茶点餐小程序功能&#xff1a;客户端登录、个人中心、点餐、选规格、去结算、取餐、我的信息、管理员登录、管理员首页、用户管理、商品管理、商品编辑、商品种类、订单管理、订单处理、等等等。 适用人群&#xff1a;适合…

全网首发 vsol光猫v2802rh光猫配置及IPTV组播教程

写在前面&#xff0c;首先感谢恩山的前辈们&#xff01;在农村老家没有10GPON但是GPON线路可以完成最高2.5G带宽&#xff0c;因此在重庆联通的基础上&#xff0c;配合V2802RH出这个教程&#xff08;图片都是一样我直接借用网上展示一下光猫后台&#xff09;。 提前准备一个VSO…

Unity 2D Spine 外发光实现思路

Unity 2D Spine 外发光实现思路 前言 对于3D骨骼&#xff0c;要做外发光可以之间通过向法线方向延申来实现。 但是对于2D骨骼&#xff0c;各顶点的法线没有向3D骨骼那样拥有垂直于面的特性&#xff0c;那我们如何做2D骨骼的外发光效果呢&#xff1f; 理论基础 我们要知道&a…

蒙特卡罗模拟 python Monte Carlo Simulation

1. 蒙特卡罗模拟 与普通预测模型不同&#xff0c;蒙特卡罗模拟根据估计值范围与一组固定输入值来预测一组结果。换句话说&#xff0c;蒙特卡洛模拟通过利用概率分布&#xff08;例如均匀分布或正态分布&#xff09;&#xff0c;为任何具有固有不确定性的变量构建可能结果的模型…

leetcode hot 100最小花费爬楼梯

本题和之前的爬楼梯类似&#xff0c;但是需要考虑到花费的问题&#xff01;**注意&#xff0c;只有在爬的时候&#xff0c;才花费体力&#xff01;**那么&#xff0c;我们还是按照动态规划的五部曲来思考。 首先我们要确定dp数组的含义&#xff0c;那么就是我们爬到第i层所花费…

基于蓄电池和飞轮混合储能系统的SIMULINK建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 蓄电池储能原理 4.2 飞轮储能原理 4.3 混合储能系统原理 5.完整工程文件 1.课题概述 基于蓄电池和飞轮混合储能系统的SIMULINK建模与仿真。蓄电池和飞轮混合储能&#xff0c;蓄电池可以用SIMULINK…

【C++】类和对象(五)友元、内部类、匿名对象

前言&#xff1a;前面我们说到类和对象是一个十分漫长的荆棘地&#xff0c;今天我们将走到终点&#xff0c;也就是说我们对于&#xff23;算是正式的入门了。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &…

C++入门篇(5)——类和对象(2)

目录 1.类的6个默认成员函数 2.构造函数 2.2 概念 2.3 特性 3.析构函数 3.1 概念 3.2 特性 1.类的6个默认成员函数 如果一个类一个成员都没有&#xff0c;那么这个类就是空类。但空类并非什么都没有&#xff0c;编译器会对任何一个类都生成六个默认成员函数。 2.构造…

安装 Windows Server 2003

1.镜像安装 镜像安装:Windows Server 2003 2.安装过程(直接以图的形式呈现) 按Enter(继续),继续后F8继续 直接Enter安装 下一步 秘钥:GM34K-RCRKY-CRY4R-TMCMW-DMDHM 等待安装成功即可