JDBC第二章 (JDBC API详解)

news2025/1/10 12:15:29

目录

一、下载驱动包

二、加载与注册驱动

1、使用driverManager类

2、方式:

3、补充:

三、建立连接

1、URL

2.建立连接的方式

3.事务管理

4.获取Statement语句

1、普通版本

2、防止SQL注入版本

3、获取存储过程

四、Statement

1、概述

2、例子

五、结果集 ResultSet

1、概述

2、RestultSet 里面提供的方法

3、举例实操

需求:获取account表中的全部数据

代码实现:

注意

补充java数据类型和SQL类型对照表

六、SQL注入问题

1、sql注入(由于去改变sql语法结构)

2、preparedStatement 预编译语句补充

1、作用:

2、获取PreparedStatement语句

3、设置参数值

3、PreparedStatement 原理



一、下载驱动包

地址:https://mvnrepository.com

二、加载与注册驱动

1、使用driverManager类

2、方式:

  • Class.forName("com.mysql.cj.jdbc.Driver");
  • //注册驱动
    DriverManager.registerDriver(com.mysql.cj.jdbc.Driver);
  • System.setProperty("jdbc.drivers","com.mysql.cj.jdbc.Driver");

注意:方式一和方式三建立的驱动相同,方式一通过反射的方法来设置驱动,方式三直接设置驱动

3、补充:

  • Mysql 驱动包5.0之后的版本,可以省略注册驱动的步骤

三、建立连接

1、URL

1.1表示连接路径

1.2参数说明

String url = "jdbc:mysql://localhost:3306/jdbc";

1.3 JDBC URL的组成

JDBC URL的标准由三部分组成(jdbc:子协议:子名称),各部分之间用 隔开

  • 协议:JDBC URL 中的协议就是jdbc

  • 子协议:用来标识数据库驱动程序

  • 子名称:标识数据库的方法。定位数据库需要ip,端口port,数据库名称

1.4 常见数据库的JDBC URL

  • Oracle jdbc:oracle:thin@主机名称:oracle服务端口:Databasename=数据库名称

2.建立连接的方式

        String url = "jdbc:mysql://localhost:3306/jdbc";
//        建立连接方式一
//        String user = "root";
//        String password = "123456";
//        Connection connection = DriverManager.getConnection(url,user,password);
​
​
//        获取连接的方式二   com.mysql.cj.jdbc.ConnectionImpl@fcd6521
        Properties properties = new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","123456");
        Connection connection = DriverManager.getConnection(url, properties);

3.事务管理

//        开启事务
        connection.setAutoCommit(false);
//        事务提交
        connection.commit();
 

4.获取Statement语句

1、普通版本

Statement statement = connection.createStatement();

2、防止SQL注入版本

//        获取预编译语句
connection.prepareStatement();

3、获取存储过程

//        获取存储过程
CallableStatement callableStatement = connection.prepareCall();

注意:

常用预编译语句来操作sql语句,存储过程不常使用,基本不用。

四、Statement

1、概述

  1. Statement 对象的作用是用来执行SQL语句,但是不同类型的SQL语句执行语法又不太一样

    • 执行DDL/DML 语句 数据定义、数据管理

      //        执行DDL/DML 语句  数据定义、数据管理
              int i = statement.executeUpdate();
      //返回值是受影响行数

    • 执行DQL 语句 数据查询

      //        执行DDL/DML 语句  数据定义、数据管理
              int i = statement.executeUpdate();
      //返回值是受影响行数

2、例子

  public static void main(String[] args) throws Exception {
//        加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
//       建立连接
        String url = "jdbc:mysql://localhost:3306/jdbc";
        String user = "root";
        String password = "123456";
        Connection connection = DriverManager.getConnection(url, user, password);
//      创建statement语句操作sql
        Statement statement = connection.createStatement();
//      定义sql语句 修改id=1 的money
        String sql = "update account set money = 8000 where id = 1";
//        操作DML语句
        int i = statement.executeUpdate(sql);
//       受影响行数
        System.out.println(i);
        
//        关闭资源
        statement.close();
        connection.close();
    }

五、结果集 ResultSet

1、概述

  1. 封装sql查询结果

  2. 执行结果集的方法

    ResultSet resultSet = statement.executeQuery();

2、RestultSet 里面提供的方法

  • boolean next()

    • 将光标从当前位置向前移动一行

    • 判断当前行是否有效

    • 返回值boolean 说明

      • true:有效当前行有数据

      • false:无效,当前行没有数据

  • xxxgetXxx(参数) 获取数据

    • xxx:数据类型 (int getInt(参数))

    • 参数

      • int 类型 ,列的标号,从1开始

      • String 类型 ,列的名称

3、举例实操

  1. 需求:获取account表中的全部数据

  2. 代码实现:

     public static void main(String[] args) throws Exception {
            //        加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
    //       建立连接
            String url = "jdbc:mysql://localhost:3306/jdbc";
            String user = "root";
            String password = "123456";
            Connection connection = DriverManager.getConnection(url, user, password);
    //      创建statement语句操作sql
            Statement statement = connection.createStatement();
    //      定义sql语句 修改id=1 的money
            String sql = "select * from account";
    //      执行DQL
            ResultSet resultSet = statement.executeQuery(sql);
    //      处理结果集
            //判断是否有下一行
    //        while (resultSet.next()){
    //            //根据列序号
    //            int id = resultSet.getInt(1);
    //            int money = resultSet.getInt(2);
    //            String name = resultSet.getString(3);
    //            System.out.println("id:" + id + " " + "money:" + money + " " + "name:" + name);
    //        }
            
            while (resultSet.next()){
                //也可以属性名来获取值
                int id = resultSet.getInt("id");
                int money = resultSet.getInt("money");
                String name = resultSet.getString("name");
                System.out.println("id:" + id + " " + "money:" + money + " " + "name:" + name);
            }
    //      释放资源
            statement.close();
            connection.close();
        }
    
    
      

注意

在通过列名获取值时,列名要和数据库表中的列名对应,且要注意数据类型;

补充java数据类型和SQL类型对照表

六、SQL注入问题

1、sql注入(由于去改变sql语法结构)

String password1 ="'1' or '1'='1'";
//        定义sql
String sql = "select * from user where username='" + userName + "' and password=" + password1+"; ";

D:\roming\Typora\typora-user-images\image-20221226111605174.png

2、preparedStatement 预编译语句补充

1、作用:

预编译SQL语句并执行,预防sql注入

2、获取PreparedStatement语句

//      获取预编译语句
//        定义sql
        String sql = "select * from user where username=? and password= ?";
//        System.out.println(sql);
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

注意:?为占位符

3、设置参数值

(获取sql 语句时使用?占用坑位,在使用时要替换这些坑位)

  • setXxx(参数一,参数二);给?赋值

  • 参数

    • 参数1: ?的位置编号,从1开始

    • 参数2: ?的值

  • 执行SQL语句时,就不需要传递sql语句了

测试代码:

//      模拟用户登录
        String userName="cyc";
        String password1 ="'1' or '1'='1'";
​
//      获取预编译语句
//        定义sql
        String sql = "select * from user where username=? and password= ?";
//        System.out.println(sql);
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
//
        preparedStatement.setString(1,userName);
        preparedStatement.setString(2,password1);
​
        ResultSet resultSet = preparedStatement.executeQuery();
//        ResultSet resultSet = statement.executeQuery(sql);
​
        if (resultSet.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
​
        preparedStatement.close();
        connection.close();

3、PreparedStatement 原理

  • java将sql语句发送到Mysql服务器

  • Mysql操作

    • 检查sql语句语法

    • 编译SQL语句,将SQL编译成可执行函数

      • 检查SQL和编译SQL时间比执行SQL时间要长,使用预编译语句不需要重复检查SQL语句和编译,还可以提高性能

    • 执行SQL

  • 通过查询日志来看原理

    • 开启预编译功能(刚才只是解决了SQL注入问题,预编译还没开启)

      • 开启:在url加上如下参数 ??userServerPrepStmts=true

    • 配置Mysql日志文件(.ini文件)

       

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

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

相关文章

数图互通高校房产管理——房屋模拟分配建设

数图互通房产管理系统在这方面做得比较全面; 1、 房屋模拟分配建设方案 实现对学校房屋分配进行情景模拟,在特定房屋类型、数量、使用面积等情况下,建立多个模拟分配方案,并对每个模拟分配方案生成明细清单。 1.1 房屋模拟分配清…

石墨烯太阳能供暖远程监控

石墨烯太阳能供暖系统是指采用全新一代石墨烯碳纤维电热膜为发热体,直接将电能转换为热能的供暖系统。再搭配太阳能光伏发电系统给石墨烯供暖系统供电,更加节能有效地解决用户用电问题。但目前这种供暖方式也存在诸多问题,如供暖温度得不到控…

深度学习交通标志识别项目

主要内容 在本文中,使用Python编程语言和库Keras和OpenCV建立CNN模型,成功地对交通标志分类器进行分类,准确率达96%。开发了一款交通标志识别应用程序,该应用程序具有图片识别和网络摄像头实时识别两种工作方式。 写作目的 近年…

jenkins 升级遇到问题总结

当我在使用jenkins的时候,避免不了下载很多插件,因为jenkins本身不提供很多功能,大部分的功能都是依赖插件来完成的,这也使jenkins更具有扩展性,但是,我在安装完成后打开插件列表居然是这样的。。。 或者插件列表打开的正常,但是安装某个插件时报这样的错误。。。 看标…

c++算法基础必刷题目——尺取法

文章目录尺取法1、字符串2、丢手绢尺取法 尺取法通常也叫滑动窗口法,顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推…

Html网页和C++ App通信 - qwebchannel

Qt5 引入了 Qt WebChannel 的概念。这是为了在不能影响各端代码执行的前提下实现 Qt 端于 client 端的无缝 双向 通信。 QWebChannel 提供了在 C应用和 前端(HTML/JS)之间点对点的通信能力。通过向 前端的 QWebChannel 发布 QObject 的 派生对象&#xf…

开源版支持工作台展示,新增超级管理员用户组,MeterSphere开源持续测试平台v2.5.0发布

2022年12月27日,MeterSphere一站式开源持续测试平台正式发布v2.5.0版本。 在这一版本中,MeterSphere在工作台模块进行了UX交互升级,并将工作台模块由X-Pack增强功能开放为开源版功能。 在测试跟踪模块中,关联测试用例支持关联UI…

(四)RequestResponse

一、Request 和 Response 的概述 Request是请求对象,Response是响应对象。request:获取请求数据 (1)浏览器会发送HTTP请求到后台服务器 [Tomcat] (2)HTTP的请求中会包含很多请求数据[请求行请求头请求体] &…

26位前谷歌AI专家出走创业

细数近几年来高科技对现代社会的影响,人工智能(AI)无疑是排在前列。AI已经对人类社会行为、健康、教育和娱乐的方方面面都产生了巨大冲击。作为高科技的头部企业,谷歌的AI团队可能是AI行业最有影响的团队之一,他们的一…

第十三讲:MSTP技术应用

学校因为教师的人数越来越多,部门逐渐也增多,各部门之间都已经采用了vlan技术,但为了实现公司的稳定性和消除内部网络的环路,管理员小赵配合飞越公司去实现学校内部网络时刻不间断,来保证公司网络的运行。 为了解决校园…

【Lilishop商城】No4-3.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-微信小程序登录接口开发

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑,其中重点包括接口类、业务类,具体的结合源代码…

工厂明火烟雾视频监控识别 烟火自动识别预警 yolo

工厂明火烟雾视频监控识别 烟火自动识别预警通过pythonyolo网络深度学习模型可以自动识别监控区域内的烟火,如pythonyolo网络深度学习模型发现火焰烟火可以立即抓拍告警。Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行&#x…

Flink系列-2、Flink架构体系

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址:https://flink.apache.org/ 学习资料:https://flink-learning.org.cn/ 目录Flink中的重要…

[ web基础知识点 ] 解决端口被占用的问题(关闭连接)(杀死进程)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

什么是文件描述符

Linux内核在各种不同的文件系统格式之上做了一个抽象层,使得文件、目录、读写访问等概念成为抽象层的概念,因此各种文件系统看起来用起来都一样,这个抽象层称为虚拟文件系统(VFS,Virtual Filesystem)。 内核数据结构 Linux内核的V…

【endnote学习】解决为什么文献引用后出现年/月/日格式(endnote对其他类型引用文件的不兼容导致)

为什么文献引用后出现年/月/日格式问题描述问题解决问题描述 在一次文献引用中发现,引用后的文献格式里面多了年/月/日格式,比如选择AIChE格式时,出现: Liu P, Nrskov JK. Kinetics of the Anode Processes in PEM Fuel Cells …

编译原理——基本块、流图、基本块优化、循环优化(代码优化)

一、划分基本块、画流图 找基本块的入口:一共有三类入口:①代码段的第一个指令;②条件跳转和无条件跳转的目标语句;③条件跳转语句的下一条语句;根据划分的入口画流图,一个基本块的区间:从入口…

C++: STL : 容器:set/multi set,map/multimap

一:set容器 1.1: set容器的构造和赋值 简介:所有元素都会在插入时自动被排序 本质:set/multiset 属于关联式容器 ,底层结构是二叉树实现 set与multiset区别: set: 不 允许容器中有重复元素 multiset :允…

Shader Graph(一)基本使用

一、如何使用Shader Graph 1.1 新建项目 通过创建URP或HDRP模板项目,可以自动配置好Shader Graph。 1.2 已有项目 在「Package Manager」中安装「Shader Graph」及URP或HDRP组件。然后在弹出的渲染管线向导面板中点击「Fix All」即可。如果项目中存在已经创建好…

three.js实战-Sprite实现标签效果

1. demo效果 2 .什么是精灵(Sprite) 按照Three.js官网的解释是:精灵是一个总是面朝着摄像机的平面,通常含有使用一个半透明的纹理。精灵不会投射任何阴影,即使设置了也将不会有任何效果。 3. 代码大致逻辑 创建一个canvas对象,首先调用ctx…