连接数据库(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.hqwc.cn/news/572459.html

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

相关文章

BaseDao封装JavaWeb的增删改查

目录 什么是BaseDao? 为什么需要BaseDao? BaseDao的实现逻辑 什么是BaseDao? Basedao 是一种基于数据访问对象(Data Access Object)模式的设计方法。它是一个用于处理数据库操作的基础类,负责封装数据库…

深度学习目标检测算法之RetinaNet算法

文章目录 前言RetinaNet 算法原理1.RetinaNet 简介2.backbone 部分3.FPN特征金字塔4.分类和预测5.Focal Loss 结束语 💂 个人主页:风间琉璃🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注…

代码学习记录29----贪心算法

随想录日记part29 t i m e : time: time: 2024.03.27 主要内容:今天深入学习贪心算法,接下来是针对题目的讲解:1. 无重叠区间 2.划分字母区间 3. 合并区间 435. 无重叠区间763.划分字母区间56. 合并区间 T…

堆排序基础知识

堆排序基础知识 一、引言二、堆的基本概念三、堆排序的基本思想四、堆排序的详细过程五、堆排序的性能分析六、堆排序的应用七、堆排序的优缺点八、堆排序的实现技巧九、总结与展望 一、引言 堆排序是一种有效的排序算法,它的核心在于使用了一种称为“堆”的数据结…

计算机组成原理-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…

Day20:LeedCode 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …

Manacher算法学习笔记(洛谷题单 Part 5.3 Manacher)

0.随便说说 字符串学的太差了,每次字符串算法都是学完了就忘,正好上场 c f d i v 1 B cfdiv1B cfdiv1B考了一个 M a n a c h e r Manacher Manacher,就先复习它了。 1.一些概念 子串 ( s u b s t r i n g ) (substring) (substring)&#…

dump文件分析OOM及线程堆栈

OutOfMemoryError (OOM) 如果项目报错: OutOfMemoryError: Java heap space,说明堆内存空间(Heap Space)中没有足够的空间来分配对象了。 一旦发生 OOM,系统有可能不可用,或者频繁重启。属于非常严重的问题…

kubernetes负载均衡资源-Ingress

一、Ingress概念 1.1 Ingress概念 使用NodePort类型的Service可以将集群内部服务暴露给集群外部客广端,但使用这种类型Service存在如下几个问题。 1、一个端口只能一个服务使用,所有通过NodePort暴露的端口都需要提前规划;2、如果通过NodePort暴露端口过多,后期维护成本太…

语法回顾-《Verilog编程艺术》之数据类型

目录 线网(net) 变量(variable) 线网和变量的区别 向量 数组 参考《Verilog 编程艺术》魏家明著 线网(net) 用于表示结构体(如逻辑门)之间的连接。除了 trireg 之外&#xff…

基于单片机病房温度监测与呼叫系统设计

**单片机设计介绍,基于单片机病房温度监测与呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机病房温度监测与呼叫系统设计概要主要涵盖了通过单片机技术实现病房温度的实时监测以及病人呼叫功能…

【启发式算法】同核分子优化算法 Homonuclear Molecules Optimization HMO算法【Matlab代码#70】

文章目录 【获取资源请见文章第4节:资源获取】1. 算法简介2. 部分代码展示3. 仿真结果展示4. 资源获取 【获取资源请见文章第4节:资源获取】 1. 算法简介 同核分子优化算法(Homonuclear Molecules Optimization,HMO)是…