JAVA / MySql 编程——第七章 JDBC

时间:2021-05-05 21:20:12

1、JDBC:JDBA是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力;

        Java是通过JDBC技术实现对各种数据库访问的,

   ●JDBA是Java数据库连接(Java DataBase Connectivity)技术的简称,他充当了Java应用程序与各种不同数据库之间进行对话的媒介。

    他可以把数据持久性保存,这就是一种持久化机制。持久化:持久化是将程序中的数据在瞬时状态和持久状态见转换的机制。

2、工作原理:

JDBC API:JDBC API由Sun公司提供,其中提供了Java应用程序与各种不同数据库交互的标准解救,

如Connection(连接)接口、Statement接口、ResultSet(结果集)接口、PrepardStatement接口等。

开发者使用这些JDBC接口进行各类数据库操作。

JDBC Driver Manager:JDBC Driver Manager(驱动程序管理)有Sun公司提供,他是JDBC体系结构的支柱,

负责管理各种不同的JDBC驱动,把Java应程序连接到相应的JDBC驱动程序上,位于JDK的java.sql包中。

JDBC驱动:JDBC驱动有各个数据库厂商或第三方中间件厂商提供,负责连接各种不同的数据库。

3、JDBC API:JDBC API主要做三件事:与数据库建立连接、发送SQL语句、处理结果。

  (1)DriverManager类:装载驱动程序,并为创建新的数据库连接提供支持。

  (2)Connection接口:负责连接数据库并担任传送数据的任务。

  (3)Statement接口:由Connection产生,负责执行SQL语句。

  (4)ResultSet接口:负责保存和处理Statement执行后所产生的查询结果。

  (5)PreparedStatement接口:Statement的子接口,也由Connection产生,同样负责执行SQL语句。

      Statement接口相比,PrepardStatement接口具有高安全性、高性能、高可读性和高可维护性的优点。

4、JDBC访问数据库的步骤:

1)加载JDBC驱动

使用Class.forName( )方法将给定的JDBC驱动类加载到Java虚拟机中。若系统中不存在给定的类,则会引发异常,异常类型:ClassNotFoundExecption。

Class.forName(“JDBC驱动类的名称”);

2)与数据库建立连接

DriverManager类是JDBC的管理层,作用于用户和驱动程序之间。

Connection con=DriverManager.getConnection(数据连接字符串,数据库用户名,密码);

3)发送SQL语句,并得到返回结果

一旦建立连接,就使用该连接创建Statement接口的对象,并将SQL语句传递给它所连接的是数据库。

如果是查询操作,将返回类型为resultSet的结果集,它包含执行SQL查询的结果,

如果是其他操作,将根据调用的方法的不同返回布尔值或操作影响记录数目;

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM table1;");

4)处理返回结果

处理返回结果主要是针对查询操作的结果集,通过循环取出结果集中每条记录并做相应处理。

    while (rs.next()) {

          int x = rs.getInt("a");

          String s = rs.getString("b");

          float f = rs.getFloat("c");

                 }

5、释放资源

5、连接数据库:

  ●两种常用的驱动方式:第一种是JDBC-ODBC桥连方式,适用于个人开发与测试,他通过ODBC与数据库进行连接。

            另一种是纯Java驱动方式,它直接同数据库进行连接,在生产型开发中,推荐使用纯Java驱动方式。

  ◆使用JDBC-ODBC桥连方式连接数据库:JDBC-ODBC桥连就是将对JDBC API的调用转换为对另一组数据库连接(即ODBC)API的调用。

将对JDBC API的调用,转换为对另一组数据库连接API的调用

  优点:可以访问所有ODBC可以访问的数据库

  缺点:执行效率低、功能不够强大(只能运用于windows平台服务,可移植性不好)

注意:ERROR - java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver

这个问题的原因是类找不到,JDK 1.6中运行上面的代码是正常的,JDK1.6以后的版本,oracle已经取消了odbc的连接方式,故会报上面的错误

解决这个问题也比较简单,下载数据库对应的jdbc版本,添加进工程即可

SQL SERVER:

驱动类:com.microsoft.sqlserver.jdbc.SQLServerDriver

连接串:jdbc:sqlserver://localhost:1433;DatabaseName=test

ORACLE:
驱动类:oracle.jdbc.driver.OracleDriver
连接串:jdbc:oracle:thin:@127.0.0.1:1521:test
MYSQL:

驱动类:com.mysql.jdbc.Driver
连接串:jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password

Eg

右侧的代码注意的问题:
报下面的错误:
Tue Jul 17 09:35:59 CST 2018 WARN:
Establishing SSL connection without server's identity verification is not
recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection
must be established by default if explicit option isn't set. For compliance
with existing applications not using SSL the verifyServerCertificate property
is set to 'false'. You need either to explicitly disable SSL by setting
useSSL=false, or set useSSL=true and provide truststore for server
certificate verification.

(警告:不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+, 5.6.26+和5.7.6+的要求,如果没有设置显式选项,则必须默认建立SSL连接。您需要通过设置useSSL=false显式地禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储。)

 

解决方法:

这只是一个警告,更改如下:

"jdbc:mysql://localhost:3306/test";

更改后:

"jdbc:mysql://localhost:3306/test?useSSL=false";

Eg

package
example71;

import
java.sql.Connection;

import
java.sql.DriverManager;

import
java.sql.SQLException;

import
org.apache.log4j.Logger;

/**

* 使用JDBC-ODBC桥方式建立数据库连接并关闭

*/

public class Test {

private static Logger logger = Logger.getLogger(Test.class.getName());

public static void main(String[] args) {

Connection conn = null;

// 1.加载驱动

try {

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

} catch (ClassNotFoundException e) {

logger.error(e);

}

// 2.建立连接

try {

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/epet?useSSL=false", "QINGG", "1234");

System.out.println("建立连接成功!");

} catch (SQLException e) {

logger.error(e);

} finally {

// 3.关闭连接

try {

if (null != conn) {

conn.close();

System.out.println("关闭连接成功!");

}

} catch (SQLException e) {

logger.error(e);

}

}

}

}

附加:

本地的两种表现方式:

1、localhost

2、127.0.0.1

  ◆使用纯Java方式连接数据库
:由JDBC驱动直接访问数据库;

    优点:驱动程序完全用Java语言编写,运行速度快、跨平台;

    缺点:访问不同的数据库需要下载专用的JDBC驱动;

常见的错误:

JDBC驱动类的名称书写错误,出现ClassNotFoundExexption异常;

数据连接字符串,数据库名、密码书写错误、出现SQLException异常;

数据库操作结束后,没有关闭数据库连接,导致仍占有系统资源;

关闭数据库连接语句没有放到finally语句块中,导致语句可能没有被执行;

在实际项目如果使用MySQL数据库,为了避免可能出现乱码问题,将指定数据库连接的编码集为UTF8

上面的示例数据库连接URL如下:

url= jdbc:mysql://27.0.0.1:3306/epet?useUnicode=true&characterEncoding=utf-8;

6、Statement接口和ResultSet接口:

       获取Connection对象后就可以进行各种数据库操作了,此时需要使用Connection对象创建Statement对象。

  ●Connection接口常用方法

方法名称

作用

void close()

立即释放此Connection对象的数据库和JDBC资源

Statement createStatement()

创建一个Statement对象将SQL语句发送到数据库

PreparedStatement preparedStatement(String sql)

创建一个PreparedStatement对象来将参数化的SQL语句发送到数据

boolean isClosed()

查询此Connection对象是否已经被关闭

  ●Statement接口常用方法

方法名称

作用

ResuultSet executeQuery(String sql)

可执行SQL查询获取ResulSet对象

int  executeUpdate(String sql)

可执行插入、删除、更新的操作,返回值是执行该操作所影响的行数

boolean exeute(String sql)

可执行任意SQL语句,若结果为ResultSet对象,则返回true;

若其为更新计数或者不存在任何结果,则返回false

  ●ResuoltSet接口常用方法及作用

方法名称

作用

boolean next()

将光标从当前位置向下移动一行

boolean previous()

将光标从当前位置上移动一行

void close()

关闭ResultSet对象

int getInt(int columnIndex)

以int的形式获取结果集的那个钱行指定列号的值

int getInt(String columnLable)

以int的形式获取结果集的那个钱行指定列名的值

float getFloat(int columnIndex)

以float的形式获取结果集的那个钱行指定列号的值

float getFloat(String columnIndex)

以float的形式获取结果集的那个钱行指定列名的值

String getString(int columnIdex)

以String的形式获取结果集的那个钱行指定列号的值

String getString(String columnLable)

以String的形式获取结果集的那个钱行指定列名的值

int getRow()

得到光标当前所指行的行号

boolean absolute(int row)

光标移动到row指定的行

作为一种好的编程风格,应该在不需要ResultSet对象、Statement对象和Connection对象时显示的关闭他们;

语法:public void close() throws SQLExecption

●要先按ResultSet结果集,后Statement,最后Connection的顺序关闭,因为ResultSet是通过Statement执行SQL命令得到的,

而Statement是需要在创建连接后才可以使用的,所以三者之间存在相互依赖的关系,关闭时也必须按照依存关系进行。

●用户如果不关闭ResultSet,当Statement关闭,重新执行或用于从多结果序列中获取下一个结果时,该ResultSet将被自动关闭

7、PreparedStatement
接口:
继承自 Statement接口,比Statement对象使用起来更加灵活,更有效率

  ●PreparedStatement接口 预编译的 SQL 语句):

         提高了代码的可读性和可维护性

         ★提高了SQL语句执行的性能

         ★提高了安全性

方法名称

作用

boolean
execute()

在此PreParedStatement对象中执行SQL语句,该语句可以是任何SQL语句

如结果是Result对象,则返回true,如果结果是更新计数或者没结果,则返回false

ResultSet executeQuery()

在此PreParedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象

 

int
executeUpdate()

在此PreParedStatement对象执行SQL语句,该语句必须是DML语句,

Insertupdatedelete语句,

或是无返回内容的sql语句,如DDL语句,返回值是执行该操作所影响的行数。

void
setInt(int index,int x)

将指定参数设置为给定Java int值,设置其他类型参数的方法与此类型。

如setFloat(int
index,float x)、setDouble(int index,double x)等;

void
setObject(int index,Object x)

使用给定对象设置指定参数的值。

    
使用PreParedStatement操作数据库的基本步骤:

      1、创建PreParedStatement对象:

      ★通过Connection接口的PreParedStatement(String sql)方法来创建PreParedStatement对象,SQL语句可具有一个或多个输入参数。

      这些参数的值在SQL语句创建时未被指定,而是为每个输入参数保留一个问好(“?“)作为占位符;

      PreParedStatement pstmt=conn.PreParedStatement("UPDATE dog
SET health=? ,love=?  Where=?");

   2、设置每个输入参数的值:通过调用setXXX()方法来完成,其中XXX是与该参数相应的类型;

      setXXX(要设置参数的序数位置(从一开始计数),设置给参数的值);

     3、执行SQL语句:

         ★在设置了各个输入参数的值后,就可以调用PreParedStatement接口的三个执行方法

      (ResultSet executeQuery()、int executeUpdate()、Boolean execute())之一来执行SQL语句;

                 ★注意这三个执行方法和Statement接口中三个方法名称相同、作用相同但是不需要SQL语句做参数,SQL语句已经在创建对象PreParedStatement时指定了;

                         Eg
pst.executeUpdate();

                 ★创建PreParedStatement对象时会对SQL语句进行预编译,所以执行速度要快于Statement对象,因此,如果在程序中需要多次执行SQL语句时,

      应该使用PreParedStatement对象来执行数据库操作,以提高效率;