精髓——java数据访问
第一节 从底层最终连接方式来看,有下面两种方式
一、jdbc-odbc桥
适用于Microsoft Access、Visual FoxPro等
二、第三方JDBC驱动
各数据库厂商都提供了相应的驱动程序
第二节 从程序架构上来看,有下面这些方式
一、临时建立连接。在需要数据的时候才加载驱动,创建Connection(连接)对象,进而创建Statement、ResultSet等对象,使用完毕后调用各对象的close()方法。见示例。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
publicclass ConnectionMySQL {
publicstaticvoid main(String args[]) {
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库连接
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/chentao","root","admin");
//提交查询并获取结果集
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("SELECT * FROM student");
//对结果集进行遍历
System.out.println(" 学号\t姓名\t年龄 ");
while(rs.next()) {
//打印数据
System.out.print(rs.getString(1)+"\t");
System.out.print(rs.getString(2)+"\t");
System.out.println(rs.getInt(3));
}
con.close();
stmt.close();
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、建立公共数据库访问连接类。
该类主要能创建公用的连接,此连接可作为单例存在。(如果提供不止一个connection而不强制成为单例,则可改造成所谓的“连接池”)。应用程序在需要数据的时候每次都使用此公共数据库访问连接类。应用程序用完数据后可能需要调用一些close()方法来关闭一些对象。
公共数据库访问连接类举例:
下面的代码以连接mysql数据库为例。类DB_Connection包含一个获得单例连接的方法getConnection(),和4个关闭必要对象的方法。可以扩展DB_Connection以使其功能更丰富。
本例参见了下面两本书:
《Struts与hibernate实用教程》邬继成 第24页 含有一个提供单例连接的所谓连接池的写法
《javaweb程序设计与项目实践》古乐声 第82页
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
publicclass DB_Connection {
privatestatic Connection conn;//这将是该类能提供的唯一一个连接
privatestatic String driverName = "com.mysql.jdbc.Driver";
privatestatic String userName = "root";
privatestatic String userPwd = "admin";
privatestatic String dbName = "chentao";
privatestatic String url = "jdbc:mysql://localhost:3306/"+dbName;
// 私有构造器,避免用户调用而生成多个DB_Connection实例
private DB_Connection() {}
// 获得连接的静态公共方法
publicstatic Connection getConnection() {
try {
if (conn == null) {
Class.forName(driverName);
conn = DriverManager.getConnection(url, userName, userPwd);
returnconn;
} elseif ((conn != null) &&(conn.isClosed()) ){
Class.forName(driverName);
conn = DriverManager.getConnection(url, userName, userPwd);
returnconn;
}
elsereturnconn;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
returnconn;
}
// 关闭ResultSet
publicvoid close(ResultSet rs) {
if (rs != null)
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭Statement
publicvoid close(Statement stmt) {
if (stmt != null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭PreparedStatement
publicvoid close(PreparedStatement pstmt) {
if (pstmt != null)
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭Connection
publicvoid close(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
三、使用数据源连接池。
数据源连接池通常由容器(中间件)管理,负责分配、管理和释放数据库连接。系统设计者应根据现实情况来对数据源进行一些配置,比如最大、最小连接数。在容器中配置的一个好处是松耦合,并且容器可能提供了一些比较好的优化策略,当然,这些策略有时也要系统设计者来参与设置。
参见《Tomcat与JavaWeb开发技术详解》封超。
java的数据源连接池设计与javax.sql.DataSource和JNDI有关。应用程序员不需要编写连接数据库代码,而是查找容器中是否有相关的服务。比如下述代码
Context ctx=null;
DataSource ds=null;
java.sql.Connection con=null;
try {
ctx=new InitialContext();
//通过JNDI找到数据源
ds=(DataSource)ctx.lookup("java:comp/env/dataSource");
//获取数据库连接
con=ds.getConnection();
//提交查询并获取结果集
stmt=con.createStatement();
String sql="SELECT * FROM student";
rs=stmt.executeQuery(sql);
//后续代码
}
应用程序需要导入的包有javax.sql.*、javax.naming.*。
Tomcat连接池本身的配置可以在server.xml里的<context>节点下的<Resource>节点中完成,可能随版本会有变化,详见相关资料。
四、使用框架。如hibernate。既带来了松耦合,而且在多线程并发处理、和事务操作时这些框架带来了安全。应用程序员需要进行一些配置,对于这些框架的内部原理,应用程序员可以不必知道。