javaJDBC连接数据库代码大全.docx

上传人:b****3 文档编号:3704188 上传时间:2022-11-24 格式:DOCX 页数:20 大小:22.69KB
下载 相关 举报
javaJDBC连接数据库代码大全.docx_第1页
第1页 / 共20页
javaJDBC连接数据库代码大全.docx_第2页
第2页 / 共20页
javaJDBC连接数据库代码大全.docx_第3页
第3页 / 共20页
javaJDBC连接数据库代码大全.docx_第4页
第4页 / 共20页
javaJDBC连接数据库代码大全.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

javaJDBC连接数据库代码大全.docx

《javaJDBC连接数据库代码大全.docx》由会员分享,可在线阅读,更多相关《javaJDBC连接数据库代码大全.docx(20页珍藏版)》请在冰豆网上搜索。

javaJDBC连接数据库代码大全.docx

javaJDBC连接数据库代码大全

java_JDBC连接数据库代码大全

#使用JDBC操作数据库

#1、JDBC基础

#JDBC简介:

JDBC(JavaDatabaseConnectivity)是一种可以执行SQL的JavaAPI,通过它可以用一种API操作不同的数据库.

#JDBC驱动:

不同数据库间,标准的SQL语句可以移植,而数据库实际通信协议及某些数据库特征不可移植,因此,JDBC和数据库之间须还有一层,用于将JDBC调用映射成特定的数据库调用,此特殊层就是JDBC驱动程序.

常见的JDBC驱动有四种:

》JDBC-ODBC桥,是最早实现的JDBC驱动程序,目的为了快速推广JDBC,非多线程,能力有限,此驱动程序将JDBCAPI映射成ODBCAPI

》直接将JDBCAPI映射成数据库特定的客户端API,这种驱动程序包含特定数据库的本地代码,可用于特定数据库的客户端

》支持三层结构的JDBC访问方式,主要用于Applet阶段,通过Applet访问数据库

》纯java的,直接与数据库实例交互,智能型的,知道数据库使用的底层协议,是目前最流行的JDBC驱动

#JDBC常用接口和类简介

DriverManager:

用于管理JDBC驱动的服务类,主要方法是获得Connection对象

publicstaticsynchronizedConnectiongetConnection(Stringurl,Stringuser,Stringpass)

throwsSQLException

Connection:

代表一个数据库连接物理会话,若放我数据库,须先获得数据库连接.常用方法

》StatementcreateStatement()throwsSQLException返回Statement对象

》PreparedStatementprepareStatement(Strinsql)throwsSQLException返回编译的Statement对象

》CallableStatementpreparedCall(Strinsql)throwsSQLException返回的CallableStatement对象用于存储过程调度

Statement:

执行DMLSQL的工具接口,常用方法:

》ResultSetexecuteQuery(Stringsql)throwsSQLException执行查询,返回结果集对应的ResultSet对象

》intexecuteUpdate(Stringsql)throwsSQLException执行DML并返回受影响的行数

》booleanexecute(Stringsql)throwsSQLException返回boolean表式执行成功与否

PreparedStatement:

是Statement的子接口,允许数据库预编译SQL,避免数据库每次重新编译,以后每次只改变SQL的参数,性能较好,常用方法

》ResultSetexecuteQuery()throwsSQLException执行查询,返回结果集对应的ResultSet对象

》intexecuteUpdate()throwsSQLException执行DML并返回受影响的行数

》booleanexecute()throwsSQLException返回boolean表式执行成功与否

注:

上述方法因SQL预编译,无须接手SQL字符串,只是需要接收参数,故有如下方法voidsetXxx(intparamIndex,Xxxvalue)

ResultSet:

包含访问结果集的方法,可通过列索引或列名获得列数据,常用方法

》booleannext()throwsSQLException,将ResultSet定位到下一行,结果集的起始位在第一行之前

》voidclose()throwsSQLException释放ResultSet对象

》booleanabsolute(introw)throwsSQLException将结果集移到指定行,若row是负值,则倒数移动

注:

默认方法创建的ResultSet不支持absolute方法因为结果集不支持后移,若想支持,需要如此创建

:

Statement

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

:

ResultSetrs=stmt.executeQuery(sql);

#传统JDBC访问数据库步骤

》通过Class.forName(StringdriverClass)注册数据库驱动

》通过DriverManager.getConnection(Stringurl,Stringuser,Stringpassword)获得数据库连接对象

》通过Connnection.createStatement()或者Connection.createPreparedStatement(Stringsql)创建相应的Statement对象

》通过Statement.execute(Stringsql)或者PreparedStatement.execute()执行相应的SQL,并返回ResultSet对象

》操作ResultSet

#2、数据库连接池

》数据库连接的建立及关闭极其耗资源,对系统性能影响尤为明显.

》传统数据库连接方式:

一个数据库连接均对应一个物理连接,每次操作都要打开、关闭该物理操作,这种频繁性,会造成系统性能下降,此时,考虑数据库连接池.

》数据库连接池解决方案:

当应用程序启动时,系统主动建立足够的连接(按指定的初始化数据),并将这些连接组成一个池.每次应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接,使用完后,不再关闭,而是直接将该连接归还池,使用连接池,可大大提高系统运行效率.

》数据库连接池介绍

》对于共享资源的情况,有一个通用的设计模式--资源池(ResourcePool),用于解决资源的频繁请求、释放所造成的性能下降.为解决数据库连接的这种频繁性,JDBC2.0规范引入了数据库连接池技术,实际上,数据库连接池是Connection对象的工厂,常用参数有:

@数据库的初始连接数@连接池的最大连接数@连接池每次增加的连接数

》连接池的工作示意图{JDBC标准的API并没有提供连接池的实现,仅仅提供了DataSource接口具体的实现有一些厂商提供}

》连接池的分配与释放

@程序启动,分配初始化数目的连接,按需分配,用过归还、超时归还,当申请时无或者达到指定的最小值,按增量参数值分配新的连接

@为确保连接池中最小的连接数,通常有如下策略:

:

动态--定时检查连接池,一旦发现数量小于最小连接数,则补充相应的新连接,保证连接池正常运转

:

静态--空闲连接不足时,系统才检测是否达到最小连接

》连接池的实现

连接池通常包括连接池类(DBConnectionPool)和连接池管理类(DBConnectionPoolManager):

》连接池类是某一数据库所有连接的缓冲池,主要实现功能:

@从连接池获取或者创建可用连接,@使用完毕,归还给池连接,@系统关闭前,断开所有连接并释放连接占用的资源,@处理无效连接,@限制池中连接的数节目,介于最小值和最大值之间

》连接池管理类是连接池类的包装类,该类采用单态模式设计,保证系统中只有一个实例,主要用于管理多个连接池对象,主要实现以下功能:

@注册数据库驱动程序,@根据配置文件,创建连接池对象,@命名、管理连接池,@跟踪连接池的使用,需要时关闭并释放资源

:

数据库连接池的管理是个难点,管理不当,造成系统开销过大,将成为性能瓶颈.对于高并发的WEB应用,采用连接池技术效率和稳定性比传统的连接方式要好的多

:

并发问题--数据库必须考虑此问题,对于并发,Java语言提供管理并发的支持,使用synchronized关键字可确保方法线程的安全.故,DataSource的getConnection方法必须以该该关键字修饰

publicsynchronizedConnectiongetConnection();//保证线程安全

:

事务处理--JDBC的Connection本身通过设置Connection的AutoCommit属性为false,提供对事务的支持,然后,显式地调用commit或rollback方法提交或回滚事务.

连接池需要复用connection,因此,必须提供相应的事务支持机制.考虑采用每个事务独占一个连接,此法可降低事务管理复杂性.

:

多数据库服务器和多用户--JDBC规范中,DataSource具备同时连接不同数据库的能力,如同时连oracle和sqlserver.此时,考虑使用xml配置文件来配置连接所需的相关信息.然后,提供一个Singleton模式的连接池管理类,该管理类每次启动时读取配置文件信息,创建多个连接池类的实例,每个实例对应一个数据库连接池.连接池管理类实例命名每个连接池实例,通过不同的名称管理不同的连接池.

对于多个用户访问同一个数据库的情况,也可考虑使用xml配置文件.

》常见的数据库连接池

通常,没有必要自己实现连接池.商用应用服务器都有自己的连接池实现,如WebLogic和WebSphere,其性能和稳定性绝佳,即使没有商用应用服务器,也可使用开源的连接池.目前流行的有2个:

@DBCP连接池@C3P0连接池

》DBCP连接池

Appache提供的开源实现,依赖于两个jar文件

@commons-dbcp-1.2.1.jar:

连接池的实现

@commons-pool.jar:

连接池实现的依赖库

Tomcat的连接池正是采用该连接池实现的.连接该连接池,既允许与应用服务器整合使用,又可由应用程序独立使用.下面的代码DBConn类通过DBCP获得数据库连接:

publicclassDBConn

{

privatestaticDBConndc;

privateConnectionconn=null;

privateStatementstmt=null;

privateDBConn()

{

}

publicstaticDBConninstance()

{

if(dc==null)

{

dc=newDBConn();

}

returndc;

}

publicStatementopenStmt()

{

if(stmt==null)

{

conn=getConn();

try

{

stmt=conn.createStatement();

}

catch(Exceptione)

{

System.err.println("创建Statement异常:

"+e.getMessage());

}

}

returnstmt;

}

publicvoidcloseStmt()

{

if(stmt!

=null)

{

try

{

stmt.close();

}

catch(Exceptione)

{

System.err.println("Statement关闭异常");

}

}

if(conn!

=null)

{

try

{

conn.close();

}

catch(Exceptione)

{

System.err.println("数据库关闭异常");

}

}

}

privateConnectiongetConn()

{

if(conn==null)

{

try

{

BasicDataSourceds=newBasicDataSource();

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

ds.setUrl("jdbc:

mysql:

//localhost:

3306/j2ee");

ds.setUsername("root");

ds.setPassword("123456");

conn=ds.getConnection();

}

catch(Exceptione)

{

e.printStackTrace();

}

}

returnconn;

}

}

》C3P0连接池

Hibernate推荐使用该优秀的连接池,它实现了JDBC3.0规范的部分功能,故其性能更加突出,该池不仅可自

动清理不再使用的Connection,还可以自动清理Statement和ResultSet.C3P0连接池需要jre1.3以上,推

荐jre1.4

若需使用C3P0连接池,应将包c3p0-0.8.5.jar文件复制进系统.下面代码是通过C3P0连接池获得数据库连

接:

publicclassDBConn

{

privatestaticDBConndc;

privateConnectionconn=null;

privateStatementstmt=null;

privateDBConn()

{

}

publicstaticDBConninstance()

{

if(dc==null)

{

dc=newDBConn();

}

returndc;

}

publicStatementopenStmt()

{

if(stmt==null)

{

conn=getConn();

try

{

stmt=conn.createStatement();

}

catch(Exceptione)

{

System.err.println("创建Statement异常:

"+e.getMessage());

}

}

returnstmt;

}

publicvoidcloseStmt()

{

if(stmt!

=null)

{

try

{

stmt.close();

}

catch(Exceptione)

{

System.err.println("Statement关闭异常");

}

}

if(conn!

=null)

{

try

{

conn.close();

}

catch(Exceptione)

{

System.err.println("数据库关闭异常");

}

}

}

publicConnectiongetConn()

{

if(conn==null)

{

try

{

ComboPooledDataSourceds=newComboPooledDataSource();

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

ds.setJdbcUrl("jdbc:

mysql:

//localhost:

3306/j2ee");

ds.setUser("root");

ds.setPassword("32147");

ds.setMaxPoolSize(40);

ds.setMinPoolSize

(2);

ds.setMaxStatements(180);

conn=ds.getConnection();

}

catch(Exceptione)

{

e.printStackTrace();

}

}

returnconn;

}

}

#3、Spring的JDBC体系

》Spring提供的JDBC抽象框架由core、datasource、object和support4个包组成.

core包含SpringJDBC抽象的核心类,包含各种SQLExceptionTranslator,用于将SQLException转化成spring的异常继承体系,还有DataFileMaxValueIncrementer实现,以及JdbcTemplate,持久层访问模板类.

datasource包含简化数据源连接的工具类,以及各种数据源的简单实现.通过这些实现,spring可以在j2ee之外测试jdbc代码.通过该工具类,可以从JNDI获得连接,并可关闭连接.

object包里的工具类,可将数据库的查询、更新等过程封装成类.这种方式模拟JDO的访问方式,纵横四海查询返回的"值对象"不与数据库关联.support包含了JdbcDaoSupport等工具类.

底层数据库异常被包装成org.springframework.dao中的异常,是运行时异常,故,通过JDBC抽象进行

无需处理jdbc访问特定的异常.Spring允许将包装后的异常传播到特定的层.的持久操作,

》Spring的JDBC封装核心是JdbcTemplate,简化了JDBC的使用,可以处理数据库的连接和释放,故,可避免没有数据库关闭造成的连接泄露.

使用构造器JdbcTemplate(DataSourcedataSource),可通过数据源引用创建JdbcTemplate实例,实际应用中,可以通过JdbcDaoSupport取得,JdbcDaoSupport的getJdbcTemplate()方法会创建JdbcTemplate实例,所需的数据源有JdbcDaoSupport提供.

JdbcTemplate提供系列方法简化数据库访问,主要常用有:

》voidexecute(Stringsql)主要用于执行DDL语句

》Listquery(Stringsql,Object[]args,RowMapper)执行SQL查询,并将每条记录映射成bean实例,返回bean的实例集合

》ListqueryForList(Stringsql,Object[]args)

》ObjectqueryForObject(Stringsql,RowMapperrowMapper)

》intupdate(Stringsql)

》intupdate(Stringsql,Object[]args)

》JDBC封装的回调接口

这些回调接口允许在spring的JDBC抽象体系内,使用原生JDBC查询,避免spring对JDBC封装后的灵活性不足缺点.SpringJDBC抽象体系内的回调接口有:

》CallableStatementCallback:

通过该接口,可使用原生的JDBC命令调用存储过程和函数

》CallableStatementCreator:

是JdbcTemplate使用的两个核心回调接口之一,通过该接口可以获得CallableStatement对象

》PreparedStatementCallback:

通过该接口,可以使用原生的JDBC命令访问数据库

》PreparedStatementCreator:

是JdbcTemplate使用的两个核心回调接口之一,通过该接口可以获得PreparedStatement对象

》StatementCallback:

作用类似PreparedStatementCallback,只是不具备预编译功能

》SpringJDBC与传统JDBC对比

》简化连接获取方式--无须每次采用DriverManager获得连接,也不需使用JNDI查找获得连接.Spring的JDBC连接依赖IOC容器注入

》模板化操作方式--无需繁琐的getConnection,createStatement等操作

》优秀的面向对象操作方式--结果直接转化成JavaBean传出

》一致的异常继承体系--无需捕获JDBC特定的数据库异常,JDBC的checked异常被包装成了Runtime异常,不再要求强制捕捉

#4、JdbcTemplate访问数据库

行简单的查询{API详见SpringAPI2.0}》执

intqueryForXxx(Stringsql):

静态SQL命令执行查询,Xxx可以是int或long,返回一个标量值,而且只能返回一行记录

带参数而已intqueryForXxx(Stringsql,Object[]args):

同上,

ObjectqueryForObject(Stringsql,ClassrequiredType):

返回执行单行单列的查询,将返回结果转换成requiredType类型的对象

注:

只支持特定类型的转换,比如,varchar只能转成String

ListqueryForList(Stringsql):

ListqueryForList(Stringsql,Object[]args):

ListqueryForList(Stringsql,ClassrequiredType):

ListqueryForList(Stringsql,Object[]args,ClasselementType):

/*

*示例

*/

publicclassJdbcTemplateQuery

{

publicstaticvoidmain(String[]args)throwsException

{

ComboPooledDataSourceds=newComboPooledDataSource();

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

ds.setJdbcUrl("jdbc:

mysql:

//localhost:

3306/j2ee");

ds.setUser("root");

ds.setPassword("32147");

ds.setMaxPoolSize(40);

ds.setMinPoolSize

(2);

ds.setMaxStatements(180);

//创建一个JdbcTemplate

JdbcTemplatejt=newJdbcTemplate();

//为JdbcTemplate指定DataSource

jt.setDataSource(ds);

//如果只需返回一个特定值,可直接查询

intcount=jt.queryForInt("selectcount(*)frommytable");

System.out.println(count);

//此处的转换实际非常简单:

只支持Varchar->String的转换.

Stringnametmp=(String)jt.queryForObject("selectnamefrommytablewhere

name='waw

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1