连接数据库(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.mzph.cn/news/774919.shtml

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

相关文章

Sora那么牛,他的模型的成本会有多少呢?

Sora的训练需要大量的计算资源,估计需要4211-10528个 Nvidia H100 GPUs运行一个月。推理成本:一个Nvidia H100 GPU大约每小时能生成5分钟的视频。初期的Sora成本将非常高,肯定是不适合普通人来使用,所以目前OpenAI都是先找一些艺术…

STM32串口收发单字节数据原理及程序实现

线路连接: 显示屏的SCA接在B11,SCL接在B10,串口的RX连接A9,TX连接A10。 程序编写: 在上一个博客中实现了串口的发送代码,这里实现串口的接收代码,在上一个代码的基础上增加程序功能。 Seiral.…

创建AI智能体

前言 灵境矩阵是百度推出的基于文心大模型的智能体(Agent)平台,支持广大开发者根据自身行业领域、应用场景,选取不同类型的开发方式,打造大模型时代的产品能力。开发者可以通过 prompt 编排的方式低成本开发智能体&am…

VMware和Xshell连接

1.开启虚拟机 2.使用管理员账户,点击未列出 3.输入用户名密码 4.点击编辑虚拟网络编辑器 5.记住自己的网关和IP地址 6.打开终端 7.输入命令,vim / etc / sysconfig / network -scripts / ifcfg-ens33 回车 8.修改图中两处按“ I ”键进入编辑 d…

计算机组成原理-6-计算机的运算方法

6. 计算机的运算方法 文章目录 6. 计算机的运算方法6.1 机器数的表示6.1.1 无符号数和有符号数6.1.2 有符号数-原码6.1.3 有符号数-补码6.1.4 有符号数-反码6.1.5 有符号数-移码6.1.6 原码、补码、反码的比较 6.2 数的定点表示和浮点表示6.2.1 定点表示6.2.2 浮点表示6.2.3 ΔI…

C语言程序编译和链接

翻译环境和运行环境 我们程序员天天要写代码,那我们天天写的代码是什么呢?我们写的其实莫过于是一些test.c文件和test.h这样的文件。都是一些文本信息,这些如果直接交给机器去处理机器是看不懂的,就像我们和外国人语言不通一样&…

如何使用ChatGPT准备即将到来的面试How to Use ChatGPT to Prepare for an Upcoming Interview

使用ChatGPT来准备即将到来的面试可以非常有帮助,因为它可以模拟真实的面试场景并提供反馈。以下是一些步骤和提示,说明如何利用ChatGPT进行面试准备: 研究职位和公司:在与ChatGPT对话之前,先对你申请的职位和公司进行…

js算法记录

> 更多请前往 https://www.passerma.com/article/86 滑动窗口 1 给定一个矩阵,包含N*M个整数,和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数 function minSubmatrixWidth(mat…

JAVA面试大全之JVM和调休篇

目录 1、类加载机制 1.1、类加载的生命周期? 1.2、类加载器的层次? 1.3、Class.forName()和ClassLoader.loadClass()区别? 1.4、JVM有哪些类加载机制? 2、内存结构 2.1、说说JVM内存整体的结构?线程私有还是共享的? 2.2…

深入理解SSL协议:从理论到实践(二)

前言 这是一篇关于SSL协议的技术文章,有理论知识,但又兼具一定的实战性,文章的主要内容分享了SSL协议的核心概念、工作原理、常见的应用场景,以及就https这种实际应用场景,又着重分享具体的工作原理以及如何实现https…

鸿蒙HarmonyOS应用开发之使用Node-API接口创建ArkTs运行时环境

场景介绍 开发者通过pthread_create创建新线程后,可以通过napi_create_ark_runtime来创建一个新的ArkTs基础运行时环境,并通过该运行时环境加载ArkTs模块,目前仅支持在ArkTs模块中使用console接口打印日志,使用timer定时器功能。…

气体间隙的击穿强度

本篇为本科课程《高电压工程基础》的笔记。 气体间隙的击穿电压难以精确计算。工程应用中,大多参照一些典型的击穿电压试验数据来选择绝缘距离,要求较高的情况下感召实际电极布置,用实验方法来确定击穿电压。 稳态电压下的击穿 直流与工频…

SpringBoot 多数据源及事务解决方案

1. 背景 一个主库和N个应用库的数据源,并且会同时操作主库和应用库的数据,需要解决以下两个问题: 如何动态管理多个数据源以及切换? 如何保证多数据源场景下的数据一致性(事务)? 本文主要探讨这两个问题的解决方案…

全国植被类型分布数据

引言 全国植被类型分布数据利用 Landsat 卫星数据(Landsat TM,ETM和 OLI)完成了长时序的地表覆盖变化检测,并结合变化 检测结果实现了逐区域和逐期的地表覆盖动态更新,30米精细植被类型分布数据,共包含 2…

Python爬虫之爬取网页图片

当我们想要下载网页的图片时,发现网页的图片太多了,无从下手,那我们写一个脚本来爬取呗。 这次的脚本是专门针对某个外国网站使用的,因此仅供参考思路。 在测试的过程中,我发现网站使用了发爬虫机制,具体就…

FPGA工程师及其相关岗位招聘~

社区的招聘功能上线之后,许多企业都在上面发布了招聘岗位。 目前有30企业,岗位围绕FPGA工程师,涵盖嵌入式软件工程师、射频工程师、C语言开发、BMC工程师等等,入口放在这里:F学社-全球FPGA技术提升平台 登录账号后&a…

HCIP-Datacom(H12-821)题库补充(3/27)

最新 HCIP-Datacom(H12-821)完整题库请扫描上方二维码访问,持续更新中。 运行OSPF协议的路由器,所有接口必须属于同一个区域。 A:正确 B:错误 答案:B 解析:OSPF的邻居关系是基于…

Python环境下滚动轴承状态监测与故障诊断(NASA IMS轴承数据集)

智能维护系统IMS)滚动轴承数据是美国辛辛那提大学智能维护系统中心提供的全寿命周期数据,轴上安装了4个轴承。通过摩擦带将转速保持恒定在 2000r/min。包含3个数据集,每个数据集描述了一个测试到失败的实验。其中第一个实验装置的数据采集从 2003 年 10月…

鸿蒙OS开发实例:【工具类封装-emitter组件间通信】

import Emitter from ohos.events.emitter; import pasteboard from ohos.pasteboard; MyEmitterUtil 是一个针对 HarmonyOS 的事件驱动编程封装类,主要用于组件间的通信和数据传递。 使用要求: DevEco Studio 3.1.1 Release 或更高版本API 版本&…

get 请求中传递数组参数

文章目录 问题分析 问题 使用get请求传参时有参数是数组 分析 qs.stringify({ a: [b, c] }, { arrayFormat: indices }) // 输出结果:a[0]b&a[1]c qs.stringify({ a: [b, c] }, { arrayFormat: brackets }) // 输出结果:a[]b&a[]c qs.stringif…