- 浏览: 692234 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (239)
- 系统架构设计 (16)
- java collection framework (2)
- java分布式 (4)
- java多线程 (0)
- 故障处理及调优 (16)
- 软件开发过程及管理 (28)
- OS (5)
- 常用算法 (3)
- design pattern (8)
- transaction (7)
- java apps (48)
- corejava (7)
- java and DB (10)
- cache (0)
- webservice (14)
- web前端 (25)
- 报表 (4)
- 日志系统设计 (3)
- Oracle (4)
- mysql (11)
- xml (11)
- 数据源配置管理 (3)
- 企业数据存储 (4)
- php (2)
- 测试 (1)
最新评论
-
orangebook:
对于初学者来说,这样编写可能会误导,理解更烦锁。
观察者模式(发布-订阅) -
liudajiang:
呵呵 startThreads(rand ...
实践缩小Java synchronized 粒度 -
zengwenbo5566:
谢谢博主,学习了
解决getOutputStream() has already been called for this response -
u011335423:
大神厉害啊 可以了
解决getOutputStream() has already been called for this response -
xiang37:
...
解决getOutputStream() has already been called for this response
1、 JDBC是什么
JDBC是Java数据库连接(Java DataBase Connectivity)技术的简称。
2、 JDBC程序的工作原理
2.1、JDBC API
JDBC API由SUN公司提供,提供了Java应用程序与各种不同数据库交互的标准接口。如:Connection(连接)接口、Statement接口、PreparedStatement接口、ResultSet(结果集)接口等。可以使用这些JDBC接口进行各类数据库操作。
2.1.1、JDBC API的作用:与数据库建立连接、发送SQL语句、处理结果。
DriverManager类:依据数据库的不同,管理JDBC驱动。
Connection接口:负责连接数据库并担任传送数据的任务。
Statement接口:由Connection产生,负责执行SQL语句。
ResultSet接口:负责保存Statement执行后所产生的的查询结果。
2.2、JDBC Driver Manager
JDBC Driver Manager由sun公司提供,它能够管理各种不同的JDBC驱动。
2.3、JDBC驱动
JDBC驱动由各个数据库厂商提供,负责连接各种不同的数据库。如:微软公司为我们提供了专门连接SQL Server的JDBC驱动,而Oracle公司则为我们提供了专门连接Oracle的JDBC驱动,这些JDBC驱动实现了JDBC API中定义的各种接口。
2.3.1、两种常用的驱动方式
(1)、JDBC-ODBC桥连。不能提供非常好的性能,只适用于个人的开发与测试,它通过ODBC与数据库进行连接。
JDBC-ODBC桥连就是将对JDBC API的调用转换为对另一组数据库连接(即ODBC)API的调用。 JDK中已经包括了JDBC-ODBC桥连的驱动接口,所以进行JDBC-ODBC桥连时,不需要额外下载JDBC驱动程序,只需要配置ODBC数据源即可。
//驱动类的名称
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
//数据库连接字符串.。xinxin数据源名称
Connection conn = DriverManager.getConnection(“jdbc:odbc:xinxin”,”sa”,”sa”);
(2)、纯Java驱动方式。直接同数据库进行连接,在生产型开发中,推荐使用纯Java驱动方式。
纯 Java驱动方式由JDBC驱动直接访问数据库,驱动程序完全由Java语言编写,运行速度快,而且具备了跨平台的特点。访问不同的数据库需要下载专用的JDBC驱动。
//SQL Server 2005的驱动连接
//数据库驱动
com.microsoft.sqlserver.jdbc.SQLServerDriver
// URL
jdbc:sqlserver://localhost:1433;databasename=company
// SQL Server 2000的驱动连接
//数据库驱动
com.microsoft.jdbc.sqlserver.SQLServerDriver
// URL
jdbc:microsoft:sqlserver://localhost:1433;databasename=company
两种常用的驱动方式示意图:
2.4、JDBC程序的代码模板
开发一个JDBC应用程序,基本需要以下步骤:
(1)、把JDBC驱动类装载入Java虚拟机中,为此,可使用Class.forName()方法,此方法将给定的类加载到Java虚拟机中。如果系统中不存在给定的类,则会引发异常,异常类型为ClassNotFoundException。
Class.forName(“JDBC驱动类的名称”);
(2)、加载驱动,并与数据库建立连接。DriverManager类跟踪已注册的驱动程序,当调用getConnection()方法时,它会搜索整个驱动程序列表,直到找到一个能够连接至数据连接字符串中指定的数据库的驱动程序。加载此驱动程序之后,将使用DriverManager类的getConnection()方法建立与数据库的连接。此方法接收三个参数,分别表示URL、用户名和密码。用户名和密码是可选的。
Connection conn = DriverManager.getConnection(数据库连接字符串,数据库用户名,密码);
(3)、发送SQL语句,并得到结果集。一旦连接建立,就使用该连接创建Statement接口的实例,并将SQL语句传递给它所连接的数据库,并返回类型为ResultSet的对象,它包含执行SQL查询的结果。
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(select a,b,c from table);
(4)、处理结果。使用ResultSet对象的next()方法将光标(cursor)指向下一行。最初光标位于第一行之前,因此第一次调用next()方法将光标置于第一行上。如果到达结果集的末尾,则ResultSet的next()方法会返回false。方法getXXX提供了获取当前行中某列值的途径,列名或列号可用于标识要从中获取数据的列。例如:如果数据表中第一列的列名为a,存储类型为整型,则可以使用两种方法获取存储在该列中的值,如:int x = rs.getInt(“a”);或者:int x = rs.getInt(1);
处理结果的代码示例:
while(rs.next()){
int x = rs.getInt(“a”);
String s = rs.getString(“b”);
float f = rs.getFloat(“c”);
}
JDBC程序的代码模板:
//把JDBC驱动类装载入Java虚拟机中 Class.forName(JDBC驱动类的名称); //加载驱动,并与数据库建立连接,其中数据库连接字符串用来标识数据库 Connection conn = DriverManager.getConnection(数据库连接字符串,数据库用户名,密码); //执行SQL语句,并得到结果集 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(“select a,b,c from table”); //处理结果 while(rs.next()){ int x = rs.getInt(“a”); String s = rs.getString(“b”); float f = rs.getFloat(“c”); }
2.5、什么是JDBC URL
JDBC URL提供了一种标识数据库的方法,可以使相应的JDBC驱动程序能识别数据库并与之建立连接。
JDBC URL的标准语法由以下三个部分组成,各部分间用冒号分隔。
Jdbc:<子协议>:<子名称>
JDBC URL的三个部分可以分解如下:
其中jdbc-----代表协议。
<子协议>----驱动程序名或数据库连接机制的名称。
<子名称>----一种标识数据库的方法。
JDBC URL示例:
jdbc:odbc:news
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=news
3、 Statement接口和PreparedStatement接口中的方法
ResultSet executeQuery(String sql):可以执行SQL查询并获取到ResultSet对象。
int executeUpdate(String sql):可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数。
boolean execute(String sql):这是一个最为一般的执行方法,可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet。
4、 为什么要关闭Statement对象以及数据库连接
如果不关闭Statement对象,它们会一直占用服务器资源,直到Java垃圾收集程序来回收它。作为一种好的编程风格,应在不需要Statement对象时显示地关闭它们,这将立即释放服务器资源,有助于避免潜在的内存问题。同样,使用完数据库连接后,就应关闭它,释放连接所占用的数据库资源。
5、 PreparedStatement语句
PreparedStatement接口继承自Statement接口,PreparedStatement比普通的Statement对象使用起来更加灵活,更有效率。PreparedStatement实例包含已编译的SQL语句,SQL语句可具有一个或多个输入参数。这些输入参数的值在SQL语句创建时未被指定,而是为每个输入参数保留一个问号(“?”)作为占位符。
PreparedStatement pstmt = con.prepareStatement(“update table set a=? where b=?”);
在执行PreparedStatement对象之前,必须设置每个输入参数的值。可通过setXXX方法来完成,其中XXX是与该参数相应的类型。例如,如果参数具有Java类型long,则使用的方法就是设置给该参数的值。例如,以下代码将第一个参数设为长整型值123456789,第二个参数设为整型值10:
pstmt.setLong(1,123456789);
pstmt.setInt(2,10);
由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象,因此,多次执行的SQL语句应被创建为PreparedStatement对象,以提高效率。
6、 格式化时间
SimpleDateFormat hmFromat = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
hmFromat.format(new Date());
7、 步骤
1)调用Class类的forName()方法,加载并注册数据库驱动。
2)调用DriverManager类的getConnection()方法,建立到数据库的连接
3)调用Connection对象的createStatement()方法,访问数据库
4)调用Statement对象的executeQuery()方法得到ResultSet对象。
5) 调用ResultSet对象的getObject()方法,处理结果。
6)释放资源(连接应该尽可能晚建立,释放资源应尽可能早释放。)
8、 代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** *Jdbc工具类 */ public class JdbcUtils { private static String url = "jdbc:mysql://localhost:3306/test"; private static String user = "root"; private static String password = "123456"; private JdbcUtils() { } static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException ex) { throw new ExceptionInInitializerError(ex); } } public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url, user, password); } public static void free(Connection conn, Statement st, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { try { if(st!=null) { st.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { try { if(conn!=null){ conn.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } } } } }
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Test { public static void main(String[] args) { optimize(); } public static void optimize() { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); st = conn.createStatement(); rs = st.executeQuery("Select * from Students;"); while (rs.next()) { System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t" + rs.getObject(4)); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { JdbcUtils.free(conn, st, rs); } } }
发表评论
-
Http状态码及实例
2018-03-24 15:06 0HTTP常用状态码列表: ... -
java同步机制及synchronized关键字的应用2
2013-03-25 22:03 1531类定义: public class Test{ ... -
实践缩小Java synchronized 粒度
2013-03-07 22:09 2071项目需求: 产品需要监视不同种类的多个数据库,例如:多个 ... -
java同步机制及synchronized关键字的应用1
2013-03-05 23:04 967Java对多线程的支持与同步机制深受大家的喜爱,通过JMM ... -
Thread_管理异步、定时及周期性任务
2012-09-24 14:43 1269项目中有很多异步、定时及周期性任务的需求,其实现有一定的特点, ... -
Thread_跨节点集合查询
2012-09-18 16:56 1644项目中数据库进行了水平切分,为了处理跨节点集合查询,采用了多线 ... -
Thread_大批量数据的分页处理(生产者-消费者)
2012-09-17 13:30 1376java应用中通常会有处理大批量数据的场景,这里介绍一种分 ... -
Thread_wait、notify、notifyAll的使用方法
2012-09-17 11:19 6859wait()、notify()、notifyAll()是三个定 ... -
计算java对象占用的内存
2011-12-13 11:38 1044Java有一个很好的地方就是java的垃圾收集机制,这个机制集 ... -
java调用shell执行数据压缩
2011-07-18 17:44 1461项目需求: 将迁移来的数据文件进行压缩。要求压缩过程耗时尽量 ... -
quartz应用之一:创建、关闭定时任务
2011-07-18 17:15 3424项目需求: 数据迁移进程开始执行后,启动定时任务每隔30秒计 ... -
xtree应用实例
2011-03-11 18:02 1352最近项目中用到了构造树形目录的功能,简单了解了下dtree和x ... -
应用系统中配置文件的应用场景及简要分析
2010-11-12 16:13 1191使用配置文件的有点不外乎两点: 1.提高系统的灵活性。 2 ... -
解决getOutputStream() has already been called for this response
2010-08-26 14:57 158564getOutputStream() has already b ... -
实战防止重复提交(token)应用思路及过程
2010-06-11 16:39 1593我这里只考虑了直接使用struts API的情况,使用自定义的 ... -
Struts国际化完整解决方案-支持多国语言
2010-06-11 16:38 2036在网上有很多有关Struts的中文解决方案,但是很多都说得很零 ... -
jsp查询条件的保留
2010-06-11 16:23 2767本文适合java web开发初学者参考。 统计系统或者 ... -
java日期计算
2010-05-26 14:45 1314Calendar类:一个抽像类,不能直接new 得到。 Cal ... -
mvc应用实例
2010-04-04 19:58 971最近参与到一个行业数据处理的项目,我负责数据请求和订阅的功能, ... -
反斜杠处理
2009-12-16 10:03 1237在Java中处理一些路径相关的问题的时候,如要取出ie浏览器上 ...
相关推荐
实验八:通过JDBC方式访问数据库 《数据库概论》一书中的实验报告范文,pdf格式
实验八通过JDBC方式访问数据库 实验报告8 JDBC 王珊版
jdbc方式直接访问数据库环境的配置帮助文档,里面有详细的介绍。
代码简洁··注释清楚·思路清晰··技术牛B
jdbc原理 jdbc访问数据库的步骤 数据库
jdbc连接各种数据库方式列表jdbc连接各种数据库方式列表jdbc连接各种数据库方式列表
这是使用jdbc访问数据库的方法,很好的,很详细的讲解了如何使用jdbc连接数据库
JDBC与Java数据库编程
JDBC数据库访问JDBC数据库访问
Jdbc数据库连接技术,便于用户访问和操作SQL数据库
各种数据库的访问步骤详细讲解,经过本人整理,有很多的地方都写得很好。
JDBC访问各种数据库的方法,JDBC访问各种数据库的方法.
Java 技术之JDBC程序访问数据库 简单明了
JDBC数据库访问技术
JDBC访问数据库的优化策略JDBC访问数据库的优化策略
Java 通过JDBC API访问数据库.ppt 老师的课件,比较有用,分享之。
如下图所示1、通过常规JDBC访问数据库目的:练习JDBC连接、操作数据库的完整过程(所有操作写在同一个类文件中即可)注意命名规范,建议:1)项目名全部小写,例
android通过JDBC直接访问Mysql数据库
《数据库系统概论》课程之实验八,通过JDBC访问数据库。本文件中包含实验报告一份,可运行代码一份与JDBC的驱动jar包。 程序实现了使用Java语言编程实现对数据库的访问,所有的SQL操作均在自己建立的新库里进行,...