JDBC之API详解

news2025/2/28 15:51:00

 

 DriverManager可以注册驱动,就是创建接口的实现类对象。

Class.forName可以将Driver类加载进内存,Driver类中存在静态代码块,随着类的加载静态代码块执行,通过 DriverManager.registerDriver的方式注册好驱动。

获取与数据库的链接对象(Connection类) 

 

我们一般通过try...catch异常包围事务代码,把执行的sql放在try中,commit放在语句尾部,一旦出现任何异常就会触发回滚事务,而无法执行commit。

public class  jdbc_demo3_Connection{
    public static void main(String[] args) throws Exception {
        /*
        jdbc的快速入门与学习
         */
        //1、注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        String url="jdbc:mysql:///bd1?useSSL=false";
        String username="root";
        String password="xxxxx";
        //2、获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        //3、定义sql语句
        String sql1="UPDATE account SET money=1500 where id = 1";
        String sql2="UPDATE account SET money=1500 where id = 2";

        //4、执行sql的对象
        Statement stmt=conn.createStatement();

        try {
            //开启事务
            conn.setAutoCommit(false);

            //5、执行sql
            int count1 = stmt.executeUpdate(sql1);//返回受影响的行数
            int i=3/0;//注意这里,第一条sql可以执行,异常后的sql语句不可以执行;但由于开启事务,所以都无法执行
            int count2 = stmt.executeUpdate(sql2);//返回受影响的行数
            //6、处理结果
            System.out.println(count1);
            System.out.println(count2);

            //提交事务
            conn.commit();
        } catch (Exception e) {//抓一个大异常,出现任何异常都会产生事务回滚
            //回滚事务
            conn.rollback();
            e.printStackTrace();
        }

        //7、释放资源
        stmt.cancel();
        conn.close();
    }
}

 

        String sql="drop database bd2";

        //4、执行sql的对象
        Statement stmt=conn.createStatement();

        //5、执行sql
        int count = stmt.executeUpdate(sql);//返回受影响的行数
        if(count>0){
            System.out.println("修改成功");
        }else {
            System.out.println("修改失败");
        }

 ResulSet会自动创建一个游标指向数据行的上一行,也就是id,name....行

随后游标会往下移动来判断该行是否为有效行(是否有数据)

注意:列的开始是从1开始的。

感觉和迭代器有点类似,趁机复习一下

ArrayList<String> list=new ArrayList();
Iterator it=list.iterator();
while(it.hasNext){//判断下一个位置是否还有元素,到null返回false
    String str=it.next();//获取下一个位置的元素并且移动指针
    System.out.println(str);
}

这里面的get方法(),可以传递id值,也就是第几列。

也可以传递每列的名称。 

       Statement stmt=conn.createStatement();//DQL语句,数据查询
        //5、执行sql
        ResultSet rs = stmt.executeQuery(sql);//返回受影响的行数

        //6、处理结果,遍历rs中所有的数据
        //6。1光标向下移动一行,判断接下来是否还有数据
        while(rs.next()){
            //int id = rs.getInt(1);
            //String name = rs.getString(2);
            //String money = rs.getString(3);
            //也可以使用名称的方式直接获取
            int id = rs.getInt("id");
            String name = rs.getString("name");
            String money = rs.getString("money");

            System.out.println(id);
            System.out.println(name);
            System.out.println(money);
        }

在以后实际网页开发中,我们获取到了所有的数据后,想要使用还需要将数据封装成对应的数据类型,并且存放在集合里面方便操作。

        //5、执行sql
        ResultSet rs = stmt.executeQuery(sql);//返回受影响的行数
        //创建集合
        ArrayList<account> list=new ArrayList<>();
        //6、处理结果,遍历rs中所有的数据
        //6。1光标向下移动一行,判断接下来是否还有数据
        while(rs.next()){

            account ac=new account();

            //也可以使用名称的方式直接获取
            int id = rs.getInt("id");
            String name = rs.getString("name");
            String money = rs.getString("money");

           ac.setId(id);
           ac.setName(name);
           ac.setMoney(money);
           list.add(ac);
        }
        System.out.println(list);

如果我们采用字符串拼接的方式进行账户密码的校验,如果对方给出了如''这样的符号,可能会使我们定义的语句语意发生变化,从而达到破解的效果,这种入侵方式我们称为sql注入。

 

package com.tangshaojie.jdbc;

import java.sql.*;

public class jdbc_demo6_PreparedStatement {
    public static void main(String[] args) throws Exception {
        //1、注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        String url="jdbc:mysql://127.0.0.1:3306/bd1";
        String username="root";
        String password="XXXX";
        //2、获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        //3、定义sql语句
        String sql="select * from account where name=?and money=?";

        //4、执行sql的对象
        PreparedStatement pps=conn.prepareStatement(sql);

        //设置?的数值
        String TransName="张三";
        String TransMoney="1000";
        pps.setString(1,TransName);
        pps.setString(2,TransMoney);
        //5、执行sql
        ResultSet rs = pps.executeQuery();
        
        if(rs.next()){
            System.out.println("登陆成功");
        }else {
            System.out.println("登陆失败");
        }
        
        //7、释放资源
        pps.cancel();
        conn.close();
    }
}

  这种PreparedStatement是如何解决注入问题的呢?

实际上它会在底层自动的添加转义字符'/',这样程序的语句就不会因为注入发生变化。

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

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

相关文章

Android Java 播放音频 AudioTrack

【很多同学读 Android 系统的源码时感觉比较费力&#xff0c;一定会觉得是自己水平不够见识有限认知水平不足&#xff0c;觉得自己需要多学习多努力多下功夫&#xff0c;但 Android 系统源码质量之烂简直超乎想象。尽管 Android 系统确实实现了很多功能、特性&#xff0c;提供了…

【面试】你在项目中遇到过慢查询问题吗?你是怎么做SQL优化的?

文章目录 前言一、找出有问题的SQL1、系统层面2、SQL语句层面 二、查看SQL执行计划三、SQL优化案例慢查询优化步骤 SQL优化小结 前言 我在面试的时候很喜欢问候选人这样一个问题&#xff1a;“你在项目中遇到过慢查询问题吗&#xff1f;你是怎么做SQL优化的&#xff1f;” 很多…

含分布式电源的配电网可靠性评估研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Windows服务搭建web网站,使用cpolar内网穿透实现公网访问

文章目录 概述1. 搭建一个静态Web站点2. 本地浏览测试站点是否正常3. 本地站点发布公网可访问3.1 安装cpolar内网穿透3.2 创建隧道映射公网地址3.3 获取公网URL地址 4. 公网远程访问内网web站点5. 配置固定二级子域名5.1 保留二级子域名5.2 配置二级子域名 6. 测试访问二级子域…

Activiti7 工作流非原流程终止

背景 正常工作流&#xff0c;需要经过 node1、node2 才能结束。 现在要求已经开启的流程&#xff0c;目前停留在 node1&#xff0c;可以提前终止。 方案 一般根据实际需要&#xff0c;可以有几种做法&#xff1a; 新绘制流程图&#xff0c;新增 node1 结束的流程分支&#x…

基于 JESD204B 协议ARM+FPGA+AD多板卡多通道同步采集实现方法

0 引言 随着数字化信号处理技术的不断进步&#xff0c;对数字信号 的处理已经成为当前大多数工程应用的基本方法。由于 模拟信号才是现实生活中的原始信号&#xff0c;为了工程研究实 现的可能&#xff0c;需将模拟信号转换为数字信号才能在工程中 处理&#xff0c;AD 转换…

独立按键控制LED移位

1.这就是LED移位的原理 2. #include <REGX52.H> void Delay(unsigned int xms);unsigned char LEDNum;//LEDNum为0000 0000void main() {P2~0x01; //上电默认LED1点亮while(1){if(P3_10) //如果K1按键按下&#xff0c;LED灯往右依次亮起{Delay(20);while(P3_10);//消…

Bandizip已管理员身份运行

系列文章目录 文章目录 系列文章目录前言一、Bandzib是什么&#xff1f;二、使用步骤1.引入库 前言 在解压krita源码包时Bandizip报错 一、Bandzib是什么&#xff1f; bandzip官网 Bandizip 是一款压缩软件&#xff0c;它支持Zip、7-Zip 和 RAR 以及其它压缩格式。它拥有非…

【22岁,想转行IT,请问培训出来真的能找到工作吗?】

首先需要肯定的是&#xff0c;22岁是一个转行IT的好时间&#xff0c;大概猜想你是大学应届生吧&#xff0c;学历和年龄都是IT企业们非常喜欢的&#xff0c;这个时候如果你刚好有一身过硬的专业技能&#xff0c;那就非常完美了。那么你现在想转行学习&#xff0c;目前对于IT行业…

SpringBoot 整合 ChatGPT API 项目实战

SpringBoot 整合 ChatGPT API 项目实战 一、准备工作 二、补全接口示例 三、申请API-KEY 四、JavaScript调用API 五、SpringBoot使用ChatGPT API 体验到了ChatGPT的强大之后&#xff0c;那么我们会想&#xff0c;如果我们想基于ChatGPT开发一个自己的聊天机器人&#xff0…

计算机网络复习记录(总结 —— 快速入门和快速复习)

一、计算机网络的定义和分类 定义&#xff1a; 简单定义&#xff1a;一些互连、自治、的计算机集合。 较好定义&#xff1a;计算机网络主要是由一些通用的、可编程的硬件互连而成&#xff0c;而这些硬件并非专门用来实现某一特定目的。 分类 按交换技术分类 按使用者分类 …

【工作思考】如何提升自己的编程能力?

文章目录 前言一、代码评审为什么要进行代码评审&#xff1f; 二、持续学习能力三、良好的编程习惯代码注释避免深度嵌套拒绝长函数重视自测文档编写重构你的代码学会思考 四、多接触开源项目五、总结 前言 在工作中&#xff0c;我们大部分的时间都是在阅读代码&#xff0c;阅…

CF204A-Little Elephant and Interval(数位)

CF204A-Little Elephant and Interval 考虑 [ 1 , a b c d e ‾ ] [1,\overline{abcde}] [1,abcde] 的情况&#xff1a; 位置集合数量个位1 ~ 99十位11 ~ 999百位 { x u x ‾ ∣ x ∈ [ 1 , 9 ] , u ∈ [ 0 , 9 ] } \{\overline{xux} | x\in [1,9],u\in [0,9]\} {xux∣x∈[1…

基于Yolov5的二维码QR码识别

1.QR code介绍 一个 QR 码可以分为两个部分&#xff1a;功能图形和编码区域。 数据集 大小10,85张 1.1 通过split_train_val.py得到trainval.txt、val.txt、test.txt # coding:utf-8import os import random import argparseparser argparse.ArgumentParser() #xml文件的地…

设计模式-结构型模式之代理模式

6. 代理模式 6.1. 模式动机 在某些情况下&#xff0c;一个客户不想或者不能直接引用一个对 象&#xff0c;此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用&#xff0c;并且可以通过代理对象去掉客户不能看到 的内…

江苏专转本盐城工学院管理学章节习题

江苏专转本盐城工学院管理学章节习题第一章 管理活动与管理理论 一、单项选择题 1.企业在销售产品时,需要预估货款回收的可能性。为此&#xff0c;信用审核部门力图以一种低成本的方式处理有关客户资信的材料,但因为过程速度太慢,使许多客户另求他处购货。该项信用审核工作可…

Power Automate实现自动填充Word

创建Word模板 1、创建一个Word&#xff0c;按需求写好内容 2、在需要填充的地方插入开发工具-纯文本内容控件 3、编辑控件属性&#xff0c;用于Power Automate中区分字段 4、模板完成后上传至Sharepoint站点中 创建Forms 也可使用Sharepoint列表作申请单&#xff0c;这步就…

实战:快速实现iOS应用中集成即时通讯IM和UI

准备 熟练objective-c语言 有一台mac电脑,并安装了xcode 和 cocoapods 目标 手把手教大家在iOS应用中集成即时通讯IM 功能 内容篇幅较长,需要内心平和耐心看下去,务必戒躁.阅读本文并按照本文进行对接预计时长2小时 注册Appkey和username 本教程以集成环信IM为例 注册环信…

SpringBoot 整合 ES (四十二)

我看到希望&#xff0c;哪怕只有微小的一束光&#xff0c;我也会拼尽全力去寻找 上一章简单介绍了 SpringBoot 整合 RabbitMQ (四十一), 如果没有看过,请观看上一章 ES 相应的教程&#xff0c;可以看老蝴蝶之前写的文章: https://blog.csdn.net/yjltx1234csdn/category_122775…

Java 基础常识

一、Java运行机制 1.Java运行原理 编译&#xff1a;.java(源代码) ---> .class(字节码) 解释&#xff1a;.class(字节码) ---> 加载并启动JVM(类加载) ---> .class(机器指令) 执行&#xff1a;通过JVM来完成运行输出 2.Java运行过程 利用 javac 编译 .java 文件 利…