1. JDBC方式 - 连接数据库
一般步骤:
1.1 加载驱动
每个驱动程序类必须实现的接口。 Java SQL 框架允许多个数据库驱动程序。每个驱动程序都应该提供一个实现 Driver 接口的类。 DriverManager 会试着加载尽可能多的它可以找到的驱动程序,然后,对于任何给定连接请求,它会让每个驱动程序依次试着连接到目标 URL。
强烈建议每个 Driver 类应该是小型的并且是单独的,这样就可以在不必引入大量支持代码的情况下加载和查询 Driver 类。 在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序 Class.forName("com.mysql.jdbc.Driver")
e.g.
Class.forName("com.mysql.jdbc.Driver");
1.2 建立数据库连接
管理一组 JDBC 驱动程序的基本服务。
作为初始化的一部分,DriverManager 类会尝试加载在 "jdbc.drivers" 系统属性中引用的驱动程序类。这允许用户自定义由他们的应用程序使用的 JDBC Driver。例如:
a) 在 ~/.hotjava/properties 文件中,用户可以指定:jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver
b) 程序还可以在任意时间显式地加载 JDBC 驱动程序:Class.forName("com.mysql.jdbc.Driver");
注:DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源的另一种方法。使用 DataSource 对象是连接到数据源的首选方法。
e.g.
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/addressbook", "root", "root");
1.3 创建一个 Statement 对象来将 SQL 语句发送到数据库
用于执行静态 SQL 语句并返回它所生成结果的对象。
在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。
相关语法:
Statement createStatement(int resultSetType,
int resultSetConcurrency,
int resultSetHoldability)
throws SQLException
创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。此方法与默认无参 createStatement 方法相同,但它允许重写默认结果集类型、并发性和可保存性。
参数:
resultSetType - 以下 ResultSet 常量之一:ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency - 以下 ResultSet 常量之一:ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE
resultSetHoldability - 以下 ResultSet 常量之一:ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT
e.g.
Statement stmt = conn.createStatement();
1.4 执行数据库操作
java.sql.Statement类中的成员方法:
ResultSet executeQuery(String sql)
执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。
int executeUpdate(String sql)
执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
e.g.
ResultSet rs = stmt.executeQuery("select * from user;");
if(rs.next())
System.out.println(rs.getString("username") + "\t" + rs.getString("password"));
1.5 释放数据库连接资源(有先后顺序)
e.g.
rs.close();
stmt.close();
conn.close();
完整数据库连接代码:
e.g.
/**
* Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
* All right reserved.
*
* Created on Aug 1, 2011 4:38:46 PM
* http://jarg.iteye.com/
* Author: Jarg Yee <[email protected]>
*/
package com.iteye.jarg.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* TODO JDBC方式 - 基本数据库工具类
*/
public class DBUtil
{
private String driverClassName = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/addressbook";
private String username = "root";
private String password = "root";
private Connection conn = null;
private Statement stmt = null;
private ResultSet rs = null;
/**
* 初始化数据库配置信息
* */
public DBUtil()
{
build();
}
/**
* 建立数据库连接
* */
public void build()
{
try
{
Class.forName(driverClassName);
conn = DriverManager.getConnection(url, username, password);
stmt = conn.createStatement();
}
catch (ClassNotFoundException e)
{
System.out.println("建立数据库连接出错\n" + e.getMessage());
this.closeConnection();
System.exit(0);
}
catch (SQLException e)
{
System.out.println("建立数据库连接出错\n" + e.getMessage());
this.closeConnection();
System.exit(0);
}
}
/**
* 数据库查询
* */
public ResultSet executeQuery(String sql)
{
try
{
rs = stmt.executeQuery(sql);
}
catch (SQLException e)
{
System.out.println("数据查询出错\n" + e.getMessage());
return null;
}
return rs;
}
/**
* 数据库更新
* */
public int executeUpdate(String sql)
{
int count = 0;
try
{
count = stmt.executeUpdate(sql);
}
catch (SQLException e)
{
System.out.println("数据库更新出错\n" + e.getMessage());
return 0;
}
return count;
}
/**
* 释放数据库连接资源
* */
private void closeConnection()
{
try
{
if(conn != null && !conn.isClosed())
{
conn.close();
}
}
catch (SQLException e)
{
System.out.println("释放数据库连接资源出错\n" + e.getMessage());
}
}
/**
* 释放SQL语句声明资源
* */
private void closeStatement()
{
try
{
if(stmt != null && !stmt.isClosed())
{
stmt.close();
}
}
catch (SQLException e)
{
System.out.println("释放SQL语句声明资源出错\n" + e.getMessage());
}
}
/**
* 释放结果集资源
* */
private void closeResultSet()
{
try
{
if(rs != null && !rs.isClosed())
{
rs.close();
}
}
catch (SQLException e)
{
System.out.println("释放结果集资源出错\n" + e.getMessage());
}
}
/**
* 释放数据库资源
* */
public void close()
{
this.closeResultSet();
this.closeStatement();
this.closeConnection();
}
/**
* for debugging.
* */
public static void main(String[] args) throws Exception
{
DBUtil db = new DBUtil();
String username = "ye";
String password = "ye";
String sql = "select * from user where username = '" + username + "' and password = '" + password + "';";
ResultSet rs = db.executeQuery(sql);
if(rs.next())
System.out.println(rs.getString("username") + "\t" + rs.getString("password"));
db.close();
}
}