连接数据库(MySQL)的JDBC

目录

  • JDBC
    • 简介
    • 快速入门
    • API详解
      • DriverManager(驱动管理类)
        • 注册驱动:
        • 获取数据库连接(对象):
      • Connection(数据库连接对象)
        • 获取执行SQL的对象
        • 管理事务
      • Statement(执行SQL语句)
        • 执行DML、DDL语句
        • 执行DQL语句
      • ResultSet(结果集对象)
        • 用Result获取查询结果
      • PreparedStatement
        • SQL注入
        • PreparedStatement使用
        • PreparedStatement原理
      • 数据库连接池
        • 数据库连接池实现
        • Druid使用步骤

JDBC

简介

概念:

  • 使用 Java 语言操作关系型数据库的一套API
  • 全称(Java DataBase Connectivity)Java 数据库连接

本质:

  • 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
  • 各个连接厂商去实现这套接口,提供数据库驱动 jar 包
  • 程序员可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类

好处:

  • 各数据库厂商使用相同的接口,Java 代码不需要针对不同的数据库分别开发
  • 可随时替换底层数据库,访问数据库的 Java 代码基本不变

快速入门

步骤:

  1. 创建工程,导入驱动 jar 包在这里插入图片描述

  2. 注册驱动::Class.forName("com.mysql.jdbc.Driver");

  3. 获取连接:Connection [conn对象名称] = DriverManager.getConnection(url, username, password);

  4. 定义SQL语句:String [sql对象名称] = "update……";

  5. 获取执行SQL对象:Statement [stmt对象名称] = conn.createStatement();

  6. 执行SQL:int i = stmt.executeUpdate(sql);

  7. 处理返回结果

  8. 释放资源

API详解

DriverManager(驱动管理类)

作用:

注册驱动:
  • registerDriver(Driver driver) #注册给指定的驱动

  • 在这里插入图片描述

  • mysql 5 之后可以省略步骤中的1(注册驱动),因为JDBC的 jar 包下的META-INF/services/java.sql.Driver 中自动记录了对应的驱动的名称

获取数据库连接(对象):
  • Connection XXX = getConnection(String url, String user, String password) #尝试建立与给定的数据库URL的连接

    上述参数:

    1.url:连接路径

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

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

    细节:

    • 如果连接的是本机mysql服务器,并且mysql服务器默认端口是3306,则url可以简写为:jdbc:mysql:数据库名称[?]参数键值对
    • 配置useSSL=false参数,禁用安全连接方式,解决警告提示,示例:jdbc:mysql://127.0.0.1:3306/db1?useSSL=false&……
    1. user:用户名
    2. password:密码

Connection(数据库连接对象)

作用:

获取执行SQL的对象
  • Statement XXX = createStatement(); #普通执行SQL对象

    PreparedStatement XXX = prepareStatement(sql); #预编译SQL的执行SQL对象,防止SQL注入

    CallableStatement XXX = prepareCall(sql); #执行存储过程的对象

管理事务
  • MySQL事务管理

    • 开启事务:BEGIN;/ START TRANSACTION;

      提交事务:COMMIT;

      回滚事务:ROLLBACK;

      MySQL默认自动提交事务

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

    • 开启事务:setAutoCommit(boolean autoCommit);其中参数为true则自动提交事务、false则手动提交事务(即为开启事务)

      提交事务:commit()

      回滚事务:rollback()

      示例:
      try{
      ​	connection.setAutoCommit(false);// 开启事务int i = stmt.executeUpdate(sql);//执行SQL
      ​	……//处理​	connection.commit();//提交事务
      } catch (Exception  throwables) {
      ​	connection.rollback();//回滚事务
      }
      

Statement(执行SQL语句)

作用:

执行DML、DDL语句
  • 语法:

    int XX = executeUpdate(sql)

  • 返回值XX:

    1. DML语句执行过后,受影响的行数
    2. DDL语句执行后,执行成功也可能返回0(删除表、库)
执行DQL语句
  • ResultSet XX = executeQuery(sql)

ResultSet(结果集对象)

作用:

ResultSet结果集封装了DQL查询语句的结果:

ResultSet XXX = statement.executeQuery(sql);#执行SQL语句,返回ResultSet对象

用Result获取查询结果
  • boolean result = ResultSet.next():

    1. 将光标从当前位置向后移动一行

    2. 判断当前行是否为有效行

    返回值:

    • true:有效行,当前行有数据
    • false:无效行,当前行没有数据
  • XXX getXXX(参数):获取数据

    XXX:数据类型;如:int getInt(参数)、String getString(参数)

    参数:

    • int:列的编号,从1开始
    • String:列的名称

示例:

//1.注册驱动(5.0之后可省略)
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接:如果连接的是本机mysql且端口默认是3306,可以简化书写
String url = "jdbc:mysql://db1?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义SQL
String sql = "select * from account";
//4.获取statement对象
Statement stmt = conn.createStatement();
//5.执行SQL
ResultSet rs = stmt.executeQuery(sql);//6.处理结果//6.1光标下移一行,并且判断当前行是否有数据
while(rs.next()) { // 列编号的写法//6.2获取数据int id = rs.getInt(1);String name = rs.getString(2);double money = rs.getDouble(3);
}while(rs.next()) {	//列名写法int id = rs.getInt("id");String name = rs.getString("name");double money = rs.getDouble("money");
}

在这里插入图片描述

PreparedStatement

SQL注入

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

String name = “heasdasd”;

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

String sql = "select * from tb_user where username = ’ " + name + " ’ and password = ’ " + pwd + ’ " ;

通过上述替换,导致最后的SQL语句变为:

select * from tb_user where username = ’ heasdasd ’ and password = ’ ’ or ‘1’ = ‘1’

由于判断是从左到右执行,那么username的false结果and上password=‘ ’的false结果最终是false,但是之后又or上1=1恒等式那么结果为真

PreparedStatement使用

作用:执行预编译SQL语句(防止SQL注入)

  1. 获取 PreparedStatement 对象

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

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

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

    PreparedStatement pstmt = conn.prepareStatement(sql);

  2. 设置参数值

    PreparedStatement对象.setXxx(参数1,参数2):给SQL语句中的 ?占位符 赋值

    Xxx:参数对应的数据类型,如Int、string等

    参数:

    • 参数1: ? 占位符 在SQL语句中的位置编号,从1开始
    • 参数2: ? 占位符 里面的值
  3. 执行SQL

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

    executeUpdate(); #执行查询语句,返回结果集

    executeQuery(); #执行更新语句,返回受影响的行数

PreparedStament是通过转义字符的形式,达到单引号不会跟我们的sql语句中的单引号进行配对

PreparedStatement原理

原理:

  1. 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进项检查、编译(这个步骤很耗时)
  2. 执行时就不用进行这些步骤了,速度更快
  3. 如果sql模板一样,则只需要进行一次检查、编译

好处:

  • 预编译SQL,性能更高
  • 防止SQL注入:将敏感字符进行转义
  1. PreparedStatemrnt预编译功能开启:

    useServerPrepStmts=true

    #加到获取连接后的参数中:

    String url = “jdbc:mysql://db1?useSSL=false&useServerPrepStmts=true”;

  2. 配置MySQL执行日志(配置文件写在my.ini文件最后,重启MySQL服务后生效)

    log-output=FILE

    general-log=1

    general_log_file=“D:mysql.log” #里面的目录需要根据实际目录进行改动

    slow-query-log=1

    slow_query_log_file=“D:\mysql_slow.log”

    long_query_time=2

数据库连接池

简介

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
  • 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

好处:

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏
数据库连接池实现

标准接口:DataSource

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

  • 功能:获取连接

    Connection getConnection()

常见的数据库连接池:

  • DBCP
  • C3P0
  • Druid

Druid(德鲁伊):

  • Druid连接池是阿里巴巴开源的数据库连接池项目
  • 功能强大,性能优秀,是Java语言最好的数据库连接池之一
Druid使用步骤
  1. 导入jar包 druid-1.1. 12.jar在这里插入图片描述

  2. 定义配置文件(项目名称.iml)在这里插入图片描述

  3. 加载配置文件

    Properties prop = new Properties();

    prop.load(new FileInputStream(“路径[jdbc-demo(模块)/src/druid.properties]”));

    #注意:路径可能会报错,问题是路径有时候需要加模块的名称

    #解决的通用方法:通过System.out.println(System.getProperty(“user.dir”));打印出这个项目的路径,通过找到模块的路径,进行拼接(即打印出的项目名称作为默认的项目名称,之后通过找到Durid的jar包的路径填入)

  4. 获取数据库连接池对象

    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

  5. 获取连接

    Connection connection = dataSource.getConnection();

注意:

在实体类中,基本数据类型建议使用其对应的包装类型(因为基本数据类型有默认的值,可能会对业务造成影响)

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

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

相关文章

轨迹预测后处理之非极大值抑制(NMS)

非极大值抑制是图像处理里面的一种算法(比如边缘检测会使用到) 轨迹预测这里借鉴了其思想,比如说对于某个场景中的某辆车,我们使用模型预测 64 条轨迹或者更多,以很好地捕获多模态性,同时每条轨迹对应一个…

JavaScript 基础、内置对象、BOM 和 DOM 常用英文单词总结

一提到编程、软件、代码。对于英语不是很熟悉的同学望而却步。其实没有想像中的难么难,反复练习加上自己的思考、总结,会形成肌肉记忆。整理一下,初学者每天30遍。 1、JavaScript 基础语法 break:中断循环或 switch 语句的执行。…

Gif动图怎么快速制作?两招教你在线做

Gif动图作为一种实用的图片格式,因为其体积小,画面丰富,所以在各大聊天软件中非常的受欢迎。小伙伴们是不是很好奇这种gif动态图片是如何制作的吧!下面,小编就给大家分享两个快速制作gif动画的小技巧!不用下…

Matlab从入门到精通课程

教程介绍 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 学习地址 链接:https://pan.baidu.com/s/1PxGarBwQusMzwPVqcE…

内网使用rustdesk进行远程协助

文章目录 前言一、搭建rustdesk中继服务器二、搭建文件下载服务器三、创建引导脚本四、使用 前言 内网没有互联网环境,没法使用互联网上有中继服务器的远程协助工具,如teamviewer、todesk、向日癸等;在内网进行远程维护可以自己搭建中继服务…

TS + Vue3 elementUI 表格列表中如何方便的标识不同类型的内容,颜色区分 enum

TS Vue3 elementUI 表格列表中如何方便的标识不同类型的内容,颜色区分 enum 本文内容为 TypeScript 一、基础知识 在展示列表的时候,列表中的某个数据可能是一个类别,比如: enum EnumOrderStatus{"未受理" 1,"…

python能做什么

python能做什么 Web开发:Python具有许多流行的Web框架,如Django和Flask,使得它成为Web开发的首选语言。它简洁、易于学习、且拥有丰富的生态系统,能够快速构建高性能的Web应用。 数据科学和机器学习:Python在数据科学…

51单片机—直流电机

1.元件介绍 2.驱动电路 3.电机调速 一般会保证一个周期的时间是一样的 应用&#xff1a; 1.LED呼吸灯 #include <REGX52.H>sbit LEDP2^0;void Delay(unsigned int t) {while(t--); } void main() {unsigned char Time,i;while(1){for(Time0;Time<100;Time){for(i0;…

【MATLAB源码-第16期】基于matlab的MSK定是同步仿真,采用gardner算法和锁相环。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 **锁相环&#xff08;PLL&#xff09;** 是一种控制系统&#xff0c;用于将一个参考信号的相位与一个输入信号的相位同步。它在许多领域中都有应用&#xff0c;如通信、无线电、音频、视频和计算机系统。锁相环通常由以下几个…

matlab和stm32的安装环境。能要求与时俱进吗,en.stm32cubeprg-win64_v2-6-0.zip下载太慢了

STM32CubeMX 6.4.0 Download STM32CubeProgrammer 2.6.0 Download 版本都更新到6.10了&#xff0c;matlab还需要6.4&#xff0c;除了st.com其他地方都没有下载的,com.cn也没有。曹 还需要那么多固件安装。matlab要求制定固件位置&#xff0c;然后从cubemx中也指定…

mac WPS 无格式粘贴

操作办法 文件–文字偏好设置–编辑–剪切和粘贴选项

基于yolov8安全帽检测的系统

基于yolov8安全帽检测的系统 项目描述&#xff1a; 安全头盔检测&#xff08;计算机视觉&#xff09; 1.自训练数据集1538张数据图片&#xff0c;进行标注&#xff0c;并进行100轮的训练&#xff0c;准确率达0.966 2.使用 Flask 和 Ultralytics YOLOv8 模型开发了一个 Web 应…

阿里CICD流水线Docker部署,将阿里镜像私仓中的镜像部署到服务器中

文章目录 阿里CICD流水线Docker部署&#xff0c;将阿里镜像私仓中的镜像部署到服务器中一、CICD流水线的初步使用可以看我之前的两篇文章二、添加部署任务&#xff0c;进行Docker部署&#xff0c;创建一个阿里的试用主机1、选择主机部署&#xff0c;并添加服务主机2、创建免费体…

Excel·VBA数组平均分组问题

看到一个帖子《excel吧-数据分组问题》&#xff0c;对一组数据分成4组&#xff0c;使每组的和值相近 上一篇文章《ExcelVBA数组分组问题》&#xff0c;解决了这个帖子问题的第1步&#xff0c;即获取所有数组分组形式的问题 接下来要获取分组和值最相近的一组&#xff0c;只需计…

鸿鹄工程项目管理系统源码:Spring Boot带来的快速开发与部署体验

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

flask_restful结合蓝图使用

在蓝图中&#xff0c;如果使用 Flask_RESTful &#xff0c; 创建 Api 对象的时候&#xff0c;传入蓝图对象即可&#xff0c;不再是传入 app 对象 /user/__init__.py from flask.blueprints import Blueprintuser_bp Blueprint(user,__name__)from user import views /user…

【已解决】vue3+ts使用Element-Plus icon图标不显示|element plus 使用 icon 图标教程

文章目录 使用Element-Plus icon图标不显示的解决方案确保已正确安装和引入Element-Plus及其图标库&#xff1a;检查是否有命名冲突&#xff1a; element plus 使用 icon 图标教程1. 安装 Element Plus2. 引入 Element Plus 和图标全局引入按需引入 3. 在组件中使用图标4. 自定…

每日必学Linux命令:mv命令

mv命令是move的缩写&#xff0c;可以用来移动文件或者将文件改名&#xff08;move (rename) files&#xff09;&#xff0c;是Linux系统下常用的命令&#xff0c;经常用来备份文件或者目录。 一&#xff0e;命令格式&#xff1a; mv [选项] 源文件或目录 目标文件或目录二&am…

elasticsearch+kibana安装部分问题:

1.elasticsearch启动问题&#xff1a; 如果elasticsearch开启https登录则第一次启动的时候需要前台启动&#xff0c;前台启动的时候会自己创建相应的token等登录信息,如果是后台启动则没有这些登录信息&#xff1a; ./elasticsearch ━━━━━━━━━━━━━━━━━━━…

ESCTF-OSINT赛题WP

这你做不出来?check ESCTF{湖北大学_嘉会园食堂} 这个识图可以发现是 淡水渔人码头 但是 osint 你要发现所有信息 聊天记录说国外 同时 提示给了美国 你综合搜索 美国 渔人码头 在美国旧金山的渔人码头&#xff08;英语&#xff1a;Fisherman’s Wharf&#xff09;是一个著名旅…