Java JDBC高级特性

1、JDBC批处理

实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制。Statement和PreparedStatemen都实现了批处理。测试表结构如下:

Statement批处理程序示例

 1 package server;
 2
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.Statement;
 7
 8 import com.mysql.jdbc.PreparedStatement;
 9
10 public class DemoJDBC {
11     public static void main(String[] args) throws Exception {
12         // 加载驱动类
13         Class.forName("com.mysql.jdbc.Driver");
14
15         // 通过DriverManager获取数据库连接
16         String url = "jdbc:mysql://192.168.1.150/test";
17         String user = "teamtalk";
18         String password = "123456";
19         Connection connection = (Connection) DriverManager.getConnection(
20                 url, user, password);
21
22         String sql1 = "DROP TABLE IF EXISTS people";
23         String sql2 = "CREATE TABLE people(id int, name varchar(20))";
24         String sql3 = "INSERT people VALUES(2, ‘hdu‘)";
25         String sql4 = "UPDATE people SET id = 1";
26         Statement statement = (Statement) connection.createStatement();
27         statement.addBatch(sql1);
28         statement.addBatch(sql2);
29         statement.addBatch(sql3);
30         statement.addBatch(sql4);
31         statement.executeBatch();
32
33         ResultSet resultSet = statement.executeQuery("SELECT * from people");
34         while (resultSet.next()) {
35             System.out.println(resultSet.getString(1) + " " + resultSet.getString(2));
36         }
37     }
38 }

PreparedStatement批处理

 1 package server;
 2
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.Statement;
 7
 8 import com.mysql.jdbc.PreparedStatement;
 9
10 public class DemoJDBC {
11     public static void main(String[] args) throws Exception {
12         // 加载驱动类
13         Class.forName("com.mysql.jdbc.Driver");
14
15         // 通过DriverManager获取数据库连接
16         String url = "jdbc:mysql://192.168.1.150/test";
17         String user = "teamtalk";
18         String password = "123456";
19         Connection connection = (Connection) DriverManager.getConnection(
20                 url, user, password);
21
22         PreparedStatement statement =  (PreparedStatement) connection.prepareStatement("INSERT people VALUES(?,?)");
23         for (int i = 1; i < 4; i++) {
24             statement.setInt(1, i);
25             statement.setString(2, "hdu" + i);
26             statement.addBatch();
27         }
28         statement.executeBatch();
29
30         ResultSet resultSet = statement.executeQuery("SELECT * from people");
31         while (resultSet.next()) {
32             System.out.println(resultSet.getString(1) + " " + resultSet.getString(2));
33         }
34     }
35 }

2、JDBC处理事务

针对JDBC处理事务的操作,在Connection接口中,提供了3个相关的方法,具体如下:

1 setAutoCommit(boolean autoCommit); // 设置是否自动提交事务
2 commit(); // 提交事务
3 rollback(); // 撤销事务

将setAutoCommit()方法参数设置为false后,事务必须使用conn.commit()方法提交,而事务回滚不一定显式执行conn.rollback()。如果程序最后没有执行conn.commit(),事务也会回滚,一般是直接抛出异常,终止程序的正常执行。因此,通常情况下,会conn.rollback()语句放在catch语句块执行。

 1 package demo.jdbc;
 2
 3 import java.sql.DriverManager;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6
 7 import com.mysql.jdbc.Connection;
 8 import com.mysql.jdbc.PreparedStatement;
 9 import com.mysql.jdbc.Statement;
10
11 public class FirstJDBC {
12     public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException {
13         Connection connection = null;
14         try {
15             // 加载驱动类
16             Class.forName("com.mysql.jdbc.Driver");
17
18             // 通过DriverManager获取数据库连接
19             String url = "jdbc:mysql://192.168.1.150/test";
20             String user = "teamtalk";
21             String password = "123456";
22             connection = (Connection) DriverManager.getConnection(
23                     url, user, password);
24             // 关闭事务的自动提交
25             connection.setAutoCommit(false);
26
27             Statement statement = (Statement) connection.createStatement();
28             PreparedStatement statement1 = (PreparedStatement) connection.prepareStatement("INSERT people VALUES(?, ?)");
29             PreparedStatement statement2 = (PreparedStatement) connection.prepareStatement("INSERT people VALUES(?, ?)");
30
31             statement1.setInt(1, 1);
32             statement1.setString(2, "hdu1");
33             statement2.setInt(1, 2);
34             statement2.setString(2, "hdu2");
35
36             statement1.executeUpdate();
37             statement2.executeUpdate();
38
39             ResultSet resultSet = statement.executeQuery("SELECT * from people");
40             while (resultSet.next()) {
41                 System.out.println(resultSet.getString(1) + " " + resultSet.getString(2));
42             }
43         }
44         catch (Exception e) {
45             // 回滚事务
46             connection.rollback();
47             e.printStackTrace();
48         }
49     }
50 }

3、JDBC连接池

DBCP数据源

使用DBCP数据源需要使用3个jar包,分别是commons-dbcp.jar包(https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi)、commons-pool.jar(http://commons.apache.org/proper/commons-pool/download_pool.cgi)包和commons-logging.jar(http://commons.apache.org/proper/commons-logging/download_logging.cgi)包。以下程序示例是通过BasicDataSource类直接创建数据源对象。

 1 package server;
 2
 3 import java.sql.Connection;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6 import java.sql.Statement;
 7
 8 import javax.sql.DataSource;
 9
10 import org.apache.commons.dbcp2.BasicDataSource;
11
12 //import com.mysql.jdbc.Statement;
13
14 public class DemoDBCP {
15     public static DataSource ds = null;
16
17     static {
18         // 获取DBCP数据源实现类
19         BasicDataSource bds = new BasicDataSource();
20         // 设置连接池配置信息
21         bds.setDriverClassName("com.mysql.jdbc.Driver");
22         bds.setUrl("jdbc:mysql://192.168.1.150/test");
23         bds.setUsername("teamtalk");
24         bds.setPassword("123456");
25         // 设置连接池参数
26         bds.setInitialSize(5);
27         bds.setMaxTotal(5);
28         ds = bds;
29     }
30
31     public static void main(String[] args) throws SQLException {
32         Connection connection = (Connection) ds.getConnection();
33         java.sql.DatabaseMetaData metaData = connection.getMetaData();
34
35         System.out.println(metaData.getURL());
36         System.out.println(metaData.getUserName());
37         System.out.println(metaData.getDriverName());
38
39         Statement statement = (Statement) connection.createStatement();
40         ResultSet resultSet = statement.executeQuery("SELECT * from people");
41         while (resultSet.next()) {
42             System.out.println(resultSet.getString(1) + " " + resultSet.getString(2));
43         }
44     }
45 }

c3p0数据库连接池

c3p0是目前最流行的开源数据库连接池之一,它实现了DataSource数据源接口,支持JDBC2和JDB3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和Spring使用功能的都是该数据源。c3p0连接数据库示例(通过配置文件方式),注意:配置文件名称必须是c3p0-config.xml,该文件必须放在工程bin目录下。下载地址:https://sourceforge.net/projects/c3p0/?source=typ_redirect

配置文件c3p0-config.xml为:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <c3p0-config>
 3     <default-config>
 4         <property name="jdbcUrl">jdbc:mysql://192.168.1.150/test</property>
 5         <property name="driverClass">com.mysql.jdbc.Driver</property>
 6         <property name="user">teamtalk</property>
 7         <property name="password">123456</property>
 8
 9         <property name="checkoutTimeout">3000</property>
10         <property name="idleConnectionTestPeriod">30</property>
11         <property name="initialPoolSize">10</property>
12         <property name="maxIdleTime">30</property>
13         <property name="maxPoolSize">100</property>
14         <property name="minPoolSize">10</property>
15         <property name="maxStatements">200</property>
16     </default-config>
17
18     <named-config name="demo">
19         <property name="jdbcUrl">jdbc:mysql://192.168.1.150/test</property>
20         <property name="driverClass">com.mysql.jdbc.Driver</property>
21         <property name="user">teamtalk</property>
22         <property name="password">123456</property>
23
24         <property name="checkoutTimeout">3000</property>
25         <property name="idleConnectionTestPeriod">30</property>
26         <property name="initialPoolSize">10</property>
27         <property name="maxIdleTime">30</property>
28         <property name="maxPoolSize">100</property>
29         <property name="minPoolSize">10</property>
30         <property name="maxStatements">200</property>
31     </named-config>
32
33 </c3p0-config>  
 1 package server;
 2
 3 import java.sql.Connection;
 4 import java.sql.SQLException;
 5
 6 import javax.sql.DataSource;
 7
 8 import com.mchange.v2.c3p0.ComboPooledDataSource;
 9
10 public class DemoDBCP {
11     public static DataSource ds = null;
12
13     static {
14         ComboPooledDataSource cpds = new ComboPooledDataSource();
15         ds = cpds;
16     }
17
18     public static void main(String[] args) throws SQLException {
19         Connection connection = (Connection) ds.getConnection();
20         java.sql.DatabaseMetaData metaData = connection.getMetaData();
21
22         System.out.println(metaData.getURL());
23         System.out.println(metaData.getUserName());
24         System.out.println(metaData.getDriverName());
25     }
26 }

参考

Java JDBC基础学习小结

时间: 2024-08-25 14:20:46

Java JDBC高级特性的相关文章

JDBC高级特性(一)结果集,批量更新

一.ResultSet的高级特性 1 可滚动ResultSet 1)向前和向后滚动 滚动特性 在JDBC初期版本中, ResultSet仅能向前滚动 在JDBC后续版本中, ResultSet默认能向前滚动或前后滚动 迟缓滚动:记录集可前后滚动,不受数据库数据更新影响 灵敏滚动:记录集可前后滚动,受数据库数据更新影响 由结果集类型设定 con.createStatement() con.createStatement(结果集类型, 结果集并发类型) con.createStatement(结果集

JDBC高级特性(二)分布式事和JTA基本原理

在进入主题之前我们首先来了解一下JNDI和连接池~ 一.JNDI 1)是一组在Java应用中访问命名和目录服务的API(Java命名与目录接口) 命名服务将名称和对象联系起来,使得我们可以通过名称访问对象. 目录服务是命名服务的扩展,两者之间的关键差别是目录服务中对象可以有属性(例如:用户有email地址),而命名服务中对象没有属性. 2)JNDI API提供了一种统一的方式,可以在本地或网络上查找和访问服务 各种服务在命名服务器上注册一个名称,需要使用服务的应用程序通过JNDI找到对应服务就可

JDBC高级特性(二)事务、并发控制和行集

一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommit(false),取消自己主动提交 2)对数据库运行一个或多个操作(一个或多个SQL语句) 3)con.commit().提交事务(上面的第二部的多个操作就作为一个总体提交运行) 4)假设某个操作失败.通过con.rollback()回滚全部操作(撤销以上的操作,将数据恢复为运行前状态) 事务处理依

《深入理解Java虚拟机 JVM高级特性...》核心笔记

深入理解Java虚拟机 JVM高级特性与最佳实践(第二版) 核心笔记 JAVA 环境: JAVA虚拟机高级特性: 一:java内存区域与内存异常 一):运行数据区     1:程序计数器(Program Counter Register),也称"PC寄存器" A:用来指示需要执行哪条指令的.(在汇编语言中,CPU在得到指令之后,程序计数器便自动加1或者根据                    转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令.) B:由于在JVM中,多线程

《Java核心技术 卷II 高级特性 原书第10版》高清pdf

<Java核心技术 卷II 高级特性 原书第10版> 本书是Java领域有影响力和价值的著作之一,由拥有20多年教学与研究经验的Java技术专家撰写(获Jolt大奖),与<Java编程思想>齐名,10余年全球畅销不衰,广受好评.第10版根据JavaSE8全面更新,同时修正了第9版中的不足,系统全面讲解了Java语言的核心概念.语法.重要特性和开发方法,包含大量案例,实践性强. ? 百度网盘链接: https://pan.baidu.com/s/1aZ9KUgxwHNQJMH6X7h

深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)PDF下载

网盘下载地址:深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)PDF下载 – 易分享电子书PDF资源网 作者: 周志明 出版社: 机械工业出版社 副标题: JVM高级特性与最佳实践 出版年: 2013-9-1 页数: 433 定价: 79.00元 装帧: 平装 内容简介 · · · · · · <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)>内容简介:第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公

JAVA核心技术 卷II:高级特性(原书第8版)下载 &#363916;

下载地址: http://www.gqylpy.com/di/12 <JAVA核心技术 卷II:高级特性>PDF高清完整版-下载 前言致读者本书是按照Java?SE?8完全更新后的<Java核心技术??卷Ⅱ??高级特性(原书第10版)>.卷Ⅰ主要介绍了Java语言的一些关键特性:而本卷主要介绍编程人员进行专业软件开发时需要了解的高级主题.因此,与本书卷Ⅰ和之前的版本一样,我们仍将本书定位于用Java技术进行实际项目开发的编程人员.????编写任何一本书籍都难免会有一些错误或不准确的

《深入理解java虚拟机JVM的高级特性及其实现原理》

JVM的优点(JAVA语言的优点) 除了要了解java语言的优点之外,还要知道java语言的这些优点到底是如何实现的(也即java语言这些特性的实现原理)

第15篇-JAVA JDBC编程

第15篇-JAVA JDBC编程 每篇一句 :对于勇敢者,尝试是一条崭新的生活之路 初学心得: 但对于坎坷与泥泞,能以平常之心视之,就非常不容易 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-08| JAVA JDBC编程 ] 1.JDBC概述 通过使用JDBC API,Java程序可以非常方便地操作各种主流数据库,这是是Java语言的巨大魅力所在 由于Java语言的跨平台特性,所以使用JDBC API所编写的程序不仅可以实现跨数据库,还可以跨平台,具有非常优秀的可移植性