【数据库】JDBC编程

1.什么是JDBC?

  现在的应用系统大多都离不开数据库,Java程序访问数据库的基本方式是通过JDBC(Java DataBase Connectivity,Java数据库连接),Java数据库连接用于在Java程序中实现数据库操作的功能,它提供了执行SQL语句,访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口,java.sql包中包含了JDBC 操作数据库的所有类。

2.JDBC工作原理?

  JDBC为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类,真正的数据库访问操作实现是由各自数据库厂商提供的。通常把厂商提供的特定于数据库的访问API称为数据库JDBC驱动程序。
JDBC访问数据库层次结构:
在这里插入图片描述

3.JDBC使用步骤

3.1 JDBC使用流程图

在这里插入图片描述

  1. 加载数据库驱动,并将其注册到DriverManager中,一般使用反射Class.forName(String dirverName)
  2. 建立数据库连接,取得Connection对象,一般通过DriverManager.getConnection(url,username,password)方法实现,其中url表示连接数据库的字符串、username表示连接数据库的用户名,password表示连接数据库的密码
  3. 建立Statement对象或者PreparedStatement对象
  4. 执行SQL语句
  5. 访问结果集ResultSet对象
  6. 依次将ResultSet、Statement、PreparedStatement、Connection对象关闭,释放掉所占用的资源

4.JDBC常用接口和类

在Java JDBC编程中对 数据库的操作 均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的,所以掌握Java JDBC API(位于java.sql包下)即可掌握Java数据库编程。

4.1 数据库连接

获取Connection对象通常有两种方式:

  • 通过DriverManager的静态方法获取
  • 通过DataSource(数据源)对象获取

4.2 Statement对象

Statement对象主要是将SQL语句发送到数据库上
JDBC API中主要提供了三种Statement对象。
在这里插入图片描述
实际开发中最常用的是PreparedStatement对象,有以下优点:

  1. 效率更高。在使用PreparedStatement对象执行SQL命令时,命令会被数据库进行编译和解析,并放到命令缓冲区,然后,每当执行同一个PreparedStatement对象时,由于在缓冲区中可以发现预编译的命令。虽然它会被在解析一次,但不会被再次编译,可以重复使用,能够有效的提高系统的性能,因此,如果要执行插入、更新、删除等操作,最好使用PreparedStatement。
  2. 代码的可读性和维护性更好
    以下两种方法分别使用Statement与PreparedStatement来执行SQL语句
stmt.executeUpdate("insert into (col1,col2) values('val1','val2')");
perstmt = con.prepareStatement("insert into t_name(col1,col2) values(?,?)");
perstmt.setString(1,val1);
perstmt.setString(2,val2);
  1. 安全性更好。使用PreparedStatement能够预防SQL注入
    SQL注入指的是通过把SQL命令 插入到Web表单递交 或输入域名 或页面请求的查询字符串,最终达到欺骗服务器,达到恶意执行SQL命令的目的。
    但是注入只对SQL语句的编译过程有破坏作用,而执行阶段只是把输入串作为数据处理,不在需要对SQL语句进行解析,因此也就避免了类似select * from user where name ='aa' and password='bb' or 1=1的SQL注入问题的发生
    主要掌握两种执行SQL的方法:
  • executeQuery()方法执行后返回单个结果集,通常用于select
  • executeUpdate()方法返回值是一个整数,通常用于update、insert

4.3 ResultSet对象

ResultSet对象被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套get×××方法提供了对这些行中数据的访问。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指向的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

猜你喜欢

转载自blog.csdn.net/zhao_miao/article/details/89854661