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

Statement批处理程序示例
package server; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement; import com.mysql.jdbc.PreparedStatement; public class DemoJDBC {
public static void main(String[] args) throws Exception {
// 加载驱动类
Class.forName("com.mysql.jdbc.Driver"); // 通过DriverManager获取数据库连接
String url = "jdbc:mysql://192.168.1.150/test";
String user = "teamtalk";
String password = "123456";
Connection connection = (Connection) DriverManager.getConnection(
url, user, password); String sql1 = "DROP TABLE IF EXISTS people";
String sql2 = "CREATE TABLE people(id int, name varchar(20))";
String sql3 = "INSERT people VALUES(2, 'hdu')";
String sql4 = "UPDATE people SET id = 1";
Statement statement = (Statement) connection.createStatement();
statement.addBatch(sql1);
statement.addBatch(sql2);
statement.addBatch(sql3);
statement.addBatch(sql4);
statement.executeBatch(); ResultSet resultSet = statement.executeQuery("SELECT * from people");
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + " " + resultSet.getString(2));
}
}
}
PreparedStatement批处理
package server; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement; import com.mysql.jdbc.PreparedStatement; public class DemoJDBC {
public static void main(String[] args) throws Exception {
// 加载驱动类
Class.forName("com.mysql.jdbc.Driver"); // 通过DriverManager获取数据库连接
String url = "jdbc:mysql://192.168.1.150/test";
String user = "teamtalk";
String password = "123456";
Connection connection = (Connection) DriverManager.getConnection(
url, user, password); PreparedStatement statement = (PreparedStatement) connection.prepareStatement("INSERT people VALUES(?,?)");
for (int i = 1; i < 4; i++) {
statement.setInt(1, i);
statement.setString(2, "hdu" + i);
statement.addBatch();
}
statement.executeBatch(); ResultSet resultSet = statement.executeQuery("SELECT * from people");
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + " " + resultSet.getString(2));
}
}
}
2、JDBC处理事务
针对JDBC处理事务的操作,在Connection接口中,提供了3个相关的方法,具体如下:
setAutoCommit(boolean autoCommit); // 设置是否自动提交事务
commit(); // 提交事务
rollback(); // 撤销事务
将setAutoCommit()方法参数设置为false后,事务必须使用conn.commit()方法提交,而事务回滚不一定显式执行conn.rollback()。如果程序最后没有执行conn.commit(),事务也会回滚,一般是直接抛出异常,终止程序的正常执行。因此,通常情况下,会conn.rollback()语句放在catch语句块执行。
将setAutoCommit()方法参数设置为false后,如果没有提交事务,也就是没有调用conn.commit()方法,则数据库中的内容不会更新,修改的只是内存缓冲区中的数据。
package demo.jdbc; import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException; import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement; public class FirstJDBC {
public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException {
Connection connection = null;
try {
// 加载驱动类
Class.forName("com.mysql.jdbc.Driver"); // 通过DriverManager获取数据库连接
String url = "jdbc:mysql://192.168.1.150/test";
String user = "teamtalk";
String password = "123456";
connection = (Connection) DriverManager.getConnection(
url, user, password);
// 关闭事务的自动提交
connection.setAutoCommit(false); Statement statement = (Statement) connection.createStatement();
PreparedStatement statement1 = (PreparedStatement) connection.prepareStatement("INSERT people VALUES(?, ?)");
PreparedStatement statement2 = (PreparedStatement) connection.prepareStatement("INSERT people VALUES(?, ?)"); statement1.setInt(1, 1);
statement1.setString(2, "hdu1");
statement2.setInt(1, 2);
statement2.setString(2, "hdu2"); statement1.executeUpdate();
statement2.executeUpdate(); ResultSet resultSet = statement.executeQuery("SELECT * from people");
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + " " + resultSet.getString(2));
}
}
catch (Exception e) {
// 回滚事务
connection.rollback();
e.printStackTrace();
}
}
}
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类直接创建数据源对象。
package server; import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import javax.sql.DataSource; import org.apache.commons.dbcp2.BasicDataSource; //import com.mysql.jdbc.Statement; public class DemoDBCP {
public static DataSource ds = null; static {
// 获取DBCP数据源实现类
BasicDataSource bds = new BasicDataSource();
// 设置连接池配置信息
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://192.168.1.150/test");
bds.setUsername("teamtalk");
bds.setPassword("123456");
// 设置连接池参数
bds.setInitialSize(5);
bds.setMaxTotal(5);
ds = bds;
} public static void main(String[] args) throws SQLException {
Connection connection = (Connection) ds.getConnection();
java.sql.DatabaseMetaData metaData = connection.getMetaData(); System.out.println(metaData.getURL());
System.out.println(metaData.getUserName());
System.out.println(metaData.getDriverName()); Statement statement = (Statement) connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * from people");
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + " " + resultSet.getString(2));
}
}
}
c3p0数据库连接池
c3p0是目前最流行的开源数据库连接池之一,它实现了DataSource数据源接口,支持JDBC2和JDB3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和Spring使用功能的都是该数据源。c3p0连接数据库示例(通过配置文件方式),注意:配置文件名称必须是c3p0-config.xml,该文件必须放在工程bin目录下。下载地址:https://sourceforge.net/projects/c3p0/?source=typ_redirect
配置文件c3p0-config.xml为:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://192.168.1.150/test</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">teamtalk</property>
<property name="password">123456</property> <property name="checkoutTimeout">3000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config> <named-config name="demo">
<property name="jdbcUrl">jdbc:mysql://192.168.1.150/test</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">teamtalk</property>
<property name="password">123456</property> <property name="checkoutTimeout">3000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</named-config> </c3p0-config>
package server; import java.sql.Connection;
import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DemoDBCP {
public static DataSource ds = null; static {
ComboPooledDataSource cpds = new ComboPooledDataSource();
ds = cpds;
} public static void main(String[] args) throws SQLException {
Connection connection = (Connection) ds.getConnection();
java.sql.DatabaseMetaData metaData = connection.getMetaData(); System.out.println(metaData.getURL());
System.out.println(metaData.getUserName());
System.out.println(metaData.getDriverName());
}
}
参考
Java JDBC高级特性的更多相关文章
- JDBC高级特性(一)结果集,批量更新
一.ResultSet的高级特性 1 可滚动ResultSet 1)向前和向后滚动 滚动特性 在JDBC初期版本号中, ResultSet仅能向前滚动 在JDBC兴许版本号中, ResultSet默认 ...
- JDBC高级特性(二)事务、并发控制和行集
一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommi ...
- 云端卫士实战录 | Java高级特性之多线程
<实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...
- java_day06_java高级特性
Advance Java Programming 第六章: java语言高级特性(part1) 1.static修饰符 1)static变量 在类中,使用static修饰的成员变量,就是静态变量,反之 ...
- 《Java核心技术 卷II 高级特性(原书第9版)》
<Java核心技术 卷II 高级特性(原书第9版)> 基本信息 原书名:Core Java Volume II—Advanced Features(Ninth Edition) 作者: ( ...
- java高级特性增强
第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...
- paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...
- Java高级特性-String、StringBuffer和StringBuilder
Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...
随机推荐
- Quartz.NET开源作业调度框架系列(二):CronTrigger
CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...
- Ouibounce – 在用户离开你网站时显示模态弹窗
Ouibounce 是一个微小的库,用于实现在用户离开你的网站的时候显示一个模式窗口.这个库可以帮助你增加着陆页的转换率. Ouibounce 会在当鼠标光标移动到接近(或通过)视口(viewport ...
- 分享25个新鲜出炉的 Photoshop 高级教程
网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ...
- CSS常用标签
CSS常用标签 一 CSS文字属性 color : #999999; /*文字颜色*/ font-family : 宋体,sans-serif; /*文字字体*/ font-size : 9pt; / ...
- ReactNative ScrollView或ListView头部莫名其妙多了20px
之前在还没有加TabBarIOS时,ScrollView一直是好好的,然后随着深入,需要做其他tab页面的时候问题来了,当我把首页加入TabBarIOS.Item时..我首页中的ScrollView头 ...
- clang LLVM 介绍和安装(Ubuntu10 64位)
http://www.csdn.net/article/2013-11-27/2817632 的对Stanley B.Lippman采访提到clang的一些优点,以前程序员杂志也写过,为了提高系统的性 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q92-Q94)
Question 92 You are designing a SharePoint 2010 application. You need to make sure the application ...
- UINavigationController和UIScrollView一起使用时导致UIScrollView位置偏移
iOS7之后,当UIViewController成为UINavigationController的控制视图,UIViewController的控制视图上的第一个子视图是UIScrollView,UIS ...
- 转 用C API 操作MySQL数据库
用C API 操作MySQL数据库 参考MYSQL的帮助文档整理 这里归纳了C API可使用的函数,并在下一节详细介绍了它们.请参见25.2.3节,“C API函数描述”. 函数 描述 mysql_a ...
- ParagraphString - 段落样式的简易处理
ParagraphString - 段落样式的简易处理 效果 源码 https://github.com/YouXianMing/UI-Component-Collection 中的 Paragrap ...