一、目录

二、概述

简述

  JDBC是什么?JDBC英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API,根本上说JDBC是一种规范,它提供的接口,一套完整的,允许便捷式访问底层数据库。可以用JAVA来写不同类型的可执行文件:JAVA应用程序、JAVA Applets、Java Servlet、JSP等,不同的可执行文件都能通过JDBC访问数据库,又兼备存储的优势。简单说它就是JAVA与数据库的连接的桥梁或者插件,用JAVA代码就能操作数据库的增删改查、存储过程、事务等。

  JDBC有什么用?我们用JAVA就能连接到数据库;创建SQL或者MYSQL语句;执行SQL或MYSQL的查询数据库;查看和修改结果记录。

  我们思考一下?数据库是由不同生产产商决定的,例如Mysql、Oracle、SQL Server,而如果JAVA JDK不可能说提供对不同数据库的实现吧?还有,JAVA具备天生跨平台的优势,它就提供了JDBC的接口API,具体的实现由不同的生产产商决定。这样,数据库生产产商都根据JAVA API去实现各自的应用驱动,这问题就迎刃而解了。

  JDBC的工作原理是什么?我将在下一篇文章叙述JDBC运用的设计模式,以及部分JDK源码。

工作原理图(转自百度百科)

        

常用接口

   提供的接口包括:JAVA API:提供对JDBC的管理链接;JAVA Driver API:支持JDBC管理到驱动器连接。

   DriverManager:这个类管理数据库驱动程序的列表,查看加载的驱动是否符合JAVA Driver API的规范。

   Connection:与数据库中的所有的通信是通过唯一的连接对象。

   Statement:把创建的SQL对象,转而存储到数据库当中。

   ResultSet:它是一个迭代器,用于检索查询数据。

三、快速入门

操作流程图

数据类型图

 数字类型

 时间日期类型

 字符串类型

实例练习

1、Connection

public class JDBCUtil {
//Driver类全名
public static String DRIVER="com.mysql.jdbc.Driver";
//jdbc协议:子协议://ip:端口号/数据库名
public static String URL="jdbc:mysql://localhost:3306/test";
//数据库用户名
public static String USERNAME="root";
//数据库密码
public static String PASSWORD="root";
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> Connection connection=<span style="color: #0000ff;">null</span><span style="color: #000000;">;

</span><span style="color: #008000;">/**</span><span style="color: #008000;">
* 获取JDBC连接
* </span><span style="color: #808080;">@return</span>
<span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> Connection getConnection(){
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
</span><span style="color: #008000;">//</span><span style="color: #008000;">加载驱动程序:它通过反射创建一个driver对象。</span>

Class.forName(DRIVER);

        </span><span style="color: #008000;">//</span><span style="color: #008000;">获得数据连接对象。
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 在返回connection对象之前,DriverManager它内部会先校验驱动对象driver信息对不对,我们只要知道内部过程即可。</span>
connection=<span style="color: #000000;"> DriverManager.getConnection(URL,USERNAME,PASSWORD);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> connection;
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
e.printStackTrace();
}
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span><span style="color: #000000;">;
} </span><span style="color: #008000;">/**</span><span style="color: #008000;">
* 通过读取文件连接
* </span><span style="color: #808080;">@param</span><span style="color: #008000;"> fileName
* </span><span style="color: #808080;">@return</span><span style="color: #008000;">
* </span><span style="color: #808080;">@throws</span><span style="color: #008000;"> SQLException
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> Connection getConnectionByLoadSettingFile(String fileName) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException {
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
文件里面的内容:跟上面的常量一模一样
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
</span><span style="color: #008000;">*/</span><span style="color: #000000;">
Properties props</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> Properties();
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
</span><span style="color: #008000;">//</span><span style="color: #008000;">我的properties文件是放在src根目录下的</span>
InputStream in=DBUtil.<span style="color: #0000ff;">class</span>.getResourceAsStream("/"+<span style="color: #000000;">fileName);
</span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">null</span>==<span style="color: #000000;">in)
System.out.println(</span>"找不到文件:"+<span style="color: #000000;">fileName);
props.load(in);
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
e.printStackTrace();
}
String driver</span>=props.getProperty("jdbc.driver"<span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">null</span>!=<span style="color: #000000;">driver)
System.setProperty(</span>"jdbc.drivers"<span style="color: #000000;">,driver);
String url</span>=props.getProperty("jdbc.url"<span style="color: #000000;">);
String username</span>=props.getProperty("jdbc.username"<span style="color: #000000;">);
String password</span>=props.getProperty("jdbc.password"<span style="color: #000000;">);
connection</span>=<span style="color: #000000;">DriverManager.getConnection(url,username,password);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> connection;
}

}

2、Statement

public class MyClient {
public static void main(String [] args) throws SQLException {
Connection connection=null;
Statement statement=null;
    connection</span>=<span style="color: #000000;">JDBCUtil.getConnection();
statement</span>=<span style="color: #000000;">connection.createStatement();
</span><span style="color: #008000;">//</span><span style="color: #008000;">需要在自己的数据库当中建立一张user表</span>
String sql="insert into user(loginName,userName,password,sex)values('tom123','tom','123456',1)"<span style="color: #000000;">;
statement.executeUpdate(sql);
}

}

3、PareparedStatement

public class MyClient {
public static void main(String [] args) throws SQLException {
Connection connection=null;
PreparedStatement pStatement=null;
    connection</span>=<span style="color: #000000;">JDBCUtil.getConnection();
String sql</span>="insert into user(loginName,userName,password,sex)values(?,?,?,?)"<span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;">预编译</span>
pStatement=<span style="color: #000000;">connection.prepareStatement(sql);
</span><span style="color: #008000;">//</span><span style="color: #008000;">前面的索引对应上面的问号,传递参数。</span>
pStatement.setString(1,"tom123"<span style="color: #000000;">);
pStatement.setString(</span>2,"tom"<span style="color: #000000;">);
pStatement.setString(</span>3,"123456"<span style="color: #000000;">);
pStatement.setInt(</span>4,1<span style="color: #000000;">);
pStatement.executeUpdate();
}

}

4、ResultSet

public class MyClient {
public static void main(String [] args) throws SQLException {
Connection connection=null;
Statement statement=null;
ResultSet resultSet;
    connection</span>=<span style="color: #000000;">JDBCUtil.getConnection();
String sql</span>="select * from user"<span style="color: #000000;">;
statement</span>=<span style="color: #000000;">connection.createStatement();
</span><span style="color: #008000;">//</span><span style="color: #008000;">resultSet就是一个迭代器,里面的方法跟迭代器几乎一致。</span>
resultSet=<span style="color: #000000;">statement.executeQuery(sql);
</span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (resultSet.next()){
String loginName</span>=resultSet.getString("loginName"<span style="color: #000000;">);
String userName</span>=resultSet.getString("userName"<span style="color: #000000;">);
String password</span>=resultSet.getString("password"<span style="color: #000000;">);
</span><span style="color: #0000ff;">int</span> sex=resultSet.getInt("sex"<span style="color: #000000;">);
System.out.println(loginName</span>+"-"+userName+"-"+password+"-"+<span style="color: #000000;">sex);
}
}

}

四、可滚动和可更新的结果集

相关参数

//了解数据集可滚动更新:查看ResultSet接口的几个参数

  /** 结果集不能滚动(默认值)*/
int TYPE_FORWARD_ONLY = 1003;
</span><span style="color: #008000;">/** 结果集可以滚动,但对数据库变化不敏感</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">int</span> TYPE_SCROLL_INSENSITIVE = 1004<span style="color: #000000;">; </span><span style="color: #008000;">/**结果集可以滚动,且对数据库变化敏感</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">int</span> TYPE_SCROLL_SENSITIVE = 1005<span style="color: #000000;">;

  
  /**结果集不能用于更新数据库(默认值)*/

int CONCUR_READ_ONLY = 1007;

</span><span style="color: #008000;">/**结果集可以用于更新数据库</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">int</span> CONCUR_UPDATABLE = 1008<span style="color: #000000;">;

可滚动可更新

注意:可滚动简单说就是设置结果集可更新resultSet目前的游标值。可更新就是可以更新结果集里面的增删改查。可更新简单说,就是获取数据集ResultSet以后改动更加灵活。

public class Client {
public static void main(String [] args){
Connection connection=null;
PreparedStatement pStatement=null;
Statement statement=null;
ResultSet resultSet=null;
try {
connection=DBUtil.getInstance().getConnection();
//第一个参数设置是否可以滚动,第二个参数设置是否可更新
statement=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from user";
ResultSet rs=statement.executeQuery(sql);
        </span><span style="color: #008000;">/**</span><span style="color: #008000;">可滚动的几个方法
rs.previous();
rs.next();
rs.getRow();
rs.absolute(0);
*</span><span style="color: #008000;">*/</span> <span style="color: #008000;">//</span><span style="color: #008000;">往数据集里面插入数据同时更新到数据:从表的最后开始插入。</span>
rs.moveToInsertRow();<span style="color: #008000;">//</span><span style="color: #008000;">把游标移动到插入行,默认在最后一行。</span>
rs.updateString("loginName","小白脸"<span style="color: #000000;">);
rs.updateString(</span>"userName","大猩猩"<span style="color: #000000;">);
rs.updateString(</span>"password","123"<span style="color: #000000;">);
rs.updateInt(</span>"sex",100<span style="color: #000000;">);
rs.insertRow();
rs.moveToCurrentRow();</span><span style="color: #008000;">//</span><span style="color: #008000;">把游标移动最后一个位置 </span><span style="color: #008000;">//</span><span style="color: #008000;">删除第十行数据</span>
rs.absolute(10<span style="color: #000000;">);
rs.deleteRow(); </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(rs.next()){
System.out.println(rs.getString(</span>2<span style="color: #000000;">));
</span><span style="color: #008000;">//</span><span style="color: #008000;">把数据集里的数据中的性别全部更新为0</span>
rs.updateInt("sex",0<span style="color: #000000;">);
rs.updateRow();
}
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (SQLException e) {
e.printStackTrace();
}
}

}

五、事务

问题思考

  事务是什么?我们将一组语句构成一个事务。当所有语句都是顺利执行以后,事务可以被提交。否则,如果其中某个语句遇到错误,那么事务将被回滚,就好像任何语句都没有被执行一样。

  实际用例。假设我们需要将钱从一个银行账号转移到另外一个账号。此时,一个非常重要的问题就是我们必须同时将钱从一个账号取出并且存入另一个账号。如果在将钱存入其他账号之前系统发生崩溃,那么我们必须撤销取款操作。

  事务有什么特性或者说有什么作用?

  • 原子性:最小的单元,如果一个是失败了,则一切的操作将全部失败。
  • 一致性:如果事务出现错误,则回到最原始的状态
  • 隔离性:多个事务之间无法访问,只有当事务完成后才可以看到结果
  • 持久性:当一个系统崩溃时,一个事务依然可以提交,当事务完成后,操作结果保存在磁盘中,不会被回滚

保存点与批量更新

保存点与事务的接口源码

public interface Connection  extends Wrapper, AutoCloseable {
/** 设置提交方式:自动还是手动*/
void setAutoCommit(boolean autoCommit) throws SQLException;
</span><span style="color: #0000ff;">boolean</span> getAutoCommit() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException;

</span><span style="color: #008000;">/**</span><span style="color: #008000;">提交事务</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">void</span> commit() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException;

/**事务回滚*/

void rollback() throws SQLException;

</span><span style="color: #008000;">/**</span><span style="color: #008000;">设置保存点</span><span style="color: #008000;">*/</span><span style="color: #000000;">
Savepoint setSavepoint() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException; Savepoint setSavepoint(String name) </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException; </span><span style="color: #008000;">/**</span><span style="color: #008000;">回滚到保存点</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">void</span> rollback(Savepoint savepoint) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException; </span><span style="color: #008000;">/**</span><span style="color: #008000;">释放保存点资源</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">void</span> releaseSavepoint(Savepoint savepoint) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException;

}

public interface Statement extends Wrapper, AutoCloseable {

/**加入到批量处理队列*/

void addBatch( String sql ) throws SQLException;

</span><span style="color: #0000ff;">void</span> clearBatch() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException;

</span><span style="color: #008000;">/**</span><span style="color: #008000;">执行批量处理队列</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">int</span>[] executeBatch() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException;

}

什么是保存点?使用保存点可以更细粒度地控制回滚操作,而不用每次都退回到初始点。

什么又是批量更新?批量更新包括批量增删改,当我们一次性要插入很多条数据的时候,假设我们每次提交一次又获取数据库连接一次,然后又关闭数据库连接,而且数据库连接是一个耗时操作,这样会大大降低性能,后续文章我会对这部分内容进行详细叙述。而批量更新呢,则先把数据放入一个队列里,并没有真正存入数据库中,当调用commit()方法的时候,队列的数据的操作一次性收集和提交。

public class Client {
public static void main(String [] args) throws SQLException {
long time=System.currentTimeMillis();
Connection connection=null;
PreparedStatement pStatement=null;
boolean autoCommit=false;
Savepoint savepoint=null;
try {
connection=JDBCUtil.getConnection();
autoCommit=connection.getAutoCommit();
connection.setAutoCommit(false);
String sql="insert into user(loginName,userName,password,sex)values(?,?,?,?)";
pStatement=connection.prepareStatement(sql);
//设置保存点
savepoint=connection.setSavepoint("savePoint");
for(int i=0;i<1000;i++){
pStatement.setString(1,"tony"+i);
pStatement.setString(2,"user"+i);
pStatement.setString(3,i+"");
pStatement.setInt(4,i);
//添加到队列
pStatement.addBatch();
}
//批量执行
pStatement.executeBatch();
connection.commit();
    } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (SQLException e) {
e.printStackTrace();
</span><span style="color: #008000;">//</span><span style="color: #008000;">回滚到保存点</span>

connection.rollback(savepoint);

}finally {

//把事务提交设置为最初设置

connection.setAutoCommit(autoCommit);

}

long temp=System.currentTimeMillis()-time;

System.out.println(temp+"ms");

}

}

六、思考与总结

思考

  • 问题一:我们都知道获取JDBC连接是一个耗时操作。而我们查看教程的时候,提倡我们获取数据库连接,操作完毕以后要记得关闭,这样固然是正确的。但是,如果一个简单的操作就不停开启连接断开连接,这样会对性能大打折扣。
  • 问题二:JDBC的工作原理?还有它底部运用什么设计模式,让它能够自适应不同数据库产商的驱动呢?
  • 问题三:事务提交和普通提交的性能到底有多大的差别?

总结

  解决一:有一个概念叫做连接池,就是数据库连接这个耗时操作交个一个容器去管理。至于数据库什么时候连接什么时候被关闭,有几个数据库连接对象?这些完全托管给连接池,而不需要客户端去考虑,目前一个比较成熟的是c3p0的连接池。现在模拟一个单例的数据库连接,比较单例数据库连接与随开随关的性能比较。

工具类

public class DBUtil {
public static String DRIVER="com.mysql.jdbc.Driver";
public static String URL="jdbc:mysql://localhost:3306/test";
public static String USERNAME="root";
public static String PASSWORD="root";
</span><span style="color: #0000ff;">private</span>  Connection connection=<span style="color: #0000ff;">null</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> DBUtil(){
}
</span><span style="color: #008000;">/**</span><span style="color: #008000;">
* 获得DB工具类的对象,这种获取对象的方式慢慢被jdk推荐使用。
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> DBUtil getInstance(){
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> DBUtilClassInstance.dbUtil;
} </span><span style="color: #008000;">/**</span><span style="color: #008000;">
* 采用内部类单例模式:天然线程安全,延迟加载,调用效率高。若不了解,参考我的文章设计模式-单例模式
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> DBUtilClassInstance{
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> DBUtil dbUtil= <span style="color: #0000ff;">new</span><span style="color: #000000;"> DBUtil();
} </span><span style="color: #008000;">/**</span><span style="color: #008000;">
* 获取JDBC连接
* </span><span style="color: #808080;">@return</span>
<span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span><span style="color: #000000;"> Connection getConnection(){
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
</span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">null</span>!=connection &amp;&amp; !<span style="color: #000000;">connection.isClosed()){
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> connection;
}
Class.forName(DRIVER);
System.out.println(</span>"驱动程序加载成功!"<span style="color: #000000;">);
connection</span>=<span style="color: #000000;">DriverManager.getConnection(URL,USERNAME,PASSWORD);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> connection;
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
System.out.println(</span>"未找到驱动程序!"<span style="color: #000000;">);
e.printStackTrace();
}
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span><span style="color: #000000;">;
} </span><span style="color: #008000;">/**</span><span style="color: #008000;">
* 通过读取文件连接
* </span><span style="color: #808080;">@param</span><span style="color: #008000;"> fileName
* </span><span style="color: #808080;">@return</span><span style="color: #008000;">
* </span><span style="color: #808080;">@throws</span><span style="color: #008000;"> SQLException
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> Connection getConnectionByLoadSettingFile(String fileName) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SQLException {
</span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">null</span>!=connection &amp;&amp; !<span style="color: #000000;">connection.isClosed()){
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> connection;
}
Properties props</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> Properties();
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
InputStream in</span>=DBUtil.<span style="color: #0000ff;">class</span>.getResourceAsStream("/"+<span style="color: #000000;">fileName);
</span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">null</span>==<span style="color: #000000;">in)
System.out.println(</span>"找不到文件:"+<span style="color: #000000;">fileName);
props.load(in);
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
e.printStackTrace();
}
String driver</span>=props.getProperty("jdbc.driver"<span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">null</span>!=<span style="color: #000000;">driver)
System.setProperty(</span>"jdbc.drivers"<span style="color: #000000;">,driver);
String url</span>=props.getProperty("jdbc.url"<span style="color: #000000;">);
String username</span>=props.getProperty("jdbc.username"<span style="color: #000000;">);
String password</span>=props.getProperty("jdbc.password"<span style="color: #000000;">);
connection</span>=<span style="color: #000000;">DriverManager.getConnection(url,username,password);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> connection;
}<br /></span></pre>

性能比较

public class Client {
public static void main(String [] args){
long time=System.currentTimeMillis();
for(int i=0;i<100;i++){
User user=new User("loginName"+i,"userName"+i,"password"+i,i);
myThread thread=new myThread(user);
thread.run();
}
System.out.println(System.currentTimeMillis()-time+"ms");
}
} class myThread implements Runnable{
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> User user;

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> myThread(User user){
</span><span style="color: #0000ff;">this</span>.user=<span style="color: #000000;">user;
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
PreparedStatement pStatement</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;
Connection connection</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
connection</span>=DBUtil.getInstance().getConnectionByLoadSettingFile("db.properties"<span style="color: #000000;">);
String sql</span>="insert into user(loginName,userName,password,sex)value(?,?,?,?)"<span style="color: #000000;">;
pStatement</span>=<span style="color: #000000;">connection.prepareStatement(sql);
pStatement.setString(</span>1<span style="color: #000000;">,user.getLoginName());
pStatement.setString(</span>2<span style="color: #000000;">,user.getUserName());
pStatement.setString(</span>3<span style="color: #000000;">,user.getPassword());
pStatement.setInt(</span>4<span style="color: #000000;">,user.getSex());
pStatement.executeUpdate();
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
e.printStackTrace();
}</span><span style="color: #0000ff;">finally</span><span style="color: #000000;"> {
</span><span style="color: #008000;">//</span><span style="color: #008000;">注释掉这个方法就是代表数据库连接用完就随即关闭。</span>

DBUtil.getInstance().closePreparedStatement(pStatement);

DBUtil.getInstance().closeConnection(connection);

}

}

}

测试结果

  随开随关:7155ms。单例模式,最后一个数据库操作完毕再关闭:6211ms。

连接池的原理参考:http://www.cnblogs.com/doudouxiaoye/p/5708854.html

  解决二:在后续文章再介绍JDBC运用的设计模式以及部分源码分析,敬请期待。

  解决三:事务提交耗时测试(代码参考事务批量处理部分,不再重复写)。

  测试结果:单例模式,最后一个数据操作完成关闭批量更新耗时:69863ms。事务方式批量更新耗时:682ms。

深入浅出JDBC-快速入门的更多相关文章

  1. JDBC快速入门

    /** * JDBC快速入门: * 1.导入jar包 数据库驱动 * 2.注册驱动 * 3.获取数据库连接对象 Connection * 4.定义sql语句 * 5.获取发送执行sql语句的对象 St ...

  2. Java学习笔记36(jdbc快速入门)

    JDBC: Java DataBase Connectivity 是java程序连接存取数据库的应用程序接口 (是sun公司的程序员定义的一套操作数据库的规则,然后下面的各个公司如:mysql,sql ...

  3. Java学习:JDBC快速入门

    本节类容 JDBC基本概念 快速入门 JDBC基本概念 概念: Java DataBase Connectivity Java 数据库连接,Java语言操作数据库 JDBC本质: 其实是官方(sun公 ...

  4. JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务

    JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...

  5. JDBC快速入门教程

    JDBC是什么? JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API通常与数据库使用于: 连 ...

  6. JDBC之一:JDBC快速入门

    (1)下载Oracle的JDBC驱动,一般放在$ORACLE_HOME/jdbc/lib目录,关于驱动的版本请见: http://elf8848.iteye.com/blog/811037 随Orac ...

  7. [转]JDBC快速入门教程

    JDBC是什么? JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: ...

  8. [javaEE] JDBC快速入门

    JDBC:Java Data Base Connectivity java数据库连接 1.组成JDBC的两个包:主要是接口 java.sql javax.sql 2.相应JDBC的数据库实现 在tom ...

  9. day17-jdbc 3.jdbc快速入门

    通过java程序操作数据库. 对数据库操作是对记录的操作.记录就是DML和DCL. 只要Java程序跟任何设备进行了连接,用完之后必须释放资源.最简单基础班讲I/O流,Java跟文件进行了连接,用完之 ...

  10. JDBC 数据库连接 Java操作数据库 jdbc快速入门

    JDBC基本概念 Java DataBase Connectivity 数据库连接 java操作数据库 本质上(sun公司的程序员)定义的一套操作关系型数据库的规则 既接口  更新内容之前 代码 pa ...

随机推荐

  1. Windows 7 64 位操作系统安装 Ubuntu 17.10

    一.准备工作 1. DiskGenius:分区工具,为 Linux 建立单独的分区.(Linux 公社下载源) 2. UUI:Universal USB Installer,通用 U 盘安装器,用来制 ...

  2. MAC和PHY的区别 (转自http://www.cnblogs.com/feitian629/archive/2013/01/25/2876857.html)

    一块以太网网卡包括OSI(开方系统互联)模型的两个层.物理层和数据链路层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准.数据编码和电路等,并向数据链路层设备提供标准接口.数据链路层 ...

  3. mysql 创建数据库的时候选择 utf8 bin 和 utf8 ci的区别

    utf8 ci  不区分大小写: utf8 bin 区分大小写:

  4. 防范SQL注入

    使用占位符的方式写查询语句hibernate

  5. hdu 5692(dfs序+线段树,好题)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  6. JAVA 抽象类、接口

    一.抽象类 1.语法定义 在类前面使用 abstract 修饰的类就是抽象类 2.应用场景: (1)在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法. ( ...

  7. 洛谷P1482 Cantor表(升级版) 题解

    题目传送门 此题zha一看非常简单. 再一看特别简单. 最后瞟一眼,还是很简单. 所以在此就唠一下GCD大法吧: int gcd(int x,int y){ if(x<y) return gcd ...

  8. Geoffrey Hinton获得IEEE的麦克斯韦奖的颁奖辞

    2016年6月IEEE的麦克斯韦奖颁发给了机器学习的领军人物Geoffrey Hinton.颁奖辞十分优雅,同时简洁.凝练地解释了机器学习的最新进展以及神经网络的崛起.我忍不住翻译了一下. 颁奖辞 G ...

  9. 【LOJ】 #2521. 「FJOI2018」领导集团问题

    题解 这道题很显然可以想出来一个\(n^2\)的dp,也就是dp[u][i]表示以u为根的子树最大值是i的点集最大是多少(i是离散化后的值) 就是对于每个儿子处理出后缀最大值然后按位相加更新父亲,我们 ...

  10. Java 中 List 向前和向后遍历

    Java 中 List 向前和向后遍历 import java.util.*; public class TestCollectionIterator { public static void mai ...