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,因此建议使用数据包装类型

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 NFTScan NFT API 在 Base 网络上开发 Web3 应用

Base 是 Coinbase 使用 OP Stack 开发的最新以太坊第 2 层&#xff08;L2&#xff09;网络&#xff0c;用于解决以太坊等主要区块链面临的可扩展性和成本挑战。Coinbase 将其描述为“安全、低成本、对开发人员友好的以太坊 L2&#xff0c;旨在将下一个 10 亿用户带入 Web3”。B…

一个简化版的IPD产品开发各阶段的流程

IPD好不好&#xff1f;当然好&#xff01;IPD适不适合我们行业&#xff1f;当然适合&#xff0c;可以说&#xff0c;任何一个行业都可以借鉴IPD的理念和实践提高产品开发的效率&#xff0c;提升客户满意度。IPD复不复杂&#xff1f;当然复杂&#xff01; 关于IPD的框架和体系&…

【Linux基础开发工具】gcc/g++使用make/Makefile

目录 前言 gcc/g的使用 1. 语言的发展 1.1 语言和编译器自举的过程 1.2 程序翻译的过程&#xff1a; 2. 动静态库的理解 Linux项目自动化构建工具-make/makefile 1. 快速上手使用 2. makefile/make执行顺序的理解 前言 了解完vim编辑器的使用&#xff0c;接下来就可以尝…

Java程序员-你真的了解死锁吗

Java程序员-你真的了解死锁吗 ​ &#x1f495;"i need your breath"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容:死锁的成因和必要条件 ​​ ​​​​​ 一.什么是死锁 死锁&#xff1a;就是多个线程/进程因为相互等待而使得各自持有的资源无法继续执行&am…

❀My学习Linux小记录之UID和GID(用户ID和组ID)❀

❀My学习Linux小记录之UID和GID&#xff08;用户ID和组ID&#xff09;❀ 目录 ❀My学习Linux小记录之UID和GID&#xff08;用户ID和组ID&#xff09;❀ 用户ID&#xff08;UID&#xff09; 组ID&#xff08;GID&#xff09; 登陆 Linux 系统时&#xff0c;虽然输入的是自己…

Iceberg:ZOrder的实现及执行流程分析

ZOrder简介 使用Z-Order索引&#xff0c;可以按任意维度对数据进行排序&#xff0c;以获得更加高效且均衡地范围查询。它即可以作为一级索引&#xff0c;直接影响底层数据组织形式&#xff0c;甚至可以取代二索引&#xff08;更加节省内存&#xff0c;吞吐量也理更高&#xff…

调度工具之dolphinscheduler篇

前言 随着开发程序的增多&#xff0c;任务调度以及任务之间的依赖关系管理就成为一个比较头疼的问题&#xff0c;随时少量的任务可以用linux系统自带的crontab加以定时进行&#xff0c;但缺点也很明细&#xff0c;不够直观&#xff0c;以及修改起来比较麻烦&#xff0c;容易出…

【MybatisPlus快速入门】(3)SpringBoot整合MybatisPlus 之 Lombok插件安装及MybatisPlus分页代码示例

目录 1.Lombok1.1 步骤1:添加lombok依赖 2.2 步骤2:安装Lombok的插件1.3 步骤3:模型类上添加注解2 分页功能2.1 步骤1:调用方法传入参数获取返回值2.2步骤2:设置分页拦截器2.3 步骤3:运行测试程序 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介&#xff0c;在这一节…

07-JVM调优工具详解及调优实战

文章目录 前置启动程序Jmap堆信息堆内存dump Jstack远程连接jvisualvm启动普通的jar程序JMX端口配置tomcat的JMX配置 jstack找出占用cpu最高的线程堆栈信息 JinfoJstat垃圾回收统计堆内存统计新生代垃圾回收统计新生代内存统计老年代垃圾回收统计老年代内存统计元数据空间统计J…

【MySQL】MySQL的数据类型

MySQL的数据类型 一、数据类型分类二、数值类型1、整数类型2、bit类型3、小数类型 三、字符串类型四、时间日期类型五、enum和set类型enum和set查找 数据类型的作用&#xff1a; 决定了存储数据时应该开辟的空间大小和数据的取值范围。决定了如何识别一个特定的二进制序列。 …

MySQL子查询、WITH AS、LAG查询统计数据实战

需求 给出一个比较常见的统计类业务需求&#xff1a;统计App&#xff08;包括iOS和Android两大类&#xff09;每日新注册用户数、以及累计注册用户数。 数据库采用MySQL&#xff0c;根据上面的需求&#xff0c;不难设计表如下&#xff1a; create table os_day_count(stat_d…

原型链污染[JavaScript]

一、原型链污染 此类型一般存在以nodejs编写的后端程序当中&#xff0c;其中Express是一个流行的Node.js Web应用程序框架 1.JavaScript 1.1 原理 引入 解释&#xff1a;直接先读代码来理解原型链污染 // let jack {b:2} console.log(typeof jack) // 它的类型是obejct con…

一文掌握分布式锁:Mysql/Redis/Zookeeper实现

目录 一、项目准备spring项目数据库 二、传统锁演示超卖现象使用JVM锁解决超卖解决方案JVM失效场景 使用一个SQL解决超卖使用mysql悲观锁解决超卖使用mysql乐观锁解决超卖四种锁比较Redis乐观锁集成Redis超卖现象redis乐观锁解决超卖 三、分布式锁概述四、Redis分布式锁实现方案…

React 中的 ref 和 refs:解锁更多可能性(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

安卓13上手势导航失效、手机卡死问题

问题描述&#xff1a;打开我们开发的app后&#xff0c;手势导航无法退回、无法回到桌面、无法切换应用。 使用设备&#xff1a;小米手机、MI14,、安卓13 未适配安卓13安卓x的情况下&#xff0c;检查自己的 AndroidManifest 文件&#xff0c;过滤器是否设置了 <category a…

信息安全等级保护的定义与意义

目录 前言 信息安全等级保护定义 广义上 狭义上 技术和管理 信息安全的基本要素 信息安全等级保护的意义 当前形式 形式严峻 国家安全 三个基本一个根本 预期目标 最终效果 实际意义 前言 信息安全等级保护是对信息和信息载体按照重要性等级分级进行保护的一种…

HTML5+CSS3+Vue小实例:彩带圣诞树

实例:彩带圣诞树 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><…

【水文专业词汇】气象水文、水利工程等

水文专业词汇&#xff1a;气象水文、水利工程等 气象水文类水循环过程地区分类 水利工程类跨流域调水工程 参考 气象水文类 水循环过程 中文英文降水/降雨precipitation/rainfall径流runoff/streamflow产汇流runoff generation 地区分类 中文英文雨养作物区rain-fed agricu…

git入门指南:新手快速上手git(Linux环境如何使用git)

目录 前言 1. 什么是git&#xff1f; 2. git版本控制器 3. git在Linux中的使用 安装git 4. git三板斧 第一招&#xff1a;add 第二招&#xff1a;commit 第三招&#xff1a;push 5. 执行状态 6. 删除 总结 前言 Linux的基本开发工具介绍完毕&#xff0c;接下来介绍一…

游戏开发公司需要具备哪些能力?

中懿游游戏软件开发,游戏开发行业的竞争日益激烈&#xff0c;成功的游戏开发公司需要具备多方面的能力&#xff0c;从技术创新到市场推广&#xff0c;再到团队协作。以下是构建成功游戏开发公司所需的关键能力概览&#xff1a; 1. 游戏开发技术&#xff1a; 在技术方面&#…