JDBC 知识点总结篇

JDBC 知识点总结篇

JDBC 接口

Java DataBase Connectivity Java数据库连接,由官方定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商实现该套接口

代码
// 本代码只提供一个样例,请根据自己实际情况修改代码
// 1.注册驱动 mySQL
Class.forname("com.mysql.jdbc.Driver");
// 2. 获取连接对象
String url = "jdbc:mysql://127.0.0.1:3306/school?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
// 3.定义SQL 
String sql = "update stu set math = 2000 where id = 1";
// 4. 获取执行sql的对象
Statement stmt = conn.createStatement();
// 5.执行sql
int count = stmt.executeUpdate(sql);
// 6.处理结果
// 7.释放资源
// 如果开启了ResultSet,需要优先释放ResultSet资源
stmt.close();
conn.close(); 
实现步骤
  1. 创建工程,导入驱动jar包,例如:
    请添加图片描述

  2. 注册驱动

    Class.forname("com.mysql.jdbc.Driver");
    
  3. 获取连接

    // url:地址  username:用户名  password:密码
    Connection conn = DriverManager.getConnection(url, username, password);
    
  4. 定义SQL语句

    String sql = "update ...";
    
  5. 获取执行SQL对象

    Statement stmt = conn.createStatement();
    
  6. 执行SQL

    stmt.executeUpdate(sql);
    
  7. 处理返回结果

  8. 释放资源:先释放执行资源stmt,再释放conn

DriverManager(驱动管理类)

该类中都是静态方法,forname方法传参时会直接调用里面静态代码块,直接拉起MySQL数据库驱动。

小细节:在MySQL 5以后的jar包,不需要写注册驱动的方法,因为在导入的jar包中的META-INF文件夹下的services中的java.sql.Driver中加入了驱动类的名称。

作用
  1. 注册驱动
  2. 获取数据库连接
获取连接补充说明
// url:连接路径
// 语法:jdbc:mysql://ip地址(域名):端口/数据库名称?参数键值对1&参数键值对2...
// 示例:jdbc:mysql://127.0.0.1:3306/school
// 细节:如果连接的是本机mysql服务器,并且mysql服务端口默认是3306,则url可以简写为jdbc:mysql:///数据库名称?参数键值对
// 配置useSSL=false参数,禁用安全连接方式,解决警告提示
Connection 类

与特定数据库连接(会话)。执行SQL语句并在连接的上下文中返回结果。

作用
  1. 获取执行SQL的对象

    普通执行SQL对象

    Statement createStatement();
    

    预编译SQL执行SQL对象:防止SQL注入:后面进行补充

    PreparedStatement prepareStatement(sql);
    

    执行存储过程的对象

    CallableStatement prepareCall(sql);
    
  2. 管理事务

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

    // 开启事务:true为自动提交事务;false为手动提交事务,即为开启事务
    setAutoCommit(boolean autoCommit)
    // 提交事务
    commit()
    // 回滚事务
    rollback()
    
Statement 类
作用
  1. 执行SQL语句
    int executeUpdate(sql): //执行DML、DDL语句
    // 返回值:(1)DML语句影响的行数、(2)DDL语句执行后,执行成功也可能返回0
    ResultSet executeQuery(sql):  //执行SQL语句
    // 返回值:ResultSet结果集对象,ResultSet类在后详细介绍
    
ResultSet 类
ResultSet(结果集对象)作用:

封装了DQL查询语句的结果

ResultSet stmt.executeQuery(sql): //执行DQL语句,返回ResultSet对象
获取查询结果
boolean next()//(1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行
// 返回值当中存在一个光标,会进行拨动,最上面是表头,往下面走,有数据则有效
// 返回值:// true:有效行,当前行有数据// false:无效行,当前行没有数据
xxx getXxx(参数): // 获取数据// xxx:数据类型;如:int getInt(参数);String getString(参数)// 参数// int:列的编号,从1开始// String:列的名称
使用方法
/**
使用步骤:1.游标向下移动一行,并判断该行是否有数据:next()2.获取数据:getXxx(参数)
*/
// 循环判断游标游标是否是最后一行末尾
while(rs.next()){//获取数据rs.getXxx(参数);
}
PreparedStatement 类补充

在之前讲述Connection类中,我们引入了PreparedStatement 类,该类可以预防SQL注入的问题。其作用是预编译SQL并执行SQL。

SQl注入

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

select * from user where username = '"name+"' and password = '"+pwd+"';
# 假设存在了一个登录情况,我在密码中填入 'or '1' = '1 ,这个时候无论用户名是什么,我都将登录系统
预防SQL注入
  1. 获取PrearedStatement对象

    // SQL语句中的参数值,使用?占位符替代
    String sql = "select * from user where username=? and password =?";// 通过Connection对象获取,并传入对应的sql语句
    PreparedStatement pstmt = conn.prepareStatement(sql);
    
  2. 设置参数值

    PreparedStatement对象:setXxx(参数1,参数2):给?赋值
    Xxx:数据类型;  如setInt(参数1,参数2)
    参数:参数1:?的位置编号,从1开始参数2:?的值
    
  3. 执行SQL

    executeUpdate();/executeQuery(); //不需要再传递sql
    
优势
  1. 预编译SQL,性能更高

    • PreparedStatement预编译功能开启:useServerPrepStmts=True 默认关闭状态

    • 配置MySQL执行日志(重启mysql服务后生效)

      log-output=FILE
      general-log=1
      general_log_fil e="D:\mysql.log"
      slow-query-log=1
      slow_query_log_file="D:\mysql_slow.log"
      long_query_time=2
      
    • 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译

    • 执行时就不用再进行这些步骤,速度得以加快

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

  2. 放置SQL注入:将敏感字符进行转义

    // 通过'\'的方式转义字符
    or 1 = 1
    <=> '\' or \'1\' = \'1'
    
数据库连接池

与大名鼎鼎的线程池相类似,数据库连接池是一个放置计算资源的池子(容器),负责分配、管理数据库连接(Connection)

优势
  • 资源重用:不需要反复创建和关闭数据库连接,允许应用程序重复使用现有的数据库连接

  • 提升系统的响应速度

  • 避免数据连接遗漏:释放超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

    请添加图片描述

数据库连接池实现

标准接口: DataSource

  • 官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。

  • 功能:获取连接

    Connection getConnection()
    
  • 常见的数据库连接池

    • DBCP
    • C3P0
    • Druid(德鲁伊)
      • Druid连接池是阿里巴巴开源的数据库连接池项目
      • 功能强大,性能优秀,最好的数据库连接池之一
Druid使用步骤
  • 导入jar包 druid-1.1.12.jar

  • 定义配置文件

    # ../src/druid.properties
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///school?useSSL=false&useServerPrepStmts=true
    username=root
    password=1234
    #初始化连接数量
    initialSize=5
    #最大连接数
    maxActive=10
    #最大等待时间
    maxWait=3000
    
  • 加载配置文件

    //根据下一个步骤所使用的资源来决定方法
    Properties prop new Properties();
    prop.Load(new FileInputstream("src/druid.properties"));
    
  • 获取数据库连接池对象

    DataSource dataSource DruidDataSourceFactory.createDataSource(prop);
    
  • 获取连接

    Connection connection dataSource.getConnection();
    
写代码小技巧(IDEA)

Alt + 鼠标左键: 整列编辑

写数据库代码时,尽量使用Integer: int会带上初始值为0,因此建议使用数据包装类型

如果觉得有帮助,请帮我点个赞或者收藏,感谢~

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

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

相关文章

MyBatis笔记

Mybatis Mybatis介绍 什么是Mybatis? mybatis是支持普通SQL查询、存储过程和高级映射的优秀持久层框架。 Mybatis优点 几乎消除了JDBC代码和参数的手动设置消除结果集的检索使用XML或注解用于配置和原始映射&#xff0c;将接口和POJOs(实体类)映射成数据库中的记录。 My…

vue微乾坤子应用开发及ele组件开发时问题记录

一. 微乾坤 1. 新增page页面路由,pmi权限中心配置正常&#xff0c;跳转链接正确&#xff0c;但路由未找到403. 解决&#xff1a; 新增的配置是page类型&#xff0c;transformQianKunRoute方法转换微前端路由数据 时&#xff0c;过滤未兼容page型的路由&#xff0c; 解决 [menu,…

react中使用redux最简单最方便的方式,配合rematch简化操作,5分钟学会

react中使用状态管理的方式也很多&#xff0c;比如redux和mobx等&#xff0c;今天这一片就讲一下redux的入门到熟练使用&#xff0c;主要是要理解它redux的组成有哪些&#xff0c;到怎么创建&#xff0c;和组建中怎么使用三个问题。这里先放上官网文档&#xff0c;不理解的地方…

十一.约束(二)

约束 5.自增列:AUTO_INCREMENT5.1作用5.2关键字5.3特点和要求5.4如何指定自增约束5.5如何删除自增列5.6MySQL8.0新特性——自增变量的持久化 6.FOREIGN KEY 约束6.1作用6.2关键字6.3主表和从表/父表和子表6.4特点6.5添加外键约束6.6演示问题6.7约束等级6.8删除外键约束6.9开发场…

鸿蒙开发者工具安装及入门程序

下载工具DevEco Studio IDE 官网下载&#xff1a;HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 开发工具的安装 解压下载好的压缩包&#xff0c;一路无脑安装即可&#xff0c;安装完的使用方法类似于IDEA、WebStorm的使用&#xff0c;快捷键一致&#xff0c;默认黑…

【笔记】Spring的循环依赖

Spring的循环依赖 ObjectFactory:函数式接口&#xff0c;可以将lambda表达式作为参数放在方法的实参种&#xff0c;在方法执行的时候&#xff0c;并不会实际的调用当前lambda表达式&#xff0c;只有在调用getObject方法的时候才回去调用lambda表达式 为什么spring要用三级缓存…

常用的百兆网络变压器与RJ45网口的参考连接电路有哪些,主要注意事项在哪里呢?

Hqst华轩盛(石门盈盛)电子导读&#xff1a;一起来了解常用的百兆网络变压器与RJ45网口的参考连接电路有哪些&#xff0c;主要注意事项在哪里呢&#xff1f; 第一,常用的百兆网络变压器与RJ45网口的参考连接电路 常用百兆网络变压器与网口连接器分开为独立电子元件的分离式参考电…

TrustZone之与非安全虚拟化交互

到目前为止&#xff0c;我们在示例中忽略了非安全状态中可能存在的虚拟化程序。当存在虚拟化程序时&#xff0c;虚拟机与安全状态之间的许多通信将通过虚拟化程序进行。 例如&#xff0c;在虚拟化环境中&#xff0c;SMC用于访问固件功能和可信服务。固件功能包括诸如电源管理之…

Ubuntu 常用命令之 top 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 top命令是Linux下常用的性能分析工具&#xff0c;可以实时动态地查看系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。它可以显示系统总的和分区的CPU使用率、内存使用率、交换区使用率、系统负载、进程数、…

MFC静态链接+libtiff静态链接提示LNK2005和LNK4098

编译报错 1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_infoAAEABV0Z) 已经在 libcmtd.lib(typinfo.obj) 中定义 1>msvcrt.lib(ti_inst.obj) : error LNK2005: "pr…

BUUCTF-Linux Labs

Linux Labs 根据题目给出的内容&#xff0c;在kali中连接靶机&#xff0c;输入密码进入命令行模式 ls发现什么都没有&#xff0c;有可能进入到了一个空文件夹 cd .. 切换到上一层目录&#xff0c;ls查看此目录下的内容&#xff0c;发现flag.txt文件&#xff0c;查看文件是flag …

超维空间S2无人机使用说明书——32、使用yolov7进行目标识别

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov7进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;也有更高版本的yolov8。 简介&#xff0c;为了提高识别速度&#xff0c;系…

w15初识php基础

一、计算100之内的偶数之和 实现思路 所有的偶数除2都为0 代码实现 <?php # 记录100以内的偶数和 $number1; $num0; while($number<100){if($number%20){ $num$number;}$number1; } echo $num; ?>输出的结果 二、计算100之内的奇数之和 实现思路 所有的奇数除…

HTML+CSS做一个时尚柿子造型计时器

文章目录 💕效果展示💕代码展示HTMLJS💕效果展示 💕代码展示 HTML <!DOCTYPE html> <html lang

使用低代码工具构建电商平台:简化开发流程,加速应用搭建

在数字化时代&#xff0c;电商平台成为了各类企业的重要组成部分。然而&#xff0c;传统的软件开发过程往往漫长而复杂&#xff0c;需要大量的编码和调试工作。随着低代码工具的出现&#xff0c;开发者可以通过简化的方式来搭建电商平台应用&#xff0c;从而更快速地满足业务需…

surface pro重置win10后没微软账号如何登录

Surface pro官方镜像恢复详细图文步骤-CSDN博客 如果不懂重置系统请看上面的链接 win10-win11都开始默认要求输入微软账号才能使用。但依然有入口可以给没微软账号的用户使用的 第一步&#xff0c;重置后会要求连互联网&#xff0c;这一步要自己找个网络连接上&#xff0c;不…

十大经典排序算法(个人总结C语言版)

文章目录 一、前言二、对比1.排序算法相关概念1.1 时间复杂度1.2 空间复杂度1.3 排序方式1.4 稳定度 2.表格比较3.算法推荐3.1 小规模数据3.2 中等规模数据3.3 大规模数据3.4 特殊需求 三、排序算法1.冒泡排序&#xff08;Bubble Sort&#xff09;1.1 简介1.2 示例代码&#xf…

智能酒精壁炉在户外装饰中展现的独特魅力

智能酒精壁炉&#xff0c;一种独特的户外装饰和实用性产品&#xff0c;以其独有的魅力在户外场景中迅速赢得了人们的喜爱和欢迎。 在露营时&#xff0c;智能酒精壁炉由于便携性&#xff0c;可以很轻松地携带到露营地点。并且无需外接电源或气体&#xff0c;为露营者提供了简单而…

swing快速入门(二十五)

注释很详细&#xff0c;直接上代码 新增内容 1.ImageIO.write读取并显示图片 2.ImageIO.writeImageIO.write读取并保存图片 package swing21_30;import javax.imageio.ImageIO; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent…

使用web_video_server进行网页段的视频传输

引言&#xff1a;在项目中&#xff0c;需要实现无人机摄像头采集到的图像回传到window下进行查看&#xff0c;为此&#xff0c;选择使用web_video_server功能包实现局域网下的图像传输 硬件环境&#xff1a; 硬件&#xff1a;Jetson orin nano 8G D435摄像头 环境&#xff…