怎么样使用jdbc访问数据库?
怎么样使用jdbc访问数据库?
java基础-使用jdbc访问数据库 [2006-5-29] jybbh 发表在 SQL |
java基础
使用jdbc访问数据库
. 连接到数据库的方法
答:1) ODBC(Open Database Connectivity)
一个以C语言为基础访问SQL为基础数据库引擎的接口,它提供了一致的接口用于和数据库沟通以及访问数据。
2) JDBC
Java版本的ODBC
2. JDBC应用编程接口
答:JDBC应用编程接口是:
1) 标准的数据访问接口,可以连到不同的数据库;
2) JAVA编程语言的一组类和接口。
JDBC应用编程接口能够:
1) 连接到数据库;
2) 发SQL查询字符串到数据库;
3) 处理结果。
JDBC应用编程接口有二个主要的部分:
1) JAVA应用程序开发接口面向JAVA应用程序开发者;
2) JDBC驱动程序开发接口
3. JDBC Driver
答:1) 一大堆实现了JDBC类和接口的类;
2) 提供了一个实现java.sql.Driver接口的类。
4. JDBC Driver的四种类型
答:1) JDBC-ODBC桥
由ODBC驱动提供JDBC访问
2) 本地API
部分Java driver把JDBC调用转化成本地的客户端API
3) JDBC-net
纯的Java driver,将JDBC调用转入DBMS,与网络协议无关。然后通过服务器将调用转为DBMS协议。
4) 本地协议
纯的java driver,将JDBC调用直接转为DBMS使用的网络协议
5. JDBC开发者接口
答:1) java.sql--java 2平台下JDBC的主要功能,标准版(J2SE)
2) javax.sql--java 2平台下JDBC增强功能,企业版(J2EE)
6. 使用URL确认数据库
答:我们使用URL来确定一个数据库(正确的Driver,正确的主机,正确的协议,正确的协议,正确的用户名和密码);
语法:protocol:subprotocol:subname
范例:jdbc:db2:MyTest
jdbc:db2://localhost:6789/MyTest
7. javax.sql包JDBC2.0的增强功能
答:1) 数据源接口;
2) 连接池;
3) 分布式交易;
4) 行集;
8. 创建一个基本的JDBC应用
答:1) 步骤一:注册一个driver;
2) 步骤二:建立一个到数据库的连接;
3) 步骤三:创建一个statement;
4) 步骤四:执行SQL语句;
5) 步骤五:处理结果;
6) 步骤六:关闭JDBC对象
9. 注册一个Driver(步骤一)
答:1) driver被用于连接到数据库;
2) JDBC应用编程接口使用第一个能成功连接到给定URL的driver;
3) 在同一时间可以装载多个driver
10.注册一个driver的方法:
答:1) 使用类loader(装载;实例化;注册入DriverManager)
a. Class.forName("Com.ibm.db2.jdbc.app.DB2Driver");
b. Class.forName("Com.ibm.db2.jdbc.net.DB2Driver");
c. Class.forName("Com.microsoft.jdbc.sqlServer.SQLServerDriver);
d. Class.forName("oracl.jdbc.driver.OracleDriver");
e. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
2) 实例化一个Driver
a. Driver drv = new COM.cloudscape.core.RmiJdbcDriver();
1. 建立一个到数据库的连接(步骤二)
答:DriverManager调用getConnection(urlString)方法,实际上调用的是driver的connect(urlString)方法;
1) 当一个driver肯定地对应到一个数据库URL,DriverManager建立一个连接;
2) 当没有driver匹配,返回null然后下一个driver被检验;
3) 假如没有建立连接,抛出一个SQLExcepiton异常
2. 经常使用的一些JDBC URL
答:1) JDBC-ODBC: jdbc:odbc:<DB>
2) Oracle: jdbc:oracle:oci:@<sid> or jdbc:oracle:thin:@<SID>
3) Weblogic MS-SQL: jdbc:weblogic:mssqlserver4:<DB>@<HOST>:<PORT>
4) DB2: jdbc:db2:MyTest or jdbc.db2://localhost:6789/MyTest(需要用户名和密码)
3. Driver连接方法
答:1) 创建一个到指定Driver实例的直接调用;
2) 避免一般访问的问题
Driver drv = new COM.ibm.db2.jdbc.app.DB2Driver();
Connection con = null;
try {con = drv.connect("jdbc:db2:MyTest",new Properties())}
catch(SQLException e){}
4. 创建一个Statement(步骤三)
答:1) Statement的三个接口:
a. Statement;
b. PreparedStatement(继承自Statement);
c. CallableStatement(继承自PreparedStatement);
2) 使用方法Connection.createStatement()得到一个Statement对象
5. PreparedStatement对象
答:1) 调用ProparedStatement比statement更为高效;
2) 继承自Statement;
3) 语法:PreparedStatement pstm = connection.prepareStatement(sqlString);
6. CallableStatement对象
答:1) 通过CallableStatement调用数据库中的存储过程;
2) 继承自PreparedStatement;
3) CallableStatement cstm = connection.prepareCall("{call return_student[?,?]}");
cstm.setString(1,"8623034");
cstm.registerOutparameter(2, Types.REAL);
cstm.execute();
float gpa = cstm.getFloat(2);
7. Statement接口的比较
答: | Statement | PreparedStatement | CallableStatement
------------------------------------------------------------------------------
写代码位置 | 客户端 | 客户端 | 服务器端
------------------------------------------------------------------------------
写代码位置 | 客户端 | 服务器端 | 服务器端
------------------------------------------------------------------------------
编写代码技术 |Java,SQL操作 |Java,SQL操作 | 数据库的程序语言,如PL/SQL
------------------------------------------------------------------------------
可配置性 | 高 |第一次高,以后低 | 低
------------------------------------------------------------------------------
可移植性 | 高 |假设支持PreparedStatement的话高
------------------------------------------------------------------------------
传输效率 | 低 |第一次低,以后高 | 高
8. 执行SQL Statement(步骤四)
答:通过接口方法将SQL语句传输至黙认的数据库连接,返回结果可能是一个数据表,可以通过java.sql.ResultSet访问。
1) Statement的接口方法:
a. executeQuery(sqlString): 执行给定的SQL声明,返回一个结果集(ResultSet)对象;
b. executeUpdate(sqlString): 执行给定的SQL声明,可以是INSERT、UPDATE或DELETE声明,也可以是SQL DDL声明;
c. execute(sqlString): 执行给定的SQL声明。
9. 处理结果(步骤五)
答:1) 使用结果集(ResultSet)对象的访问方法获取数据;
a. next():下一个记录
b. first():第一个记录
c. last():最后一个记录
d. previous():上一个记录
2) 通过字段名或索引取得数据
3) 结果集保持了一个指向了当前行的指针,初始化位置为第一个记录前。
10. 关闭JDBC对象(步骤六)
答:1) 首先关闭记录集;
2) 其次关闭声明;
3) 最后关闭连接对象。
11. 数据表和类对应的三种关系:
答:1) 一个表对应一个类;
2) 一个表对应相关类;
3) 一个表对应整个类关系层
12. 类间关系的几种表设计:
答:1) 多对一,
2) 一对一:
3) 一对多:
4) 多对多:
13. SQL数据类型及其相应的Java数据类型
答:SQL数据类型 Java数据类型 说明
------------------------------------------------------------------
INTEGER或者INT int 通常是个32位整数
SMALLINT short 通常是个16位整数
NUMBER(m,n) DECIMAL(m,n) Java.sql.Numeric 合计位数是m的定点十进制数,小数后面有n位数
DEC(m,n) Java.sql.Numeric 合计位数是m的定点十进制数,小数后面有n位数
FLOAT(n) double 运算精度为n位二进制数的浮点数
REAL float 通常是32位浮点数
DOUBLE double 通常是64位浮点数
CHARACTER(n)或CHAR(n) String 长度为n的固定长度字符串
VARCHAR(n) String 最大长度为n的可变长度字符串
BOOLEAN boolean 布尔值
DATE Java.sql.Date 根据具体设备而实现的日历日期
TIME Java.sql.Time 根据具体设备而实现的时戳
TIMESTAMP Java.sql.Timestamp 根据具体设备而实现的当日日期和时间
BLOB Java.sql.Blob 二进制大型对象
CLOB Java.sql.Clob 字符大型对象
ARRAY Java.sql.Array
1. 元数据
答:关于数据的信息,例如类型或者容量。通过JDBC API可以访问:
1) 数据库元数据;
a. 使用connection.getMetadata方法返回DataMetaData引用
b. 能够使用isReadOnly此类方法获取信息
2) 结果集元数据;
a. 使用ResultSet.getMetadata方法返回ResultSetMetaData引用
b. 能够使用getColumnCount此类方法获取信息
2. 事务处理
答:1) 一系列的动作作为一个不可分的操作;
2) JDBC API中使用事务处理步骤:
a. 用false作为参数调用setAutoCommit方法;
b. 执行一或多个关于数据库的操作;
c. 调用commit方法完成改变;
d. 恢复上次提交后的改变,调用rollback方法.
try
{
con.setAutoCommit(false);
Statement stm = con.createStatement();
stm.executeUpdate("insert into student(name, age, gpa) values('gzhu', 30, 4.8)");
stm.commit();
}
catch(SQLException e)
{
try
{
con.rollback();
}
catch(Exception e)
{
}
}
3. 并发控制
答:1) 设置隔离级别方法:setTransactionIsolation
2) 隔离级别静态变量
a. TRANSACTION_NONE:只读的数据字典;
b. TRANSACTION_READ_UNCOMMITTED:只读未提交数据;
c. TRANSACTION_READ_COMMITTED:只读未提交数据;
d. TRANSACTION_REPEATABLE_READ:重复读取数据;
e. TRANSACTION_SERIALIZABLE:无论做什么操作都不许别人动。
3) 示例:con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
4. JDBC 2.0 应用程序编程接口增强功能
答:1) ResultSet增强:
a. 可以回卷;
b. 可以修改;
设置示例:Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
2) Statement增强了批量修改能力(batch updates);
3) 更高级的数据类型(例:Struct)。
5. JDBC 2.0标准扩展
答:1) JNDI(Java Naming and Directory Interface): 解决离散状态下Object的查找;
2) 连接池:在内存中保存了一个数据库连接,不需要注册驱动器,提高性能的重要方法。
添加评论
16:29:12 | 固定链接 | 引用通告 (0) | 记录它
固定链接 关闭
spaces.msn.com/myblog2005/blog/cns!AE12B0991C5BB49B!108.entry
执行sql语句
import java.sql.*;
import java.io.*;
/**
* 执行SQL语句的demo.
**/
public class ExecuteSQL {
public static void main(String[] args) {
Connection conn = null; // 定义连接数据库的JDBC Connection对象
try {
String driver = null, url = null, user = "", password = "";
// 读取输入的参数
for(int n = 0; n < args.length; n++) {
if (args[n].equals("-d")) driver = args[++n];
else if (args[n].equals("-u")) user = args[++n];
else if (args[n].equals("-p")) password = args[++n];
else if (url == null) url = args[n];
else throw new IllegalArgumentException("Unknown argument.");
}
// 数据库的url参数必须输入.
if (url == null)
throw new IllegalArgumentException("No database specified");
// 如果启动程序的时候输入了驱动,那么使用用户输入的参数动态注册数据库驱动
if (driver != null) Class.forName(driver);
// 建立到数据库的连接。jdbc会使用它所知道的所有的数据库驱动来建立与数据库的连接。
conn = DriverManager.getConnection(url, user, password);
// 创建statement对象来与数据库进行交互
Statement s = conn.createStatement();
//从命令提示符中读取sql命令
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
//循环执行用户输入的sql语句
while(true) {
System.out.print("sql> "); // 提示用户可以继续输入
System.out.flush(); // 显示提示符.
String sql = in.readLine(); // 读取用户输入
// 输入"quit",退出程序.
if ((sql == null) || sql.equals("quit")) break;
// 忽略空行输入
if (sql.length() == 0) continue;
// 执行输入的sql命令,并显示执行结果.
try {
// 使用execute进行判断用户输入的是查询还是更新,如果是更新则返回"假"
boolean status = s.execute(sql);
// 一些复杂的查询返回不只一个记录集,所以循环读取所有的记录集
do {
if (status) { //status为"真",查询并返回记录集
ResultSet rs = s.getResultSet(); // 读取记录集
printResultsTable(rs, System.out); // 显示记录集
}
else {
// status为"假",进行更新操作,并返回操作所影响的行数
int numUpdates = s.getUpdateCount();
System.out.println("Ok. " + numUpdates +
" rows affected.");
}
// 判断是否有更多的记录集
status = s.getMoreResults();
} while(status || s.getUpdateCount() != -1);
}
// 如果sql语句执行出错,打印出错信息
catch (SQLException e) {
System.err.println("SQLException: " + e.getMessage()+ ":" +
e.getSQLState());
}
finally { // 打印所有的警告信息
SQLWarning w;
for(w=conn.getWarnings(); w != null; w=w.getNextWarning())
System.err.println("WARNING: " + w.getMessage() +
":" + w.getSQLState());
}
}
}
//打印连接数据库失败等错误信息,并显示出来
catch (Exception e) {
System.err.println(e);
if (e instanceof SQLException)
System.err.println("SQL State: " +
((SQLException)e).getSQLState());
System.err.println("Usage: java ExecuteSQL [-d <driver>] " +
"[-u <user>] [-p <password>] <database URL>");
}
// 每次退出程序或程序出现错误时关闭数据库连接。关闭数据库连接的同时也关闭了所有打开的statements和记录集
finally {
try { conn.close(); } catch (Exception e) {}
}
}
/**
* printResultsTable方法输出记录集的内容,此方法依赖于ResultSetMetaData类
**/
static void printResultsTable(ResultSet rs, OutputStream output)
throws SQLException
{
// 建立输出流
PrintWriter out = new PrintWriter(output);
// 读取记录集
ResultSetMetaData metadata = rs.getMetaData();
int numcols = metadata.getColumnCount(); // 列的数目
String[] labels = new String[numcols]; // 列标题
int[] colwidths = new int[numcols];
int[] colpos = new int[numcols];
int linewidth;
linewidth = 1;
for(int i = 0; i < numcols; i++) { // 保存每一列的位置和标签
colpos[i] = linewidth;
labels[i] = metadata.getColumnLabel(i+1);
int size = metadata.getColumnDisplaySize(i+1);
if (size == -1) size = 30;
if (size > 500) size = 30;
int labelsize = labels[i].length();
if (labelsize > size) size = labelsize;
colwidths[i] = size + 1;
linewidth += colwidths[i] + 2;
}
StringBuffer divider = new StringBuffer(linewidth);
StringBuffer blankline = new StringBuffer(linewidth);
for(int i = 0; i < linewidth; i++) {
divider.insert(i, '-');
blankline.insert(i, " ");
}
for(int i=0; i<numcols; i++) divider.setCharAt(colpos[i]-1,'+');
divider.setCharAt(linewidth-1, '+');
out.println(divider);
StringBuffer line = new StringBuffer(blankline.toString());
line.setCharAt(0, '|');
for(int i = 0; i < numcols; i++) {
int pos = colpos[i] + 1 + (colwidths[i]-labels[i].length())/2;
overwrite(line, pos, labels[i]);
overwrite(line, colpos[i] + colwidths[i], " |");
}
out.println(line);
out.println(divider);
// 使用next()方法遍历记录集,使用getObject方法获得列的数值并输出
while(rs.next()) {
line = new StringBuffer(blankline.toString());
line.setCharAt(0, '|');
for(int i = 0; i < numcols; i++) {
Object value = rs.getObject(i+1);
if (value != null)
overwrite(line, colpos[i] + 1, value.toString().trim());
overwrite(line, colpos[i] + colwidths[i], " |");
}
out.println(line);
}
out.println(divider);
out.flush();
}
static void overwrite(StringBuffer b, int pos, String s) {
int slen = s.length();
int blen = b.length();
if (pos+slen > blen) slen = blen-pos;
for(int i = 0; i < slen; i++)
b.setCharAt(pos+i, s.charAt(i));
}
}
执行时如下所示:
javac ExecuteSQL.java
java ExecuteSQL -d com.microsoft.jdbc.sqlserver.SQLServerDrive
r -u username -p password jdbc:microsoft:sqlserver://localhost:1433;databaseName=pubs
使用jdbc连接SQL Server数据库
使用java连接sql server数据库首先需要安装Microsoft SQL Server 2000 Driver for JDBC,可以从微软的网站上下载,然后设置环境变量,CLASSPATH=.;c:/program files/Microsoft SQL Server 2000 Driver for JDBC/lib/msbase.jar;c:/program files/Microsoft SQL Server 2000 Driver for JDBC/lib/msutil.jar;c:/program files/Microsoft SQL Server 2000 Driver for JDBC/lib/mssqlserver.jar。设置了环境变量需要重新启动计算机。
然后使用微软的示例代码来测试一下连接是否可以建立成功:
示例代码如下:
import java.sql.*;
public class Connect{
private java.sql.Connection con = null;
private final String url = "jdbc:microsoft:sqlserver://";
private final String serverName= "localhost";
private final String portNumber = "1433";
private final String databaseName= "pubs";
private final String userName = "username";
private final String password = "password";
// Informs the driver to use server a side-cursor,
// which permits more than one active statement
// on a connection.
private final String selectMethod = "cursor";
// Constructor
public Connect(){}
private String getConnectionUrl(){
return url+serverName+":"+portNumber+";databaseName="+databaseName+";selectMethod="+selectMethod+";";
}
private java.sql.Connection getConnection(){
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con = java.sql.DriverManager.getConnection(getConnectionUrl(),userName,password);
if(con!=null) System.out.println("Connection Successful!");
}catch(Exception e){
e.printStackTrace();
System.out.println("Error Trace in getConnection() : " + e.getMessage());
}
return con;
}
/*
Display the driver properties, database details
*/
public void displayDbProperties(){
java.sql.DatabaseMetaData dm = null;
java.sql.ResultSet rs = null;
try{
con= this.getConnection();
if(con!=null){
dm = con.getMetaData();
System.out.println("Driver Information");
System.out.println("/tDriver Name: "+ dm.getDriverName());
System.out.println("/tDriver Version: "+ dm.getDriverVersion ());
System.out.println("/nDatabase Information ");
System.out.println("/tDatabase Name: "+ dm.getDatabaseProductName());
System.out.println("/tDatabase Version: "+ dm.getDatabaseProductVersion());
System.out.println("Avalilable Catalogs ");
rs = dm.getCatalogs();
while(rs.next()){
System.out.println("/tcatalog: "+ rs.getString(1));
}
rs.close();
rs = null;
closeConnection();
}else System.out.println("Error: No active Connection");
}catch(Exception e){
e.printStackTrace();
}
dm=null;
}
private void closeConnection(){
try{
if(con!=null)
con.close();
con=null;
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception
{
Connect myDbTest = new Connect();
myDbTest.displayDbProperties();
}
}
保存为Connect.java,编译执行:
javac Connect.java
java Connect
结果应该显示出来:Connection Successful!