3.1 JDBC的编程
JDBC是JAVA数据库编程API,JDBC提供了JA VA应用程序访问数据库资源的编程接口,提供了对SQL语言的支持。JDBC的主要作用是连接数据库,维护数据源,实现SQL语言,以及发送SQL到数据库并返回和处理结果。下面的ComputerAccess程序演示了利用JDBC访问MYSQL数据库中的Computer数据表的过程。
package com.joy_cz.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @author 蔡哲
*/
public class ComputerAccess{
public static void main(String[] args){
Connection conn = null;
try{
//加载MYSQL数据库驱动
Class.forName("org.gjt.mm.mysql.Driver");
//设置访问属性
Properties prop = new Properties();
prop.setProperty("user","root");
prop.setProperty("password","123456");
//打开数据库连接并连接到指定的URL
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/hibernate",prop);
}catch(ClassNotFoundException e){
e.printStackTrace();}
catch(SQLException e){
e.printStackTrace();}}}
3.2 连接数据库 DriverManager
JDBC中的DriverManager是用来管理数据库驱动程序的。利用DriverManager可以建立数据库连接,管理多个数据库驱动,并识别不同的数据库URL所对应的数据库驱动。示例如下:
package com.joy_cz.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @author 蔡哲
*/
public class DriverManagerTest
{ public static void main(String [] args)
{
Connection conn = null;
try {
//加载MYSQL数据库驱动
Class.forName("org.gjt.mm.mysql.Driver");
Class.forName("org.postgresql.Driver");
//设置访问属性
Properties prop = new Properties();
prop.setProperty("user","root");
prop.setProperty("password","123456");
//将日志输出到控制台
DriverManager.setLogwriter(new PrintWriter(System.out));
//打开数据库连接并连接到指定的URL
String mysqlURL = "jdbc:mysql://localhost:3306/hibernate";
String postgresqlURL = "jdbc:postgresql://locahost:5432//hibernate";
con = DriverManager.getConnection(mysqlURL,prop);
// con = DriverManager.getConnection(postgresqlURL,prop);
}catch(ClassNotFoundException e){
e.printStackTrace();}
catch(SQLException e){
e.printStackTrace();}}}
3.3 数据源
DataSource对象代表JAVA的数据源。DataSource是数据库编程的一个工具,利用DataSource可以获得数据库连接。DataSource本身可以被注册到JNDI命名服务器上,通过JNDI,不同的JAVA应用程序可以共享DataSource,从而为数据库程序的开发提供很大的便利。示例如下:
package com.joy_cz.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
/**
* @author 蔡哲
*/
public class BasicDataSourceTest
{ public static void main(String [] args)
{
MysqlDataSource ds = new MysqlDataSource();
ds.setURL("jdbc:mysql://localhost:3306/hibernate");
ds.setUser("root");
ds.setPassword("123456");
Connection conn = ds.getConnection();
}
}
3.4 数据库连接池
(1) C3P0连接池
通过连接池可以提供ConnectionPoolDataSource类型的数据源。目前,连接池的开放源代码实现项目很多,而且有多种连接池实现工具可以被配置到Hibernate中使用,其中包括C3P0项目(http://sourceforge.net/projects/c3p0/)。下面的代码使用了C3P0提供的ComboPooledDataSource
package com.joy_cz.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* @author 蔡哲
*/
public class C3P0Test
{ public static void main(String [] args)
{
//创建C3P0提供的连接池数据源
ComboPooledDataSource cpds = new ComboPooledDataSource();
//设置数据库驱动
cpds.setDriverClass("org.gjt.mm.mysql.Driver");
//设置JDBC的URL
cpds.setURL("jdbc:mysql://localhost:3306/hibernate");
cpds.setUser("root");
cpds.setPassword("123456");
//从连接池数据源获取数据库连接
Connection conn = cpds.getConnection();
}
}
(2) PooledDataSource 与JNDI
利用连接池实现的DataSource是一个系统中需要反复调用的资源,通常被注册到JNDI,以便于被其他应用程序使用。使用JNDI服务的名称服务工具可从TOMCAT的软件包中得到( naming-common.jar),需要把naming-common.jar导入CLASSPATH。示例如下:
package com.joy_cz.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* @author 蔡哲
*/
public class C3P0JNDITest
{ public static void main(String [] args)
{
Hashtable table = new Hashtable();
//设置JNDI的工厂类
table.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.naming.java.javaURLContextFactory");
//初始化JNDI上下文
InitialContext ctx = new InitialContext(table);
//创建C3P0提供的连接池数据源
ComboPooledDataSource cpds = new ComboPooledDataSource();
//设置数据库驱动
cpds.setDriverClass("org.gjt.mm.mysql.Driver");
//设置JDBC的URL
cpds.setURL("jdbc:mysql://localhost:3306/hibernate");
cpds.setUser("root");
cpds.setPassword("123456");
cpds.setInitialPoolSize(10);
//把数据源绑定到JNDI,名称是"hibernateDS"
ctx.bind("hibernateDS",cpds);
//从JNDI查找数据源
DataSource ds = (DataSource)ctx.lookup("hibernateDS");
//从连接池数据源获取数据库连接
Connection conn = ds.getConnection();
}
}