Java学习18 JDBC编程

来源:互联网 发布:淘宝转换率2.5正常么 编辑:程序博客网 时间:2024/06/09 21:46

数据库基础

数据库简介

  • 数据库,DB,Data Base
  • 数据库管理系统,DBMS,Data Base Management System
    • 【应用程序】↔【数据库管理系统】↔【数据库】
  • SQL,Structured Query Language
    • Select/Insert/Delete/Update/Create/Drop
  • ODBC,Open DataBase Connectivity,开放式数据库互连
    • DBMS应用程序接口规范
    • 支持应用程序以标准的ODBC函数和SQL语句,操作各种不同类型的数据库

JDBC基本概念

  • JDBC,Java DataBase Connectivity

    • java.sql.DriverManager类
    • java.sql.Driver接口
    • java.sql.Connection接口
    • java.sql.Statement接口
    • java.sql.ResultSet接口
  • JDBC驱动程序,DataBase Driver,分类:

    1. JDBC-ODBC桥驱动
    2. Java到本地API(本地安装客户端程序,如OCI方式)
    3. Java到网络协议(需要服务端的中间件进行格式转换)
    4. Java到数据库协议(纯Java)
  • 数据库URL

    • 格式:jdbc:<子协议名>:<子名称>
      jdbc为协议名,固定;
      <子协议名>指定目标数据库种类和具体连接方式;
      <子名称>指定具体的数据库/数据源链接信息(如IP地址、端口号、ODBC数据源名称、连接用户/密码等)
      子名称的格式和内容随子协议的不同而改变

      jdbc:oracle:thin@166.111.78.98:1521:ora9jdbc:microsoft:sqlserver://127.0.0.1:1433jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs

JDBC编程

  1. 加载驱动程序(向系统注册所需的JDBC驱动程序)
  2. 建立到指定数据库的连接
  3. 提交数据库查询
  4. 取得查询结果

可参考:Lesson: JDBC Basics


加载驱动程序的方法:

// 方法一:Class.forName("oracle.jdbc.driver.OracleDriver");Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");// 方法二:System.setProperty("jdbc.drivers","oracle.jdbc.driver.OracleDriver");System.setProperty("jdbc.drivers","oracle.jdbc.driver.OracleDriver:com.microsoft.jdbc.sqlserver.SQLServerDriver");// 方法三:new oracle.jdbc.driver.OracleDriver();

  • ResultSet常用的getXXX()方法:
    注意:入参下标从1开始排列。或可用列名代替
方法 返回值类型 getBoolean() boolean getByte() byte getBytes() byte[] getDate() java.sql.Date getTime() java.sql.Time getDouble() double getFloat() float getInt() int getLong() long getObjcet Object getShort() short getString() java.lang.String
  • SQL-Java类型对应关系
SQL类型 Java类型 BIT boolean TINYINT byte BINARY byte[] VARBINARY byte[] LONGVARBINARY byte[] Date java.sql.Date FLOAT double DOUBLE double REAL float INTEGER int BIGINT long SMALLINT short CHAR java.lang.String VARCHAR java.lang.String LONGVARCHAR java.lang.String
  • 执行DML语句

    • Connection.createStatement()
    • Statement.excuteUpdate()
    • Statement.executeQuery()
  • 执行DDL语句

    • Statement.excute()
  • 获取数据库元数据

    • Connection.getMetaData()
    • ResultSet.getMetaData()
  • 访问SQL Server数据库

    • 下载安装jdbc驱动程序

JDBC-ODBC桥式驱动

JDBC驱动程序管理器不直接操纵数据库驱动程序,而是调用JDBC-ODBC桥驱动程序,操纵ODBC驱动程序,进而连接各种类型的数据库。

Windows:控制面板->管理工具->数据源(ODBC)

Class.forName('sun.jdbc.odbc.JdbcOdbcDriver');

Excel

Access

SQL Server

JDBC编程进阶

使用属性文件配置环境信息

URL/用户名/密码等信息

Properties.load((InputStream inStream)

OCI方式访问Oracle数据库

  • OCI,Oracle Call Interface
  • OCI方式连接Oracle客户端
    • 配置:
      • 使用Net Configuration Assistant
      • 使用Net Manager图形化工具
      • 直接修改数据库配置文件tnsnames.ora

可滚动/可更新结果集

  • 结果集的类型

    • 不可滚动 FORWARD_ONLY:只能使用next()方法
    • 滚动不敏感 SCROLL_INSENSITIVE:操作可前可后,但滚动过程中数据变化不敏感
    • 滚动敏感 SCROLL_SENSITIVE:操作可前可后,且滚动过程对数据变化敏感
  • 结果集的并发模式

    • 只读 READ_ONLY:数据不允许变更
    • 可更新 UPDATABLE:数据可变更

方法格式:

Statement Connection.createStatement(int type, int concurrency)
  • 结果集类型和并发模式常量
常量 含义 ResultSet.TYPE_FORWARD_ONLY 不可滚动结果集 ResultSet.TYPE_SCROLL_INSENSITIVE 滚动不敏感结果集 ResultSet.TYPE_SCROLL_SENSITIVE 滚动敏感结果集 ResultSet.CONCUR_READ_ONLY 只读结果集 ResultSet.CONCUR_UPDATABLE 可更新结果集
  • 数据库对结果集支持情况
    • 可使用JDBC元数据API进行检测

使用可滚动结果集

  • ResultSet

    方法 说明 boolean next() boolean previous() boolean first() boolean last() boolean beforeFirst() 调用next()后,指向第1条记录 boolean afterLast() 调用previous()后,指向最后1条记录 boolean relative(int rows) 相对行号 boolean absolute(int rows) 绝对行号 int getRow() 获取当前行号

使用可更新结果集

  • ResultSet

    方法 说明 void updateXXX(String columnName, XXX x) 只更新内存 void updateXXX(int columnIndex, XXX x) 只更新内存 void updateRow() 将updateXXX方法所要提交的数据内容,更新到底层数据库 void moveToInsertRow() 将光标移动到插入行(另起一行) void insertRow() 调用moveToInsertRow/updateXXX后调用 void moveToCurrentRow() 如果光标不位于插入行上,则此方法无效 void deleteRow() void cancelRowUpdates()

    注意:可更新结果集,查询语句中查询结果,要使用穷举字段名[表名].*的方式:

    // 正确ResultSet result = stat.executeQuery("select user,host from user");ResultSet result = stat.executeQuery("select user.* from user");// 错误 返回的仍然是只读结果集ResultSet result = stat.executeQuery("select * from user");

预处理语句

java.sql.PreparedStatement接口

  • 提供了执行预编译SQL语句的功能
  • 继承Statement接口
  • Connection对象的prepareStatement(String sql)方法可创建并返回PreparedStatement对象
  • PreparedStatement接口主要方法:
    • void setXXX(int parameterIndex, XXX x)
    • ResultSet executeQuery()
    • int executeUpdate()

调用存储过程

java.sql.CallableStatement接口

  • 调用数据库服务器端存储过程(Procedure)的功能
  • 继承java.sql.PreparedStatement接口
  • Connection对象的prepareCall(String sql)方法可创建并返回CallableStatement对象
  • CallableStatement接口主要方法:
    • void setXXX(int parameterIndex, XXX x)
    • boolean execute()

事务处理

JDBC的Connection对象也支持自动提交非自动提交两种模式,默认为“自动提交”

  • Connection接口提供的相关方法:
    • void setAutoCommit(boolean autoCommit)
    • boolean getAutoCommit()
    • void commit()
    • void rollback()

非自动提交模式下,可以进行提交commit()和回滚rollback()操作。

事务处理之部分回滚

JDBC3.0开始支持使用保存点(Savepoint),实现部分回滚功能

  • java.sql.Savepoint
    • Savepoint Connection.setSavepoint(String name) 方法设置保存点
    • Connection.rollback(Savepoint savepoint) 方法,可对当前事务中的保存点进行引用,回滚到指定保存点

批处理

Batch Processing功能,避免向数据库进行一连串的调用,从而显著提高了运行效率

Statement接口提供的相关方法:
- void addBatch(String sql):可多次调用
- int[] executeBatch()
- void clearBatch():清除当前批处理序列

注意:批处理运行过程中,出错不会自动回滚

高级SQL类型BLOB/CLOB

JDBC2.0开始引入多种高级数据类型,其中最重要的是两种大对象类型BLOB和CLOB

  • BLOB,Binary Large OBject,二进制大对象
    • PreparedStatement.setBinaryStream(int parameterIndex, InputStream x, int length)
    • 存放数据,比如:图片
  • CLOB,Character Large OBject,文本大对象
    • PreparedStatement.setCharacterStream(int parameterIndex, Reader reader, int length)
    • 存放数据,比如:大文本
  • 单字段大小可达4G

JDBC要使用BLOB/CLOB方式访问Oracle数据库,需要更高版本JDBC程序,如10g

原创粉丝点击