【java web篇】使用JDBC操作数据库

news2024/9/30 11:34:34

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

目录

    • 📋 个人简介
  • 前言
    • JDBC简介
    • JDBC快速入们
    • JDBC API 详解
      • DriverManager
      • Connection
      • Statement
      • ResultSet
      • PreparedStatement - SQL注入演示
  • 结语

前言

一个项目肯定是离不开数据库的,每种语言都有涉及到操作数据库的内容,本节来看看java语言中如何使用JDBC如何操作数据库!

JDBC简介

就是使用java语言操作关系型数据库的一套API。
请添加图片描述

JDBC快速入们

主要有7步,当然在这之前肯定要先在当前项目或者模块中导入java操作mysql的jar包。对于这个jar包的下载不再总结!
在这里插入图片描述
如图,在模块中新建一个libs目录,将这个jar包放到里面。然后我们要让这个模块识别这个jar包:
在这里插入图片描述
在这里插入图片描述
我们选择模块有效就可以,然后就可以写代码了!
这7步我注视到代码里:

package JdbcDemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBCDemo {
    public static void main(String[] args){
        try {
            methods();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void methods() throws Exception{
        // 1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";
        String name = "root";
        String password = "...";
        Connection conn = DriverManager.getConnection(url,name,password);
        // 3.定义sql
        String sql = "update spj set QTY = 400 where SNO = 'S1'";
        // 4.获取执行sql的对象Statement
        Statement stmt = conn.createStatement();
        // 5. 执行sql
        int count = stmt.executeUpdate(sql); //返回更新的数据条数
        // 6.输出执行结果
        System.out.println("受影响行数:" + count);
        // 7.释放资源
        stmt.close();  //关闭执行sql的对象
        conn.close(); //关闭连接
    }
}

在这里插入图片描述

JDBC API 详解

DriverManager

DriverManager (驱动管理类)作用:

  1. 注册驱动
  2. 获取数据库的连接

在这里插入图片描述
但是,我们上面的案例代码中,并没有使用registerDriver来注册驱动,而是使用反射的方式加载Driver类,这个类里面用到了这个方法,来看看源码:
在这里插入图片描述
当然,mysql 5.0之后的jar包,注册驱动的这行代码可以不用写了:

Class.forName("com.mysql.cj.jdbc.Driver");

因为这个jar包中有文件记录了这个类名,会读取文件自动加载!
在这里插入图片描述

Connection

Connection的参数说明:
请添加图片描述
Connection(数据库连接对象)作用

  1. 获取执行sql的对象

请添加图片描述

  1. 管理事务

请添加图片描述

package Demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 * @Author:Aniu
 * @Date:2023/2/26 14:16
 * @description TODO
 */
public class Demo {
        public static void main(String[] args){
            try {
                methods();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static void methods() throws Exception{
            // 1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2.获取连接
            String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";
            String name = "root";
            String password = "...";
            Connection conn = DriverManager.getConnection(url,name,password);
            // 3.定义sql
            String sql1 = "update spj set QTY = 450 where SNO = 'S1'";
            String sql2 = "update spj set QTY = 250 where SNO = 'S2'";
            // 4.获取执行sql的对象Statement
            Statement stmt = conn.createStatement();

            try {
                // 开启事务
                conn.setAutoCommit(false);
                // 5. 执行sql
                int count1 = stmt.executeUpdate(sql1); //返回更新的数据条数
                // 6.输出执行结果
                System.out.println("受影响行数:" + count1);
                // 5. 执行sql
                int count2 = stmt.executeUpdate(sql2); //返回更新的数据条数
                // 6.输出执行结果
                System.out.println("受影响行数:" + count2);
                // 提交事务
                conn.commit();
            } catch (Exception e) {
                // 回滚事务
                conn.rollback();
                e.printStackTrace();
            }
            // 7.释放资源
            stmt.close();  //关闭执行sql的对象
            conn.close(); //关闭连接
        }
}

在这里插入图片描述
开启事务的目的就是当发生异常的时候回滚,让这几条sql操作都不执行,这里不再多说!

Statement

Statement 的作用

  • 执行sql操作
    请添加图片描述

ResultSet

ResultSet (结果集对象)作用
1.封装了DQL查询语句的结果

ResultSet stmt.execute(sql)  //执行DQL语句,返回ResultSet对象

在这里插入图片描述
请添加图片描述
例:

package Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * @Author:Aniu
 * @Date:2023/2/26 14:50
 * @description ResultSet
 */
public class Test {
    public static void main(String[] args) throws Exception {
        // 1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";
        String name = "root";
        String password = "...";
        Connection conn = DriverManager.getConnection(url,name,password);
        // 3.定义sql
        String sql = "select * from spj";
        // 4.获取Statement对象
        Statement stmt = conn.createStatement();
        // 5.执行sql
        ResultSet rs = stmt.executeQuery(sql);
        // 6.处理结果,遍历rs中的所有数据
        while(rs.next()){
            String sno = rs.getString("SNO");
            String pno = rs.getString("PNO");
            String jno = rs.getString("JNO");
            int qty = rs.getInt("QTY");
            System.out.println(sno);
            System.out.println(pno);
            System.out.println(jno);
            System.out.println(qty);
            System.out.println("------------");
        }
        // 7.释放资源
        rs.close();
        stmt.close();  //关闭执行sql的对象
        conn.close(); //关闭连接
    }
}

在这里插入图片描述

PreparedStatement - SQL注入演示

PreparedStatement 作用:

  • 预编译SQL语句并执行:预防SQL注入问题

SQL注入

  • SQL注入是通过操作输入来修改事先定义的SQL语句,用以达到执行代码对服务器进行攻击的方法。

进行这个案例,我们要先创建一张用户表:

CREATE TABLE `user` (
  `uid` bigint NOT NULL AUTO_INCREMENT COMMENT '用户uid', 
  `login_name` varchar(20) NOT NULL COMMENT '登录用户名',
  `login_pwd` varchar(32) NOT NULL COMMENT '登录密码',
   PRIMARY KEY (`uid`)
) 

在这里插入图片描述

package Login;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * @Author:Aniu
 * @Date:2023/2/26 15:36
 * @description TODO
 */
public class UserLogin {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";
        String name = "root";
        String password = "...";
        Connection conn = DriverManager.getConnection(url,name,password);
        // 模拟用户输入的值
        String login_name = "aniu";
        String login_pwd = "123456";

        String sql = "select * from user where login_name = '" + login_name + "' and login_pwd = '" + login_pwd + "'";
        System.out.println(sql);

        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        // 判断是否登录成功
        if(rs.next()){
            System.out.println("登录成功!");
        }else{
            System.out.println("登录失败!");
        }
    }
}

在这里插入图片描述
现在我们模拟sql注入,即使密码错误也可以登录成功!

public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";
        String name = "root";
        String password = "...";
        Connection conn = DriverManager.getConnection(url,name,password);
        // 模拟用户输入的值(演示sql注入,用户名和密码随便写)
        String login_name = "aniu666";
        String login_pwd = "' or '1' = '1";

        String sql = "select * from user where login_name = '" + login_name + "' and login_pwd = '" + login_pwd + "'";
        System.out.println(sql);

        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        // 判断是否登录成功
        if(rs.next()){
            System.out.println("登录成功!");
        }else{
            System.out.println("登录失败!");
        }
        // 释放资源
        rs.close();
        stmt.close();  //关闭执行sql的对象
        conn.close(); //关闭连接
    }

在这里插入图片描述
即使用户明和密码错误我们也可以登录,这是因为这个sql是恒等式所导致的!

那么怎么避免这个问题呢?就是通过这个PreparedStatement来解决!

请添加图片描述

public class UserLogin {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";
        String name = "root";
        String password = "...";
        Connection conn = DriverManager.getConnection(url,name,password);
        // 模拟用户输入的值(演示sql注入,用户名和密码随便写)
        String login_name = "aniu666";
        String login_pwd = "' or '1' = '1";

        String sql = "select * from user where login_name = ? and login_pwd = ?";

        PreparedStatement pstmt = conn.prepareStatement(sql);
        // 设置?的值
        pstmt.setString(1,login_name);
        pstmt.setString(2,login_pwd);

        ResultSet rs = pstmt.executeQuery();
        // 判断是否登录成功
        if(rs.next()){
            System.out.println("登录成功!");
        }else{
            System.out.println("登录失败!");
        }
        // 7.释放资源
        rs.close();
        pstmt.close();  //关闭执行sql的对象
        conn.close(); //关闭连接
    }
}

在这里插入图片描述
此时则显示登陆失败,避免了sql注入!本质上就是将sql中单引号进行了转义
’ \’ ',使用prepareStatement预编译sql性能更高!当然你要开启预编译,给Connection的url加参数:

String url = "jdbc:mysql://127.0.0.1:3306/myclasswork?useServerPrepStmts=true";

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门

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

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

相关文章

学习Java前,应该了解的这些知识(新手必学)

Java语言广泛应用于编写web应用程序、移动开发、安卓开发等,市场上对Java人才需求量很大,有数据显示,Java工程师的薪资待遇随着人才市场的需求逐步递增,由此可见,Java人才需求量呈现持续上升趋势,供不应求。…

LevelDB架构介绍以及读、写和压缩流程

LevelDB 基本介绍 是一个key/value存储,key值根据用户指定的comparator排序。 特性 keys 和 values 是任意的字节数组。数据按 key 值排序存储。调用者可以提供一个自定义的比较函数来重写排序顺序。提供基本的 Put(key,value),Get(key),…

企业电子招标采购源码之电子招标投标全流程!

随着各级政府部门的大力推进,以及国内互联网的建设,电子招投标已经逐渐成为国内主流的招标投标方式,但是依然有很多人对电子招投标的流程不够了解,在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

13-mvc框架原理与实现方式

1、mvc原理 # mvc 与框架## 1.mvc 是什么1. m:model,模型(即数据来源),主要是针对数据库操作 2. v:view,视图,html 页面。视图由一个一个模板构成(模板是视图的一个具体展现或载体,视图是模板的一个抽象) 3. c:controller,控制器,用于mv之间的数据交互## 2.最简单的 mvc 就是一…

Java+Swing+Mysql实现超市管理系统

一、系统介绍1.开发环境操作系统:Win10开发工具 :IDEA2018JDK版本:jdk1.8数据库:Mysql8.02.技术选型JavaSwingMysql3.功能模块4.系统功能1.系统登录登出管理员可以登录、退出系统2.商品信息管理管理员可以对商品信息进行查询、添加…

MapReduce小试牛刀

部署完hadoop单机版后,试下mapreduce是怎么分析处理数据的 Word Count Word Count 就是"词语统计",这是 MapReduce 工作程序中最经典的一种。它的主要任务是对一个文本文件中的词语作归纳统计,统计出每个出现过的词语一共出现的次…

【云原生kubernetes】k8s 常用调度策略使用详解

一、前言 通过之前的学习,我们了解到k8s集群中最小工作单位是pod,对于k8s集群来说,一个pod的完整生命周期是由一系列调度策略来控制,这些调度策略具体是怎么工作的呢?本文将详细讨论下这个问题。 二、k8s调度策略简介…

K8S---Pod进阶资源限制以及探针

目录 一、Pod 进阶 1、资源限制 2、Pod 和 容器 的资源请求和限制: 3、CPU 资源单位 4、内存 资源单位 5、实例操作 5.1 示例1 5.2 示例2 6、重启策略(restartPolicy) 6.1 示例1 二、健康检查:又称为探针(P…

华为OD机试题,用 Java 解【机器人走迷宫】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

电动针阀流量控制和电气比例阀压力控制在液氮低温控制中的应用

摘要:为了解决室温至液氮温区温控系统中需要昂贵的低温电动阀门进行液氮介质流量调节的问题,本文提供了三种不同精度的液氮温区内的低温温度控制解决方案。解决方案的技术核心是通过采用电动针阀和电气比例阀在室温环境下来快速调节外部气源流量或压力大…

Nginx网站服务——编译安装、基于授权和客户端访问控制

文章目录一、Nginx概述1.1、Nginx的特点1.2、Nginx编译安装1.3、Nginx运行控制1.4、Nginx和Apache的区别二、编译安装Nginx服务的操作步骤2.1、关闭防火墙,将安装nginx所需软件包传到/opt目录下2.2、安装依赖包2.3、创建运行用户、组(Nginx 服务程序默认…

【2023全网最全教程】从0到1开发自动化测试框架(建议收藏)

一、序言 随着项目版本的快速迭代、APP测试有以下几个特点: 首先,功能点多且细,测试工作量大,容易遗漏;其次,代码模块常改动,回归测试很频繁,测试重复低效;最后&#x…

Java 多线程 --- 多线程的相关概念

Java 多线程 --- 多线程的相关概念Race Condition 问题并发编程的性质 --- 原子性, 可见性, 有序性上下文切换 (Context Switch)线程的一些故障 --- 死锁, 活锁, 饥饿死锁 (Deadlock)活锁(Livelock)死锁和活锁的区别饥饿(Starvation)背景: 操作系统 — 线程/进程 同步 Race Co…

Windows操作系统的体系结构、运行环境和运行状态

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。说Windows操作系统的运行环境和运行状态,首先要介绍一下Windows操作系统的体系结构,然后再要说到最重要的两个概念:核…

【架构师】零基础到精通——微服务体系

博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小留言…

Iterator和Genertator

一、Iterator迭代器和for of原理 * 遍历器(Iterator)是一种机制(接口):为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署Iterator接口,就可以完成遍历操作「for of循环」,依次处理该数据结构的…

【C++入门(下篇)】C++引用,内联函数,auto关键字的学习

前言: 在上一期我们进行了C的初步认识,了解了一下基本的概念还学习了包括:命名空间,输入输出以及缺省参数等相关的知识。今天我们将进一步对C入门知识进行学习,主要还需要大家掌握我们接下来要学习的——引用&#xf…

基于SpringCloud的可靠消息最终一致性06:轮询事务消息

上一节把可靠消息最终一致性的正常逻辑代码顺序执行了一次,并且对于同一个事务消息,在正常情况下它要被发送至少两次。 这是因为在发送消息之前,TransactionMessageService就已经把消息保存到了数据库中。而在首次消费完消息后,TransactionMessageListener并没有从数据库中…

冯诺依曼体系结构与操作系统的概念及理解

一、 冯诺依曼体系结构1、概念2、内存的作用3、硬件原理解释软件行为二、操作系统的概念及基本作用1、概念2、设计操作系统的目的3、操作系统的主要作用4、什么是管理5、管理的目的6、操作系统如何为我们服务一、 冯诺依曼体系结构 我们常见的计算机,如笔记本。我们…

只需四步,手把手教你打造专属数字人

伴随ChatGPT的问世,在技术与商业运作上都日渐发展成熟的数字人产业正持续升温。去年9月,北京市发布了国内首个数字人产业专项支持政策,提出将依托国家文化专网将数字人纳入文化数据服务平台。以数字人、ChatGPT为代表的互联网3.0创新应用产业…