JDBC(Java Data Base Connectivity)高级用法

2023-11-02 18:58

本文主要是介绍JDBC(Java Data Base Connectivity)高级用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、批处理
Batch
对于大量的批处理,建议使用statement,因为PreparedStatement的预编译空间有限,当数据量特别大时,会发生异常。

示例

package com.lgd.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;/*** 批处理* @author liguodong*/public class Demo05 {public static void main(String[] args) {Connection connection = null;Statement  statement = null;ResultSet rs1 = null;try {//1、加载驱动类Class.forName("com.mysql.jdbc.Driver");//2、建立与数据库的连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");connection.setAutoCommit(false);//设置为手动提交           statement = connection.createStatement();           long start = System.currentTimeMillis();for(int i=0;i<20000;i++){statement.addBatch("insert into user(username,pwd,regTime) values ('神舟"+i+"号',666666,NOW())");}           statement.executeBatch();           connection.commit();//提交事务          long end = System.currentTimeMillis();          System.out.println("批量插入数据耗时(毫秒):"+(end-start));} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally{//执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!if(rs1!=null){try {rs1.close();} catch (SQLException e) {e.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

运行结果:

二、事务
(一)事务基本概念
一组要么同时执行成功,要么同时执行失败的SQL语句,是数据库操
作的一个执行单元!

事务开始于:
连接到数据库上,并执行一条DML语句(INSERT、UPDATE或DELETE)。
前一个事务结束后,又输入了另外一条DML语句。

事务结束于:
执行COMMIT或ROLLBACK语句。
执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执行COMMIT语句。
执行一条DCL语句,例如GRANT语句;在这种情况下,会自动执行COMMIT语句。
断开与数据库的连接。
执行了一条DML语句,该语句却失败了;在这种情况中,会为这个无效的DML语句执行ROLLBACK语句

事务的四大特点(ACID)
atomicity(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。

consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态。

isolation(隔离性)
事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

durability(持久性)
持久性事务完成之后,它对于系统的影响是永久性的。

事务隔离级别由低到高
读取未提交(Read Uncommitted)
读取已提交(Read Committed) (默认)
可重复读(Repeatable Read)
序列化(serializable)

示例:

package com.lgd.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** 事务的用法* @author liguodong**/public class Demo07 {@SuppressWarnings("null")public static void main(String[] args) {Connection connection = null;PreparedStatement  statement1 = null;PreparedStatement  statement2 = null;try {//1、加载驱动类Class.forName("com.mysql.jdbc.Driver");//2、建立与数据库的连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");connection.setAutoCommit(false);//JDBC中默认自动提交事务,默认是tureString sql1 = "insert into user (username,pwd) values(?,?)";statement1 = connection.prepareStatement(sql1);statement1.setObject(1, "卡特琳娜");statement1.setObject(2, "666");System.out.println("插入一条记录");try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}String sql2 = "insert into user (username,pwd) values(?,?,?)";statement2 = connection.prepareStatement(sql2);statement2.setObject(1, "提莫快跑");statement2.setObject(2, "666");     statement2.executeUpdate();System.out.println("插入另外一条记录");connection.commit();//提交事务} catch (ClassNotFoundException e) {e.printStackTrace();try {connection.rollback(); //回滚操作} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}} catch (SQLException e) {e.printStackTrace();}finally{//执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!if(statement2!=null){try {statement2.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(statement1!=null){try {statement1.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}

运行结果:
会报SQL异常,并执行回滚操作,因此一条数据也不会插入到数据库中。

三、时间类型
java.util.Date
子类:java.sql.Date 表示年月日
子类:java.sql.Time 表示时分秒
子类:java.sql.Timestamp 表示年月日时分秒

日期比较处理
插入随机日期
取出指定日期范围的记录

示例

package com.lgd.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;/*** 时间处理(java.sql.Date, java.sql.Time, java.sql.Timestamp)* @author liguodong**/public class Demo08 {public static void main(String[] args) {Connection connection = null;PreparedStatement  statement = null;Statement rs1 = null;try {//1、加载驱动类Class.forName("com.mysql.jdbc.Driver");//2、建立与数据库的连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");//3、测试PreparedStatement的基本用法   ?占位符String sql1 = "insert into user(username,pwd,regTime,lastLoginTime) values(?,?,?,?)";statement = connection.prepareStatement(sql1);statement.setObject(1, "模特");statement.setObject(2, "mm");//java.sql.Date没有空构造器,必须要传值。java.sql.Date date = new java.sql.Date(System.currentTimeMillis());//如果需要指定日期,可以使用Calendar,DateFormatjava.sql.Timestamp stamp = new java.sql.Timestamp(System.currentTimeMillis());statement.setObject(3, date);statement.setTimestamp(4, stamp);statement.executeUpdate();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally{//执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!if(rs1!=null){try {rs1.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}

运行结果:

package com.lgd.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;/*** 产生随机时间* @author liguodong**/public class Demo09 {public static void main(String[] args) {Connection connection = null;PreparedStatement  statement = null;Statement rs1 = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");for(int i=0; i<1000; i++){String sql1 = "insert into user(username,pwd,regTime,lastLoginTime) values(?,?,?,?)";statement = connection.prepareStatement(sql1);statement.setObject(1, "模特"+i);statement.setObject(2, "mm");//产生随机数int   rand = 1000000+new Random().nextInt(100000000);//java.sql.Date没有空构造器,必须要传值。java.sql.Date date = new java.sql.Date(System.currentTimeMillis()-rand);//如果需要指定日期,可以使用Calendar,DateFormatjava.sql.Timestamp stamp = new java.sql.Timestamp(System.currentTimeMillis()-rand);             statement.setObject(3, date);               statement.setTimestamp(4, stamp);statement.executeUpdate();}   } catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally{           //执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!if(rs1!=null){try {rs1.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}

运行结果:

package com.lgd.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;/*** 时间处理,取出指定时间段的数据* @author liguodong*/public class Demo09 {public static void main(String[] args) {Connection connection = null;PreparedStatement  statement = null;ResultSet rs1 = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");            statement = connection.prepareStatement("select * from user where lastLoginTime>? and lastLoginTime<? order by lastLoginTime");java.sql.Timestamp startDate = new java.sql.Timestamp(strDate("2015-5-4 20:30:30"));java.sql.Timestamp endDate = new java.sql.Timestamp(strDate("2015-5-4 21:0:30"));System.out.println(startDate+"--"+endDate);statement.setObject(1, startDate);statement.setObject(2, endDate);rs1 = statement.executeQuery();while (rs1.next()) {//取的时候既可以用索引,还可以用名字。System.out.println(rs1.getInt("id")+"---"+rs1.getString("username")+"---"+rs1.getDate("regTime")+"---"+rs1.getTimestamp("lastLoginTime"));  //System.out.println(rs1.getInt(1)+"---"+rs1.getString(2)+"---"+rs1.getDate(4)+"---"+rs1.getTimestamp(5));}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally{//执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!if(rs1!=null){try {rs1.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}/*** 将字符串代表的日期转化为long数字(格式:yyyy-MM-dd hh:mm:ss)* @param dateString* @return*/public static long strDate(String dateString){DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");try {return format.parse(dateString).getTime();} catch (ParseException e) {e.printStackTrace();return 0;}}   
}

运行结果:
2015-05-04 20:30:30.0–2015-05-04 21:00:30.0
1886—模特882—2015-05-04—2015-05-04 20:31:07.0
1123—模特119—2015-05-04—2015-05-04 20:32:23.0
1048—模特44—2015-05-04—2015-05-04 20:40:20.0
1115—模特111—2015-05-04—2015-05-04 20:41:41.0
1300—模特296—2015-05-04—2015-05-04 20:43:28.0
1011—模特7—2015-05-04—2015-05-04 20:52:44.0
1716—模特712—2015-05-04—2015-05-04 20:53:39.0
1388—模特384—2015-05-04—2015-05-04 20:59:33.0

四、CLOB(Character Large Object)
用于存储大量的文本数据
大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。

Mysql中相关类型:
TINYTEXT最大长度为255(2^8-1)字符的TEXT列。
TEXT[(M)]最大长度为65535(2^16-1)字符的TEXT列。
MEDIUMTEXT最大长度为16777215(2^24一1)字符的TEXT列。
LONGTEXT最大长度为4294967295或4GB(2^32一1)字符的TEXT列。

示例

package com.lgd.jdbc;import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** CLOB文本大对象的使用* 包含:将字符集、字符串内容插入到数据库的CLOB字段、将CLOB字段值取出来* @author liguodong**/public class Demo10 {public static void main(String[] args) {Connection conn = null;PreparedStatement  ps = null;ResultSet rs = null;Reader reader = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");          /输入/////ps = conn.prepareStatement("insert into user(username,myInfo) values(?,?)");/*ps.setString(1, "风城玫瑰");//将文本文件字节输入到数据库中ps.setClob(2, new FileReader(new File("d:/rose.txt")));     ps.executeUpdate();ps.setString(1, "风城玫瑰");//将程序中的字符串输入到数据库的CLOB字段中ps.setClob(2, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("司职控球后卫,最年轻的MVP".getBytes()))));ps.executeUpdate();*//导出///          ps = conn.prepareStatement("select * from user where id=?");ps.setObject(1, 2006);rs = ps.executeQuery();while(rs.next()){java.sql.Clob clob = rs.getClob("myInfo");reader = clob.getCharacterStream();int temp=0;while((temp=reader.read())!=-1){System.out.print((char)temp);}}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(reader!=null){try {reader.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!if(rs!=null){try {rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(ps!=null){try {ps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}

运行结果:

五、BLOB(Binary Large Object)
用于存储大量的二进制数据
大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。
Mysql中相关类型:
一TINYBLOB最大长度为255(2^8-1)字节的BLOB列。
一BLOB[(M)]最大长度为65535(2^16-1)字节的BLOB列。
一MEDIUMBLOB最大长度为16777215(2^24-1)字节的BLOB列。
一LONGBLOB最大长度为4294967295或4GB(2^32-1)字节的BLOB列。

示例

package com.lgd.jdbc;import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** BLOB文本大对象的使用* 包含:将字符集、字符串内容插入到数据库的CLOB字段、将CLOB字段值取出来* @author liguodong**/public class Demo11 {public static void main(String[] args) {Connection conn = null;PreparedStatement  ps = null;ResultSet rs = null;InputStream is = null;OutputStream os = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");          /输入////*ps = conn.prepareStatement("insert into userblob (username,headImg) values (?,?) ");ps.setString(1, "sunshine");//将图片输入到数据库中//方式一ps.setBlob(2,new FileInputStream(new File("d:/sunshine.png")));ps.execute();//方式二FileInputStream fis = new FileInputStream("d:/sunshine.png");ps.setBinaryStream(2, fis,fis.available());ps.execute();*//导出///          ps = conn.prepareStatement("select * from userblob where id=?");ps.setObject(1, 1);rs = ps.executeQuery();while(rs.next()){java.sql.Blob blob = rs.getBlob("headImg");is = blob.getBinaryStream();os = new FileOutputStream("d:/coco.png");int temp=0;while((temp=is.read())!=-1){//System.out.print((char)temp);os.write(temp);}           }           } catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally{          if(os!=null){try {os.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(is!=null){try {is.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(rs!=null){try {rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(ps!=null){try {ps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}

运行结果:

这篇关于JDBC(Java Data Base Connectivity)高级用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/332611

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交