JDBC -- API

news2025/1/12 1:52:50

目录

DriverManager 驱动管理类

作用

注册驱动

获取数据库连接

Connection 数据库连接对象

作用

获取执行SQL的对象

管理事务

Statement

作用

执行SQL语句

ResultSet 结果集对象

作用

封装了DQL查询语句的结果

获取查询结果

PreparedStatement

作用

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

使用

好处

原理


DriverManager 驱动管理类

作用

注册驱动

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

查看源码

TIP:

MySQL 5之后的驱动包,可以省略注册驱动的步骤

自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类

获取数据库连接

DriverManager.getConnection( String url,String username,String password);

1. url:连接路径

语法: jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...

示例: jdbc:mysql://127.0.0.1:3306/test1

细节:

  • 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则ur可以简写为: jdbc:mysql:///数据库名称?参数键值对
  • 配置useSSL=false参数,禁用安全连接方式,解决警告提示

2.username:用户名

3.password:密码

Connection 数据库连接对象

作用

获取执行SQL的对象

普通执行SQL对象

Statement createStatement()

预编译SQL的执行SQL对象:防止SQL注入

PreparedStatement prepareStatement (sql)

执行存储过程的对象

CallableStatement prepareCall (sql)

管理事务

MySQL事务管理

开启事务:BEGIN; / START TRANSACTION;

提交事务:COMMIT;

回滚事务:ROLLBACK;

MySQL默认自动提交事务

JDBC 事务管理: Connection接口中定义了3个对应的方法

开启事务: setAutoCommit(boolean autoCommit): true为自动提交事务;false为手动提交事务,即为开启事务

提交事务:commit()

回滚事务:rollback()

一般情况配合try/catch来使用

        //3.定义SQL
        String sql = "update a set score=100 where id = 4";

        //4.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        
        try {
            //开启事务
            conn.setAutoCommit(false);
            //5.执行sql
            int count = stmt.executeUpdate(sql);
            //6.处理结果
            System.out.println(count);
            //提交事务
            conn.commit();
        } catch (Exception e) {
            //回滚事务
            conn.rollback();
            e.printStackTrace();
        }

Statement

作用

执行SQL语句

int executeUpdate(sql):执行DML、DDL语句

返回值:

(1) DML语句影响的行数

(2) DDL语句执行后,执行成功也可能返回0(删除数据库后,虽然删除成功也返回0)

    //3.定义SQL
//        String sql = "update a set score=100 where id = 4";
//        String sql = "create database abc";
        String sql = "drop database abc";

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

        //5.执行sql
        int count = stmt.executeUpdate(sql);
        //6.处理结果
//        System.out.println(count);
        if (count>0){
            System.out.println("修改成功!");
        }else {
            System.out.println("修改失败!");
        }

ResultSet executeQuery(sql):执行DQL语句

返回值:ResultSet结果集对象

ResultSet 结果集对象

作用

封装了DQL查询语句的结果

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

获取查询结果

boolean next():(1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行

返回值:

true:有效行,当前行有数据.

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

xxx  getXxx(参数):获取数据

xxx:数据类型;如:int getlnt(参数) ; String getString(参数)

参数:

  • int:列的编号,从1开始.
  • String:列的名称
        //3.定义SQL
        String sql = "select * from a";

        //4.获取Statement对象
        Statement stmt = conn.createStatement();

        //5.执行sql
        ResultSet rs = stmt.executeQuery(sql);

        //6.处理结果,遍历rs中的所有数据
        //6.1光标向下移动一行,并且判断当前行是否有效数据
        while (rs.next()) {
            //6.2 获取数据
//            int id =rs.getInt(1);
//            String score  = rs.getString(2);
            int id = rs.getInt("id");
            String score = rs.getString("score");

            System.out.println(id);
            System.out.println(score);
            System.out.println("--------");
        }

输出结果

PreparedStatement

作用

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

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

sql注入示例

String pwd = "'  or '1' = '1";

 //接收用户输入的用户名密码
        String name ="zhangsan";
//        String pwd = "123";
        String pwd = "'  or '1' = '1";

        //定义sql
        String sql = "select * from user where name ='"+name+"' and pwd ='"+pwd+"'";

        //获取stmt对象
        Statement stmt = conn.createStatement();

        //执行sql
        ResultSet rs = stmt.executeQuery(sql);

使用

①获取 PreparedStatement对象

//SQL语句中的参数值,使用?占位符替代

String sql = "select * from user where username = ? and password = ?";

//通过Connection对象获取,并传入对应的sql语句

PreparedStatement pstmt = conn.prepareStatement(sql);

②设置参数值

PreparedStatement对象: setXxx(参数1,参数2):给﹖赋值

Xxx:数据类型;如setInt (参数1,参数2)

参数:

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

参数2:?的值

③执行SQL

executeUpdate(); / executeQueryo(); :不需要再传递sql

        //接收用户输入的用户名密码
        String name ="zhangsan";
//        String pwd = "123";
        String pwd = "'  or '1' = '1";

        //定义sql
        String sql = "select * from user where name = ? and pwd = ?";

        //获取pstmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);

        //设置?的值
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

        //执行sql
        ResultSet rs = pstmt.executeQuery();

        if (rs.next()){
            System.out.println("登录成功!");
        }else {
            System.out.println("登录失败");
        }

好处

1.预编译SQL,性能更高

2.防止SQL注入:将敏感字符进行转义

原理

1.在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)

2执行时就不用再进行这些步骤了,速度更快

3.如果sql模板一样,则只需要进行一次检查、编译

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

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

相关文章

C#大型医院HIS系统源码 医院信息管理系统源码 C/S架构 VS2013+sql2012

了解更多源码内容,可私信我。 开发环境:VS2013sql2012 C/S架构 一、门诊系统: 1、挂号与预约系统:实现了医院门诊部挂号处所需的各种功能,包括门诊安排的管理,号表的生成及维护,门诊预约管理和挂号处理&…

6. SSM整合

1. SSM整合配置 SM整合流程 创建工程SSM整合 Spring SpringConfig MyBatis MybatisConfigJdbcConfigjdbc.properties SpringMVC ServletContainerInitConfigSpringMvcConfig 1.1 创建工程&#xff0c;添加依赖和插件 <dependencies><dependency><groupId&g…

【LeetCode】解数独 [H](深度优先遍历)

37. 解数独 - 力扣&#xff08;LeetCode&#xff09; 一、题目 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只…

设计模式-责任链模式

一、知其然 责任链字面含义第一联想到的就是他是一个链式的行为&#xff0c;就像一个链条一样把所产生的动力传输到到齿轮上一样&#xff1b;还有类似生活中的一个游戏“击鼓传花”&#xff0c;这样说好像也是泛泛而谈&#xff0c;来看看度娘的官方概念&#xff08;摘自百度百科…

[每周一更]-(第26期):反爬虫机制

随着网站的越来越普及&#xff0c;我们开发出来的知识类网站更不希望被竞争对手爬虫&#xff0c;虽然现在网络中充斥着各种各样的蜘蛛&#xff0c;有合法的浏览器爬虫&#xff0c;以及不合法 的人为爬虫&#xff0c;所以攻防战一直都存在&#xff0c;我们只能更好的设定规则&am…

中文文本分类

手把手带你做一个文本分类实战项目(模型代码解读) https://www.bilibili.com/video/BV15Z4y1S7aR/?spm_id_from333.788.recommend_more_video.-1&vd_sourcec47fbb8166930edc486d8fdc405bf569 中文汉字对应的数字索引 之后对应的数字索引 之后找到tokn embedding的东西 1…

34. 池化层 / 汇聚层

1. 池化层 如果我们拍摄黑白之间轮廓清晰的图像X&#xff0c;并将整个图像向右移动一个像素&#xff0c;即Z[i, j] X[i, j 1]&#xff0c;则新图像Z的输出可能大不相同。而在现实中&#xff0c;随着拍摄角度的移动&#xff0c;任何物体几乎不可能发生在同一像素上。即使用三脚…

15【SpringMVC的注解开发】

文章目录二、SpringMVC注解支持2.1 回顾Servlet容器启动源码流程2.2 分析SpringMVC启动源码分析2.2.1 SpringServletContainerInitializer源码分析2.2.2 WebApplicationInitializer源码分析1&#xff09;AbstractContextLoaderInitializer2&#xff09;AbstractDispatcherServl…

短视频播放量超10w后,流量变少的问题解决方案

短视频播放量超10w后&#xff0c;流量变少的问题解决方案 上一篇我们聊了视频播放超10w后&#xff0c;会遇到流量变少的问题并分析了可能的原因&#xff0c;既然知道了原因&#xff0c;那么我们就可以针对性的去解决了。 今天给大家聊一聊在我赢助手跟超200名短视频创作者沟通…

Allegro如何设置差分动态等长规则操作指导

Allegro如何设置差分动态等长规则操作指导 Allegro上可以对差分设置动态等长规则,让差分对在任意一段距离上都是满足等长误差的,尤其是在差分对走线较长的情况下 以下面这两对线为例 具体操作如下 打开constraint Manage选择Physical规则

Linux 管理联网 设置主机名( nmtui图形化 和 hostnamectl命令 )

设置主机名 # 常用的有两种方式&#xff0c;一种是 nmtui 图形化界面的方式来设置&#xff0c; 一种是 hostnamectl 命令的方式来设置。 nmtui 直接在命令行 输入 nmtui 便进入 图形化界面 >>> 最后一选项&#xff08; 红底&#xff09; 便是 设置主机名~&#x…

微导纳米科创板上市:市值125亿 无锡首富王燕清再敲钟

雷递网 雷建平 12月23日江苏微导纳米科技股份有限公司&#xff08;简称&#xff1a;“微导纳米”&#xff0c;股票代码为&#xff1a;“688147”&#xff09;今日在科创板上市。微导纳米此次发行4544.55万股&#xff0c;发行价为24.21元&#xff0c;募资总额为11亿元。微导纳米…

react笔记_11 redux

目录redux定义使用时机redux基本概念StoreStateActionreducerredux工作原理语法[1] 创建StorecreateStorecombineReducers[2]创建并分发actiondispatchapplyMiddleware语法举例说明- 做一个加法运算执行原理redux-thunk中间件使用[3]创建reducer语法渲染过程[4]getState[5]subs…

基于meanshift算法的目标聚类和目标跟踪matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 meanshift算法其实通过名字就可以看到该算法的核心&#xff0c;mean&#xff08;均值&#xff09;&#xff0c;shift&#xff08;偏移&#xff09;&#xff0c;简单的说&#xff0c;也就是有一个…

Web前端105天-day63-HTML5_CORE

HTML5CORE03 目录 前言 一、复习 二、SVG 三、Echarts 四、Webworker 五、回调地狱 六、Promise 七、promiseajax 八、promise_axios 九、async_await 总结 前言 HTML5CORE03学习开始 一、复习 跨域 浏览器的同源策略限定: 网页中利用 AJAX 请求数据, 必须访问同源…

【CSS】flex布局用法解析,快速上手flex布局,flex:1是什么意思?肯定看的懂好吧?

一、flex布局 flex 是 flexible box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为 flex 布局。 采用 flex 布局的元素&#xff0c;称为 flex 容器&#xff08;flex container&#xff09;&#xff0c;…

如何解决跨越

解决跨域我想在坐的各位都会听说过几个解决跨域的方法&#xff1a; 1.有什么 cors后端配置&#xff08;加几个请求头 2.jsonp&#xff08;利用script的src属性&#xff09; 3.还有vue-cli前端配置。 跨域其实就是违背了浏览器的一种策略&#xff0c;这种策略就是同源策略&…

公司刚来的阿里p8,看完我构建的springboot框架,甩给我一份文档

前言&#xff1a; 我们刚开始学习 JavaWeb 的时候&#xff0c;使用 Servlet/JSP 做开发&#xff0c;一个接口搞一个 Servlet &#xff0c;很头大&#xff0c;后来我们通过隐藏域或者反射等方式&#xff0c;可以减少 Servlet 的创建&#xff0c;但是依然不方便&#xff0c;再后…

【Transformer】医学分割领域的应用与扩展(论文阅读)(二) || DETR

声明:仅学习使用~ 目录 1. Transformer学习2. DETR1. Transformer学习 前篇指路:【Transformer】医学分隔领域的应用与扩展(论文阅读)(一) 继续… 关于Self-Attention的公式: 原来是 m x m 是2D的,现在变成1 x m了,是1D的了。 下图中。左图是传统的Transformer,右…

【python圣诞树的实现】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…