JDBC(Java Database Connectivity)是java访问数据库的基石,其它技术(如第三方O/R工具Hibernate,ibatis等)都是对JDBC的封装。是Java数据库连接的一个标准,是进行数据库连接的抽象层,由Java编写的一组类和接口组成,其接口的实现由各个数据库厂商来完成。
JDBC分类:
JDBC-ODBC桥,通过JDBC-ODBC的调用方法调用事先已在使用者计算机上安装好的ODBC(Open Database Connectivity 微软公司开放服务结构中有关数据库的一个组成部分)驱动。
部分本地API部分Java的驱动程序,类似以上。
JDBC网络纯Java驱动程序,这类型的驱动程序最大的好处是省去了在使用者计算机上安装任何驱动程序的麻烦,只需在服务器端安装好middleware,而middleware会负责所有存取数据库时必要的转换。
本地协议的纯 Java 驱动程序,:这类型的驱动程序是最成熟的JDBC驱动程序,不但无需在使用者计算机上安装任何额外的驱动程序,也不需在服务器端安装任何的中介程序(middleware),所有存取数据库的操作,都直接由驱动程序来完成。
JDBC API:
Java.sql.Driver接口是所有JDBC驱动程序要实现的,不同的数据库厂商提供不同的实现。然后再程序中由java.sql.DriverManager(驱动程序管理器类)来调用这些实现。
首先加载驱动,通过调用Class类的forName()静态方法,向其传递要加载的JDBC驱动的类名来完成。而注册驱动,Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。
然后建立连接
理解重点:
是一个“缓冲池”,负责分配、管理和释放数据库连接,允许用用程序重复试用一个连接池中一个现有的数据库连接,而不是重新建立一个。
连接池通过设定最小连接数来初始化连接,通过最大连接数来限定当前连接池能占有的最大连接数量。在此过程中,通过设定最大空闲连接数来释放多余连接数并约束保留一定空闲连接数,再通过设定最小空闲数来预防突然而来的链接(在最大连接数的限制下尽量满足)。最后通后设定等待的最长时间来管理连接时间过长异常。
Javax.sql.DateSource接口表示,其实现由服务器(如Weblogic,WebSphere,Tomcat)或一些开源组织提供(如DBCP数据库连接池,C3P0数据库连接池)。DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池。
使用DBCP连接池实现,需增加两jar包:Commons-dbcp.jar连接池的实现;Commons-pool.jar连接池实现的依赖库。Tomcat的连接池即采用此连接池实现。
操作重点:
BasicDataSource bds=null;
//创建数据源对象
bds=new BasicDataSource();
//设置连接数据库的驱动
bds.setDriverClassName("com.mysql.jdbc.Driver");
//设置连接数据库的url
bds.setUrl("jdbc:mysql://localhost:3306/test");
//设置连接数据库的用户名
bds.setUsername("root");
//设置连接数据库的密码
bds.setPassword("root");
//设置连接池启动时的初始值
bds.setInitialSize(5);
//设置连接池的最大值
bds.setMaxActive(50);
//最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经
//用不到的连接慢慢释放一部分,一直减少到maxIdle为止
bds.setMaxIdle(20);
//最小空闲值.当空闲的连接数少于该值时,连接池就会预申请一些连接,
//以避免洪峰来时再申请而造成的性能开销
bds.setMinIdle(5);
//设置等待时间,以毫秒为单位
bds.setMaxWait(5000);
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
String sql="select id,name,sex from customer";
try {
con=bds.getConnection();
pstmt=con.prepareStatement(sql);
rs=pstmt.executeQuery();
while(rs.next()){
Integer id=rs.getInt(1);
String name=rs.getString(2);
String sex=rs.getString(3);
System.out.println("id "+id +" name "+ name +" sex "+sex );
}
} catch (SQLException e) {
e.printStackTrace();
}