java 和 sql 的连接数据库_java数据库连接方法(一)

一、问题引入

在java程序中,需要访问数据库,做增删改查等相关操作。如何访问数据库,做数据库的相关操作呢?

二、Java连接数据库方法概述

java.sql提供了一些接口和类,用于支持数据库增删改查等相关的操作。该jar包定义了java访问各种不同数据库(mysql,oracle,sqlserver。。。。。)的统一接口和标准。同时,各个数据库厂商都提供了该jar包中定义的各个接口的实现类,用于具体实现本厂数据库的增删改查操作,即称之为“数据库驱动jdbc driver”。例如mysql的数据库驱动为:com.mysql.jdbc.driver;oracle的数据库驱动为:oracle.jdbc.driver.oracledriver。

在java程序中访问数据库,做数据库连接时,可以采用两种方式:

1、使用java.sql API

2、使用数据库连接池

目前存在多个开源的java数据库连接池,这些连接池都是在java.sql基础上编写而成。

Ø         该连接池的解决的问题是:

当使用java.sql中提供的api创建数据库连接时候,需要耗费很大的资源,要进行用户名密码数据库连接验证等,即耗费资源也耗费时间。如果在程序中,每次需要访问数据库时候,都进行数据库连接,那么势必会造成性能低下;同时,如果用户失误忘记释放数据库连接,会导致资源的浪费等。而数据库连接池就是解决该问题,通过管理连接池中的多个连接对象(connection),实现connection重复利用。从而,大大提高了数据库连接方面的性能。

Ø         该连接池的功能是:

负责创建,管理,释放,分配数据库连接即(connection)。首先,负责创建相应数目的数据库连接对象(connection)对象,并存放到数据库连接池(connect pool)中。当用户请求数据库连接时,该连接池负责分配某个处于空闲状态的数据库连接对象;当用户发出释放该数据库连接时,该连接池负责将该连接对象重新设置为空闲状态,以便被别的请求重复利用。同时;数据库连接池负责检查(空闲时间>最大空闲时间)的数据库连接,并释放。

Ø         连接池主要参数介绍

最小连接数:初始化时,系统将负责创建该数目的connection放入连接池中。

最大连接数:系统允许创建connection的最大数值。当系统请求连接时候,且连接池中不存在空闲的连接:如果connection总数未超过最大连接数,那么连接池负责创建新的connection对象,并返回该对象;如果connection总数已经到达该最大连接数,那么连接池将用户请求转入等待队列。

三、常用的数据库连接池

1、  JNDI

2、  C3p0

3、  Apache 的Jakarta DBCP

4、  BoneCP

其中,sping框架依赖的第三方使用了c3p0和dbcp两种方式;而bonecp号称是速度最快的数据库连接池。JNDI方式创建实现的datasource是真正实现了javax.sql.datasource;其他的三种方式都不是。下面的列表,列出了几种方式的区别和不同:

序号  连接池名称  依赖的jar包  实现的datasource类  备注  1  JNDI  该数据源是由相应的web服务器(例如:tomcat,weblogic,websphere)负责初始化,创建,管理。程序中不需要引入特别的jar包。  Javax.sql.datasource     2  C3P0  c3p0-0.9.xxx.jar  com.mchange.v2.c3p0.ComboPooledDataSource     3  DBCP  commons-dbcp.jar,commons-pool.jar  org.apache.commons.dbcp.BasicDataSource     4  BoneCP    bonecp-0.6.5.jar · google-collections-1.0.jar · slf4j-api-1.5.11.jar · slf4j-log4j12-1.5.11.jar ·log4j-1.2.15.jar    BoneCPDataSource

备注:以上几种方式的数据库连接池的配置参数大同小异,略有差别;其参数的配置,既可以通过配置文件的方式配置,也可以通过硬编码的方式配置。

四、分别列出几种连接池的编码例子

(所有的例子均可以参考D:\work\qsyworkspace2\jdbctest项目)

1、  使用java.sql API直接访问数据库

详细请参考javasql.java文件。

Class.forName("com.mysql.jdbc.Driver");

String url="jdbc:mysql://localhost:3306/editortest";

String user="root";

String password="123456";

Connection cn=DriverManager.getConnection(url, user, password);

Statement st=cn.createStatement();

String sql="select * from artical where id=1";

ResultSet rs=st.executeQuery(sql);

while(rs.next()){

System.out.println("1:"+rs.getString(1));

System.out.println("2:"+rs.getString(2));

System.out.println("3:"+rs.getString(3));

System.out.println("4:"+rs.getString(4));

}

2、  使用JNDI方式

这种方式,是由web服务器,实现了java.sql.datasource。由web服务器负责初始化数据源,创建connection,分配,管理connection。由于本身是由web服务器实现的功能,因此不需要在项目project中引入特别的jar包,但是需要在服务器的某些配置文件中增加相关的配置。下面,以tomcat服务器为例,讲述这种方式的使用。

(1)、修改tomcat的conf下的context.xml文件,增加Resource的配置的支持。

(2)、由于数据源是由tomcat负责创建,所以需要的jdbc驱动应该放到tomcat的lib路径下。

(3)、编写使用java代码,并放在tomcat环境下使用,如下:

public void jnditest(){

// TODO Auto-generated method stub

try {

Context initcontext=new InitialContext();

Context context=(Context) initcontext.lookup("java:comp/env");

DataSource datasource=(DataSource)context.lookup("jdbc/editortest");

Connection cn=datasource.getConnection();

Statement st=cn.createStatement();

String sql="select * from artical where id=1";

ResultSet rs=st.executeQuery(sql);

while(rs.next()){

System.out.println("1:"+rs.getString(1));

System.out.println("2:"+rs.getString(2));

System.out.println("3:"+rs.getString(3));

System.out.println("4:"+rs.getString(4));

}

} catch (NamingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

(4)、详情参考jndisql。Java文件,以及index.jsp。

注意:该测试不能在main方法中测试;可以写一个jsp在tomcat环境中测试。因为:java单元的环境是jdk;而jsp的环境却是tomcat;数据连接池是在tomcat中配置的,所以能正常运行的,但java测试的环境只有jdk,所以在引用数据连接池时就时出现找不到环境的错误。

使用环境:当使用weblogic或者websphere等高级的web服务器的时候,可以考虑使用这种方式提高性能。

3、  使用C3p0方式

C3P0是开源的数据库连接组件,支持创建数据库连接池,管理connection等功能。使用该种方式做数据库连接时候,需要导入c3p0-0.9.1.2.jar。

同时,关于数据库连接的具体参数,例如:url,username,password,最小连接数,最大连接数。。。。。等信息既可以在xml配置文件中配置,也可以通过程序编码方式创建。Spring支持c3p0的数据库连接池方式,因此在spring环境中使用时,支持在applicationcontext.xml文件中配置。另外,由于数据库连接池在整个project中针对某个数据库而言是单例的,所以,即使通过编码的方式创建,那么要保证其单实例特性。如果存在多个,那么必然会导致性能低下。

下面,列出通过程序编码方式使用c3p0数据库连接池的方式。

ComboPooledDataSource ds = new ComboPooledDataSource();

try {

ds.setDriverClass("com.mysql.jdbc.Driver");

ds.setJdbcUrl("jdbc:mysql://localhost:3306/editortest");

ds.setUser("root");

ds.setPassword("123456");

ds.setMaxPoolSize(20);

ds.setInitialPoolSize(10);

ds.setMaxIdleTime(2000);

Connection cn=ds.getConnection();

Statement st=cn.createStatement();

String sql="select * from artical where id=1";

ResultSet rs=st.executeQuery(sql);

while(rs.next()){

System.out.println("1:"+rs.getString(1));

System.out.println("2:"+rs.getString(2));

System.out.println("3:"+rs.getString(3));

System.out.println("4:"+rs.getString(4));

}

} catch (PropertyVetoException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

备注:通常使用方式,都是通过配置文件配置,几乎不会用到这种硬编码方式。在此,只是简单介绍C3P0的使用方式。详情,可以参考c3p0test.java。

4、  使用dbcp方式

DBCP方式,是apache提供的数据源连接池方式,支持数据库连接池创建,管理connection等功能。使用环境,需要导入commons-dbcp.jar 和 commons-pool.jar两个jar包。上面提到的JNDI方式,其实质实用的就是dbcp数据源;只是他是通过在web服务器上做配置,由web服务器负责创建该数据源。

同样的,dbcp数据源也支持xml配置文件和硬编码两种方式。通常使用方式,都是通过配置文件配置,几乎不会使用硬编

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值