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 什么是大容量
字符:
存储字符内容: mysql:char(0-255) varchar(0-65535) 长度有限的。
大容量的字符字段:
mysql:text(64K) longtext(4G字符内容)
oracle : clob longclob
字节:
mysql:blob(65kb) mediumblob(16mb) longblog(4GB)
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)持久性: 事务一旦提交,应该永久保持下来。
阅读全文
0 0
- java学习(22)--JDBC(二)
- java jdbc学习整理二(接口)
- JDBC学习(二)
- JDBC学习(二)
- JDBC学习(二)
- jdbc学习总结(二)
- JDBC--学习笔记(二)
- JDBC学习笔记(二)
- java学习笔记(三十六)JDBC(二)
- Java JDBC学习实战(二): 管理结果集
- JDBC学习之路(二)CRUD
- JDBC学习(二)数据库连接池
- Java基础(十三)-----JDBC(二)
- Java JDBC 理论笔记(二)
- Java--JDBC连接数据库(二)
- java 从零开始,学习笔记之基础入门<JDBC>(二十四)
- JAVA WEB从入门到精通 day17 JDBC学习(二)
- 《Java》——JDBC学习二
- 配置c3p0链接池
- 《python网络数据采集》章节3.2 'gbk' codec can't
- Java Script 点击更改界面demo
- fusioncharts的XML标签属性
- 用python写一个小型的FTP客户端软件
- java学习(22)--JDBC(二)
- SpringMVC原理
- Leetcode 14. Longest Common Prefix
- 【脚本语言系列】关于Python进程线程管理系统模块,你需要知道的事
- 543. Diameter of Binary Tree
- windows 64位下安装scipy(python2.7)
- 【Android 清单文件下的 Activity各种配置详解】
- RML(Riemann流形学习)
- 实测:一周不更新文章头条号指数会掉多少?