数据库基础
数据库简介
- 数据库,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,分类:
- JDBC-ODBC桥驱动
- Java到本地API(本地安装客户端程序,如OCI方式)
- Java到网络协议(需要服务端的中间件进行格式转换)
- Java到数据库协议(纯Java)
数据库URL
格式:jdbc:<子协议名>:<子名称>
jdbc为协议名,固定;
<子协议名>指定目标数据库种类和具体连接方式;
<子名称>指定具体的数据库/数据源链接信息(如IP地址、端口号、ODBC数据源名称、连接用户/密码等)
子名称的格式和内容随子协议的不同而改变jdbc:oracle:thin@166.111.78.98:1521:ora9 jdbc:microsoft:sqlserver://127.0.0.1:1433 jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs
JDBC编程
- 加载驱动程序(向系统注册所需的JDBC驱动程序)
- 建立到指定数据库的连接
- 提交数据库查询
- 取得查询结果
加载驱动程序的方法:
// 方法一:
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