一、批处理
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中默认自动提交事务,默认是ture
String 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 block
e1.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 block
e.printStackTrace();
}
}
if(statement1!=null){
try {
statement1.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.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,DateFormat
java.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 block
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.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,DateFormat
java.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 block
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.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 block
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.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 block
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.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 block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(os!=null){
try {
os.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
运行结果: