连接数据库(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();

注意:

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

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

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

相关文章

ArcGIS矢量裁剪矢量

一、利用相交工具 Arctoolbox工具一分析工具一叠加分析一相交

深度|庖丁解InnoDB之Buffer Pool

以下文章来源于MySQL内核剖析 ,作者王康 前言 Buffer Pool是InnoDB中非常重要的组成部分,也是数据库用户最关心的组件之一。Buffer Pool的基本功能并不复杂,设计实现也比较清晰,但作为一个有几十年历史的工业级数据库产品&am…

那位拿了多个Offer的大佬分享了最新Go面经

和大家分享一下我们 Go就业训练营 和 升职加薪星球 中战友们投稿的真实面经。 这是第一篇,计划还会再更新4篇最新Go面经,都是拿到Offer的那种! 欢迎大家关注我的账号,关注之后不迷路。 先秀战绩 虽然不同的公司考察的侧重点不一…

Linux系统服务

文章目录 什么是daemon与服务(service)systemd使用unit分类 通过systemctl管理服务通过systemctl管理单一服务(service unit)通过systemctl查看系统上所有的服务通过systemctl管理不同的操作环境(target unit)通过systemctl分析各服务之间的依赖性与systemd的daemon运行过程相关…

Codeforces Round 930 (Div. 2) --- D. Pinball --- 题解

目录 D. Pinball&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; 代码一&#xff1a; 代码二&#xff1a; D. Pinball&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 假设字符串为 >>><<<&#xff0c; 当前位…

程序员35岁会失业吗?【来自主流AI的回答】

程序员35岁会失业吗&#xff1f; 35岁被认为是程序员职业生涯的分水岭&#xff0c;许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长&#xff0c;技术更新换代的速度会使得资深程序员难以跟上&#xff1b;而另一些人则认为&#xff0c;丰富的经…

STM32CubeIDE基础学习-USART串口通信实验(轮询方式)

STM32CubeIDE基础学习-USART串口通信实验&#xff08;轮询方式&#xff09; 文章目录 STM32CubeIDE基础学习-USART串口通信实验&#xff08;轮询方式&#xff09;前言第1章 硬件介绍第2章 工程配置2.1 工程外设配置部分2.2 生成工程代码部分 第3章 代码编写3.1 串口发送3.1.1 发…

SqlServer期末复习(数据库原理及应用)持续更新中

一、SQL语句 1.1 SQL语句知识引入 1.DDL语言(数据定义语言&#xff09;主要是进行定义/改变表的结构、数据类型、表之间的链接等操作&#xff0c;关键字CREATE、DROP、ALTER CREATE TABLE 表面( 列名1 数据类型&#xff0c; 列名2 数据类型&#xff0c; ) ALTER TABLE 表名&a…

[计算机效率] 文件查重工具:Vistanita Duplicate Finder

3.6 文件查重工具&#xff1a;Vistanita Duplicate Finder Vistanita Duplicate Finder 是一款强大的文件查重工具&#xff0c;可以帮助用户快速查找并删除重复的文件&#xff0c;节省存储空间并提高文件管理效率。该软件支持多种文件类型&#xff0c;包括图片、文档、音频、视…

el-table 表格中插入表单循环校验

<template><div>{{form}}<el-form :model"form" ref"form"><el-form-item label"呃呃呃呃呃呃呃"><el-table :data"tableData" border><el-table-column prop"time" label"日期"…

cookie、localStorage、sessionStorage 详解

目录 cookie 是什么&#xff1f; cookie 不可以跨域请求 cookie 的属性 会话cookie & 永久性cookie cookie 禁用 cookie 的应用 sessionStorage 是什么&#xff1f; 失效时间 存储内容的类型 存储的大小 存储的位置 sessionStorage 的应用 localStorage 是什么…

Linux内核架构和基础概念

文章目录 前言 一、简述操作系统 二、宏内核和微内核 1.宏内核 2.微内核 3.Linux内核的特点 三&#xff0c;Linux内核架构 1.整体架构图 2.Linux子系统的划分 3.Linux子系统之间的关系 4.Linux内核目录介绍 总结 前言 随着Linux内核在全球市场份额的持续扩大&#xff0c;其影…

使用WebClient发起网络请求

目录 1、导入对应的pom 2、编写WebClientUtil请求工具类 3、使用WebClientUtil发起请求 使用WebClient的优点&#xff1a;支持lambdas 的函数&#xff1b;支持更高的并发性和更少的硬件资源&#xff1b;支持同步和异步&#xff1b;支持流式传输。具体的使用方式如下&#xff1a…

Redis 特性,为什么要用Redis,Redis到底是多线程还是单线程

一、Redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的&#xff0c;使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 二、特性(为什么要用Redis&#x…

51单片机入门:定时器与中断系统

定时器的介绍 定时器&#xff1a;51单片机的定时器属于单片机的内部资源&#xff0c;其电路的设计连接和运转均在单片机内部完成。根据单片机内部的时钟或者外部的脉冲信号对寄存器中的数据加1&#xff0c;定时器实质就是加1计数器。因为又可以定时又可以计数&#xff0c;又称…

数据结构——排序之冒泡排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

HarmonyOS入门笔记1配置环境

文章目录 下载安装DevEco Studio配置环境先认识DevEco Studio界面工程目录工程级目录模块级目录 app.json5module.json5main_pages.json通知栏预览区 运行模拟器 下载安装DevEco Studio 去官网下载DevEco Studio完了安装 配置环境 打开已安装的DevEco Studio快捷方式进入配置…

Python爬虫:爬虫基本概念、流程及https协议

本文目录&#xff1a; 一、爬虫的基本概念1.为什么要学习爬虫1.1 数据的来源1.2 爬取到的数据用途 2.什么是爬虫3. 爬虫的更多用途 二、爬虫的分类和爬虫的流程1.爬虫的分类2.爬虫的流程3.robots协议 三、爬虫http和https1.http和https的概念2.浏览器发送HTTP请求的过,2.1 http…

【数据结构刷题专题】—— 二分查找

二分查找 二分查找模板题&#xff1a;704. 二分查找 二分查找前提&#xff1a; 有序数组数组中无重复元素 左闭右闭&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while (left <…

An Experimental Study of State-of-the-Art Entity Alignment Approaches论文阅读

最先进的实体对齐方法的实验研究综述 Title: An Experimental Study of State-of-the-Art Entity Alignment Approaches 日期: 2022 发表单位: IEEE github: https://github.com/DexterZeng/EAE 原文地址: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9174835 概括…