java学习(22)--JDBC(二)

来源:互联网 发布:剑网3莫雨捏脸数据 编辑:程序博客网 时间:2024/06/06 09:46

java学习(22)--JDBC(二)

这篇接着来写关于JDBC的内容。

1.JDBC进行批处理

1.1 批处理

一次操作只能发送一条sql语句到数据库服务器,效率并不高;

如果要插入很多条记录,速度太慢,使用sql缓存区,一次发送多条sql到数据库服务器执行。这种做法就叫做批处理。

注意:每此批处理之后,要清空缓冲区!

1.2 JDBC批处理的API

Statement批处理:

void addBatch(String sql)  添加sql到缓存区(暂时不发送)

int[] executeBatch() 执行批处理命令。 发送所有缓存区的sql

void clearBatch()  清空sql缓存区

例如:插入两千条数据,代码示例:
private static void testStatementBatch() {Connection conn = null;Statement stmt = null;try {//获取连接对象conn = JDBCUtil.getConn();stmt = conn.createStatement();for (int i = 1; i <= 2000; i++) {//定义Sql语句String sql = "insert into student values("+i+",'stu');";stmt.addBatch(sql);if(i%20==0){stmt.executeBatch();stmt.clearBatch();}}System.out.println("数据插入完成");} catch (Exception e) {e.printStackTrace();}finally{JDBCUtil.close(conn, stmt, null);}}

PreparedStatement批处理:

void addBatch() 添加参数到缓存区

int[] executeBatch() 执行批处理命令。 发送所有缓存区的sql

void clearBatch()  清空sql缓存区

private static void testPreparedStatementBatch() {Connection conn = null;PreparedStatement stmt = null;try {//获取连接对象conn = JDBCUtil.getConn();//定义Sql语句String sql = "insert into student values(?,?);";//预编译stmt = conn.prepareStatement(sql);for (int i = 1; i <= 2000; i++) {stmt.setInt(1, i);stmt.setString(2, "stu");stmt.addBatch();if(i%20==0){stmt.executeBatch();stmt.clearBatch();}}System.out.println("数据插入完成");} catch (Exception e) {e.printStackTrace();}finally{JDBCUtil.close(conn, stmt, null);}}

2.JDBC获取自增长值

分析:在一张表中插入数据的同时,在另外一张表中插入与之数据相关的数据,比如外键依赖,用到上篇文章所建的数据库:
/**1.给部门表中插入一个新的部门“财务部”2.获取财务部对应的id3.给员工表中插入一条员工数据,对应的部门就是财务部对应的id * */public class Test {public static void main(String[] args) {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {//获取连接conn = JDBCUtil.getConn();//定义sqlString sql1 = "insert into dept(name) values(?);"; String sql2 = "insert into employee(name,deptId) values(?,?);";stmt = conn.prepareStatement(sql1, Statement.RETURN_GENERATED_KEYS);stmt.setString(1, "财务部");stmt.executeUpdate();rs = stmt.getGeneratedKeys();int deptId = 0;while(rs.next()){deptId = rs.getInt(1);}stmt = conn.prepareStatement(sql2);stmt.setString(1, "employ1");stmt.setInt(2, deptId);stmt.executeUpdate();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally{//释放资源JDBCUtil.close(conn, stmt, rs);}}}

3.JDBC处理大数据文件

3.1 什么是大容量

字符:

存储字符内容: mysqlchar(0-255)  varchar(0-65535)  长度有限的。

大容量的字符字段:

mysqltext64K)   longtext(4G字符内容)

oracle :  clob   longclob

字节:

mysqlblob65kb)   mediumblob16mb)  longblog4GB

oracle:   blob


3.2 jdbc操作字符文件

3.2.1给数据库存储大容量文本文件

private static void writer() {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {//获取连接conn = JDBCUtil.getConn();//定义sqlString sql = "insert into news values(?,?)";//创建PreparedStatement对象stmt = conn.prepareStatement(sql);//设置值stmt.setInt(1, 1);stmt.setClob(2, new FileReader("1.txt"));//发送sql语句并执行int count = stmt.executeUpdate();System.out.println("数据插入完成!");System.out.println("影响行数:"+count);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally{//释放资源JDBCUtil.close(conn, stmt, null);}}


3.2.2从数据库读取大容量文本,保存到本地

private static void reader() {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {//获取连接conn = JDBCUtil.getConn();//定义sqlString sql = "select * from news;";//创建PreparedStatement对象stmt = conn.prepareStatement(sql);//查询rs = stmt.executeQuery();FileWriter fw = new FileWriter("2.txt");while(rs.next()){Reader reader = rs.getCharacterStream(2);char[] chs = new char[1024];int len;while((len = reader.read(chs))!=-1){fw.write(chs, 0, len);fw.flush();}//释放资源fw.close();reader.close();}System.out.println("数据存储完成!");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally{//释放资源JDBCUtil.close(conn, stmt, null);}}


3.3 jdbc操作字节文件

3.3.1存储大容量文件到数据库(图片,音乐...)

private static void write() {Connection conn = null;PreparedStatement stmt = null;try {//获取连接conn = JDBCUtil.getConn();//sqlString sql = "insert into attachment values(?,?);";//创建preparedstatement对象stmt = conn.prepareStatement(sql);//赋值stmt.setString(1, "小清新");stmt.setBlob(2, new FileInputStream("a.jpg"));//发送sql语句int count = stmt.executeUpdate();System.out.println("数据插入完成!");System.out.println("影响行数:"+count);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally{//释放资源JDBCUtil.close(conn, stmt, null);}}


3.3.2从数据库读取大容量文件保存到本地

private static void read() {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {//获取连接conn = JDBCUtil.getConn();//sqlString sql = "select * from attachment;";//创建preparedstatement对象stmt = conn.prepareStatement(sql);rs = stmt.executeQuery();while(rs.next()){String title = rs.getString(1);InputStream is = rs.getBinaryStream(2);FileOutputStream fos = new FileOutputStream("b.jpg");byte[] chs = new byte[1024];int len;while((len = is.read(chs))!=-1){fos.write(chs, 0, len);}//关流fos.close();is.close();}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally{//释放资源JDBCUtil.close(conn, stmt, rs);}}

4.数据库事务

4.1 事务:

把多条sql语句看做一个事务,那么这个事务要么一起成功,要么一起失败


4.2 mysql事务操作命令

set autocommit =0 / 1; 设置是否自动提交事务

1: 表示自动提交事务,每执行一条sql语句,自动提交事务。

0: 表示关闭自动提交事务。

commit;    提交事务,一旦提交事务不能回滚

rollback;  回滚事务。回滚到事务的起始点。


4.3 jdbc事务操作

Connection.setAutoCommit(false)  开启事务

Connection.commit();  成功执行,最后提交事务

Connection.rollback();  一旦遇到错误,回滚事务


4.4代码模拟实现事务
案例:对于账户的金钱数据进行处理,使用事务处理的方法
public static void main(String[] args) {Connection conn = null;PreparedStatement stmt = null;try {conn = JDBCUtil.getConn();String sql1 = "update account set balance= balance-1000 where name='s1';";String sql2 = "update account set balance= balance+1000 where name='s2';";//设置为手动提交,开启事物conn.setAutoCommit(false);stmt = conn.prepareStatement(sql1);stmt.executeUpdate();//int b = 1/0;stmt = conn.prepareStatement(sql2);stmt.executeUpdate();conn.commit();System.out.println("转账成功!");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();try {conn.rollback();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}finally{JDBCUtil.close(conn, stmt, null);}}

4.5 事务4大特性:

(1)原子性: 要么一起成功过,要么一起失败

(2)一致性: 数据库应该从一个一致性的状态到另一个一致性的状态,保持不变

(3)隔离性: 多个并发事务直接应该可以相互隔离

(4)持久性: 事务一旦提交,应该永久保持下来。


原创粉丝点击