JAVA / MySql 编程——第七章 JDBC
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: 驱动类:com.mysql.jdbc.Driver |
||
Eg: 右侧的代码注意的问题: (警告:不建议在没有服务器身份验证的情况下建立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语句, 如Insert,update或delete语句, 或是无返回内容的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对象来执行数据库操作,以提高效率;