JDBC-01
前言
今天学习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连接数据库的过程,在之后还有一些复杂的表操作。