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基础学习小结

Java JDBC高级特性的更多相关文章

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

    一.ResultSet的高级特性 1 可滚动ResultSet 1)向前和向后滚动 滚动特性 在JDBC初期版本号中, ResultSet仅能向前滚动 在JDBC兴许版本号中, ResultSet默认 ...

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

    一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommi ...

  3. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

  4. java_day06_java高级特性

    Advance Java Programming 第六章: java语言高级特性(part1) 1.static修饰符 1)static变量 在类中,使用static修饰的成员变量,就是静态变量,反之 ...

  5. 《Java核心技术 卷II 高级特性(原书第9版)》

    <Java核心技术 卷II 高级特性(原书第9版)> 基本信息 原书名:Core Java Volume II—Advanced Features(Ninth Edition) 作者: ( ...

  6. java高级特性增强

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

  7. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  8. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  9. Java高级特性-String、StringBuffer和StringBuilder

    Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...

随机推荐

  1. 高性能javascript学习笔记系列(3) -DOM编程

    参考 高性能javascript 文档对象模型(DOM)是独立于语言的,用于操作XML和HTML文档的程序接口API,在浏览器中主要通过DOM提供的API与HTML进行交互,浏览器通常会把DOM和ja ...

  2. Sharepoint 文档库根据文件夹层级展示

    类似于资源管理器,效果如下 步骤 打开Sharepoint Desinger,编辑Allitems.aspx页面 在PlaceHolderMain里面插入代码,黄色部分需要替换 <table s ...

  3. filezilla sftp 文件和linux 文件不同步的问题

    删除掉以前的链接,重新建立链接就好了

  4. PCM(Pulse-code modulation)脉冲编码调制

    在音频处理中,我们会经常听到PCM数据,那么什么是PCM数据呢? PCM数据就是模拟信号经过PCM以后的数字信号,PCM就是把音频信号由模拟信号(时间连续,取值连续)转为数字信号(时间离散,取值离散) ...

  5. 线程安全、数据同步之 synchronized 与 Lock

    本文Demo下载传送门 写在前面 本篇文章讲的东西都是Android开源网络框架NoHttp的核心点,当然线程.多线程.数据安全这是Java中就有的,为了运行快我们用一个Java项目来讲解. 为什么要 ...

  6. 一个UILabel不同部分显示不同颜色

    我们直接来看效果图吧: 需求:就是表格cell里面的状态Label,前面的"状态:"是黑色,后面的状态值是红色,他们在同一个Label上,怎么做呢? 解答:真的是会者不难,难者不会 ...

  7. ASP和ASP.NET发送邮件笔记

    这两天因公司网站邮件发不出去,然后研究了在asp网站发送邮件和在asp.net网站发送邮件的代码,把碰到的问题这里记录一下. 1.先说在asp.net中发送邮件吧, 刚开始只有126邮箱可以发出邮件, ...

  8. Ubuntu 安装Samba服务器

    1.安装 sudo apt-get update sudo apt-get install samba (如果出现库依赖问题可用命令sudo apt-get install samba libwbcl ...

  9. 我的Android第二章:Android目录结构

    嗨!各位,小编又和大家分享知识啦,在昨天的博客笔记中小编给大家讲解了如何去配置Android工具以及SDK中的一些配置,那在今天的学习小编会带给大家哪些Android知识呢?首先我们看一下今天的学习目 ...

  10. AndroidAnnotations简单示例

    @EActivity(R.layout.activity_main) public class MainActivity extends Activity { @ViewById(R.id.textV ...