JDBC-01

6 篇文章 1 订阅
4 篇文章 0 订阅


前言

今天学习mysql数据库的jdbc(有必要整理下),java连接数据库操作,感觉有许多的东西需要记忆就准备写这样的一系列jdbc防止后期忘记


一、JDBC简介

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。
JDBC可以在各种平台上使用Java,如Windows,Mac OS和各种版本的UNIX。
JDBC库包括通常与数据库使用相关的下面提到的每个任务的API。

  • 连接数据库。
  • 创建SQL或MySQL语句。
  • 在数据库中执行SQL或MySQL查询。
  • 查看和修改生成的记录。

二、jdbc的核心组件

  • DriverManager: 此类管理数据库驱动程序列表。使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配
  • Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使用DriverManager对象来管理这种类型的对象。
  • Connection:该界面具有用于联系数据库的所有方法。连接对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。
  • Statement:使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。
  • ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据。
  • SQLException:此类处理数据库应用程序中发生的任何错误

三、jdbc使用步骤

构建JDBC应用程序涉及以下六个步骤:

  • 导入包:需要包含包含数据库编程所需的JDBC类的包。大多数情况下,使用import java.sql.*就足够了。
  • 注册JDBC驱动程序:要求您初始化驱动程序,以便您可以打开与数据库的通信通道。
  • 打开连接:需要使用DriverManager.getConnection()方法创建一个Connection对象,该对象表
    示与数据库的物理连接。
  • 执行查询:需要使用类型为Statement的对象来构建和提交SQL语句到数据库。
  • 从结果集中提取数据:需要使用相应的ResultSet.getXXX()方法从结果集中检索数据。
  • 释放资源:需要明确地关闭所有数据库资源,而不依赖于JVM的垃圾收集

四、jdbc连接步骤

1、加载驱动

代码如下:

 Class.forName("com.mysql.cj.jdbc.Driver");

2、获得连接

  • 在这里我们将数据库用户名以及密码定义为String后面可以直接用,在DriverManager.getConnection用也可以
  • url对于不同的数据库以及数据库版本有不同的
  • 代码如下:
String userName = "root";
String passWord = "123";
String url = "jdbc:mysql://localhost:3306/wode?serverTimezone=UTC";
Connection connection = DriverManager.getConnection(url, userName, passWord);

3、定义SQL创建状态通道

  • 1.这里我们先使用Statement来创建状态通道(用来传递SQL语句)
 Statement statement = conn.createStatement();
  • 2.在后面考虑到SQL注入的问题运用了
String sql = "select *from stu";
PreparedStatement preparedStatement = connection.prepareStatement(sql);

sql注入:

就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。

代码如下:

String username ="admin";
String password=" 'abc' or 1=1 ";
String sql="select * from users where username= '"+username+"' and password=
"+password;
这里使用了Statement与PreparedStatement

Statement

  • 创建语句对象
    在使用Statement对象执行SQL语句之前,需要使用Connection对象的createStatement()方法创建一个,如下例所示:
    创建Statement对象后,您可以使用它来执行一个SQL语句,其中有三个执行方法之一。
  • boolean execute(String SQL):如果可以检索到ResultSet对象,则返回一个布尔值true; 否则返回false。使用此方法执行SQL DDL语句或需要使用真正的动态SQL时。
  • int executeUpdate(String SQL):返回受SQL语句执行影响的行数。使用此方法执行预期会影响多个行的SQL语句,例如INSERT,UPDATE或DELETE语句。
  • ResultSet executeQuery(String SQL):返回一个ResultSet对象。当您希望获得结果集时,请使用此方法,就像使用SELECT语句一样。
    关闭Statement对象
    就像我们关闭一个Connection对象以保存数据库资源一样,由于同样的原因,还应该关闭Statement对象。
    一个简单的调用close()方法将执行该作业。如果先关闭Connection对象,它也会关闭Statement对象。但是,应始终显式关闭Statement对象,以确保正确清理。

PreparedStatemen

  • 该PreparedStatement的接口扩展了Statement接口,它为您提供了一个通用的Statement对象有两个优点附加功能。
  • 1、此语句使您可以动态地提供参数。 JDBC中的所有参数都由?符号,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。所述的setXXX()方法将值绑定到所述参数,其中XXX代表要绑定到输入参数的值的Java数据类型。如果
    忘记提供值,将收到一个SQLException。
  • 2、每个参数标记由其顺序位置引用。第一个标记表示位置1,下一个位置2等等。该方法与Java数组索引不同,从0开始。
    就像关闭Statement对象一样,由于同样的原因,还应该关闭PreparedStatement对象。

对比statement和PreparedStatement

(1)statement属于状态通道,PreparedStatement属于预状态通道
(2)预状态通道会先编译sql语句,再去执行,比statement执行效率高
(3)预状态通道支持占位符?,给占位符赋值的时候,位置从1开始
(4)预状态通道可以防止sql注入,原因:预状态通道在处理值的时候以字符串的方式处理

4、生成结果集(resultSet)(executeQuery())

  • SELECT语句是从数据库中选择行并在结果集中查看行的标准方法。该java.sql.ResultSet中的接口表示结果集数据库查询。
  • ResultSet对象维护指向结果集中当前行的游标。术语“结果集”是指包含在ResultSet对象中的行和列数据
    下面是获得结果集的代码:
ResultSet resultSet = statement.executeQuery();//获得上面statement的SQL查询的结果集
ResultSet resultSet = preparedstatement.executeQuery();//获得上面preparedstatement的SQL查询的结果集

4.1、返回影响行数(对应的是SQL中的dml语句)(executeUpdate)

  • int executeUpdate(String SQL):返回受SQL语句执行影响的行数。使用此方法执行预期会影响多个行的SQL语句,例如INSERT,UPDATE或DELETE语句。
    代码如下:
int hu = statement.executeUpdate("insert into stu values ('S_1023','詹姆斯',36,'male')");//executeUpdate 用作数据查询sql

5、取出结果集(对应上面的4步骤)

  • 判断遍历
  • resultSet.next() 判断是否存在下一条数据
    代码如下:
while (resultSet.next()) {//resultSet.next() 判断是否存在下一条数据
       System.out.println("姓名:" + resultSet.getString("sname") + ",年龄:" + resultSet.getInt("age"));}

5.1、判断是否dml成功(对应上面的4.1步骤)

代码如下:

if (hu > 0) {
                System.out.println("执行成功!");
            } else {
                System.out.println("执行失败!");
            }

6、关闭对象(connection,statement,resultSet)

代码如下:

if (connection != null) {
    connection.close();
    }
if (preparedStatement != null) {
    preparedStatement.close();
                }
if (resultSet != null) {
    resultSet.close();
                }

总结

以上就完成了jdbc连接数据库的过程,在之后还有一些复杂的表操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值