首页 > 代码库 > sql 批处理、获取自增长、事务、大文本处理
sql 批处理、获取自增长、事务、大文本处理
批处理
需要批量执行sql语句!需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 // 循环 // 保存 (批量保存) } Public void save(Admin admin ){ // 循环 // 保存 }技术: |-- Statement 批处理相关方法 void addBatch(String sql) 添加批处理 void clearBatch() 清空批处理 int[] executeBatch() 执行批处理
代码
实现: Admin.java 实体类封装数据 AdminDao.java 封装所有的与数据库的操作 App.java 测试
public class Admin { private String userName; private String pwd;public class App { // 测试批处理操作 @Test public void testBatch() throws Exception { // 模拟数据 List<Admin> list = new ArrayList<Admin>(); for (int i=1; i<21; i++) { Admin admin = new Admin(); admin.setUserName("Jack" + i); admin.setPwd("888" + i); list.add(admin); } // 保存 AdminDao dao = new AdminDao(); dao.save(list); }}// 封装所有的与数据库的操作public class AdminDao { // 全局参数 private Connection con; private PreparedStatement pstmt; private ResultSet rs; // 批量保存管理员 public void save(List<Admin> list) { // SQL String sql = "INSERT INTO admin(userName,pwd) values(?,?)"; try { // 获取连接 con = JdbcUtil.getConnection(); // 创建stmt pstmt = con.prepareStatement(sql); // 【预编译SQL语句】 for (int i=0; i<list.size(); i++) { Admin admin = list.get(i); // 设置参数 pstmt.setString(1, admin.getUserName()); pstmt.setString(2, admin.getPwd()); // 添加批处理 pstmt.addBatch(); // 【不需要传入SQL】 // 测试:每5条执行一次批处理 if (i % 5 == 0) { // 批量执行 pstmt.executeBatch(); // 清空批处理 pstmt.clearBatch(); } } // 批量执行 pstmt.executeBatch(); // 清空批处理 pstmt.clearBatch(); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.closeAll(con, pstmt, rs); } }}
插入数据,获取自动增长
部门CREATE TABLE dept( deptId INT PRIMARY KEY AUTO_INCREMENT, deptName VARCHAR(20));-- 员工CREATE TABLE employee( empId INT PRIMARY KEY AUTO_INCREMENT, empName VARCHAR(20), dept_id INT -- 外键字段 );-- 给员工表添加外键约束ALTER TABLE employee ADD CONSTRAINT FK_employee_dept_deptId FOREIGN KEY(dept_id) REFERENCES dept(deptId) ;public class EmpDao { private Connection con; private PreparedStatement pstmt; private ResultSet rs; // 保存员工,同时保存关联的部门 public void save(Employee emp){ // 保存部门 String sql_dept = "insert into dept(deptName) values(?)"; // 保存员工 String sql_emp = "INSERT INTO employee (empName,dept_id) VALUES (?,?)"; // 部门id int deptId = 0; try { // 连接 con = JdbcUtil.getConnection(); /*****保存部门,获取自增长*******/ // 【一、需要指定返回自增长标记】 pstmt = con.prepareStatement(sql_dept,Statement.RETURN_GENERATED_KEYS); // 设置参数 pstmt.setString(1, emp.getDept().getDeptName()); // 执行 pstmt.executeUpdate(); // 【二、获取上面保存的部门子增长的主键】 rs = pstmt.getGeneratedKeys(); // 得到返回的自增长字段 if (rs.next()) { deptId = rs.getInt(1); } /*****保存员工*********/ pstmt = con.prepareStatement(sql_emp); // 设置参数 pstmt.setString(1, emp.getEmpName()); pstmt.setInt(2, deptId); pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.closeAll(con, pstmt, rs); } }}
事务
技术:|-- Connectionvoid setAutoCommit(boolean autoCommit) ; 设置事务是否自动提交 如果设置为false,表示手动提交事务。void commit() (); 手动提交事务void rollback() ; 回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)Savepoint setSavepoint(String name)
-- 账户表CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT, accountName VARCHAR(20), money DOUBLE);-- 转账UPDATE account SET money=money-1000 WHERE accountName=‘张三‘;UPDATE account SET money=money+1000 WHERE accountName=‘李四‘;
public class AccountDao { // 全局参数 private Connection con; private PreparedStatement pstmt; // 1. 转账,没有使用事务 public void trans1() { String sql_zs = "UPDATE account SET money=money-1000 WHERE accountName=‘张三‘;"; String sql_ls = "UPDATE account SET money=money+1000 WHERE accountName=‘李四‘;"; try { con = JdbcUtil.getConnection(); // 默认开启的隐士事务 con.setAutoCommit(true); /*** 第一次执行SQL ***/ pstmt = con.prepareStatement(sql_zs); pstmt.executeUpdate(); /*** 第二次执行SQL ***/ pstmt = con.prepareStatement(sql_ls); pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.closeAll(con, pstmt, null); } } // 2. 转账,使用事务 public void trans2() { String sql_zs = "UPDATE account SET money=money-1000 WHERE accountName=‘张三‘;"; String sql_ls = "UPDATE1 account SET money=money+1000 WHERE accountName=‘李四‘;"; try { con = JdbcUtil.getConnection(); // 默认开启的隐士事务 // 一、设置事务为手动提交 con.setAutoCommit(false); /*** 第一次执行SQL ***/ pstmt = con.prepareStatement(sql_zs); pstmt.executeUpdate(); /*** 第二次执行SQL ***/ pstmt = con.prepareStatement(sql_ls); pstmt.executeUpdate(); } catch (Exception e) { try { // 二、 出现异常,需要回滚事务 con.rollback(); } catch (SQLException e1) { } e.printStackTrace(); } finally { try { // 三、所有的操作执行成功, 提交事务 con.commit(); JdbcUtil.closeAll(con, pstmt, null); } catch (SQLException e) { } } } // 3. 转账,使用事务, 回滚到指定的代码段 public void trans() { // 定义个标记 Savepoint sp = null; // 第一次转账 String sql_zs1 = "UPDATE account SET money=money-1000 WHERE accountName=‘张三‘;"; String sql_ls1 = "UPDATE account SET money=money+1000 WHERE accountName=‘李四‘;"; // 第二次转账 String sql_zs2 = "UPDATE account SET money=money-500 WHERE accountName=‘张三‘;"; String sql_ls2 = "UPDATE1 account SET money=money+500 WHERE accountName=‘李四‘;"; try { con = JdbcUtil.getConnection(); // 默认开启的隐士事务 con.setAutoCommit(false); // 设置事务手动提交 /*** 第一次转账 ***/ pstmt = con.prepareStatement(sql_zs1); pstmt.executeUpdate(); pstmt = con.prepareStatement(sql_ls1); pstmt.executeUpdate(); // 回滚到这个位置? sp = con.setSavepoint(); /*** 第二次转账 ***/ pstmt = con.prepareStatement(sql_zs2); pstmt.executeUpdate(); pstmt = con.prepareStatement(sql_ls2); pstmt.executeUpdate(); } catch (Exception e) { try { // 回滚 (回滚到指定的代码段) con.rollback(sp); } catch (SQLException e1) { } e.printStackTrace(); } finally { try { // 提交 con.commit(); } catch (SQLException e) { } JdbcUtil.closeAll(con, pstmt, null); } }}
大文本处理
MySQL数据库, Text 长文本类型 Blob 二进制类型
-- 测试大数据类型CREATE TABLE test( id INT PRIMARY KEY AUTO_INCREMENT, content LONGTEXT, img LONGBLOB);
Text:public class App_text { // 全局参数 private Connection con; private Statement stmt; private PreparedStatement pstmt; private ResultSet rs; @Test // 1. 保存大文本数据类型 ( 写longtext) public void testSaveText() { String sql = "insert into test(content) values(?)"; try { // 连接 con = JdbcUtil.getConnection(); // pstmt 对象 pstmt = con.prepareStatement(sql); // 设置参数 // 先获取文件路径 String path = App_text.class.getResource("tips.txt").getPath(); FileReader reader = new FileReader(new File(path)); pstmt.setCharacterStream(1, reader); // 执行sql pstmt.executeUpdate(); // 关闭 reader.close(); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.closeAll(con, pstmt, null); } } @Test // 2. 读取大文本数据类型 ( 读longtext) public void testGetAsText() { String sql = "select * from test;"; try { // 连接 con = JdbcUtil.getConnection(); // pstmt 对象 pstmt = con.prepareStatement(sql); // 读取 rs = pstmt.executeQuery(); if (rs.next()) { // 获取长文本数据, 方式1: //Reader r = rs.getCharacterStream("content"); // 获取长文本数据, 方式2: System.out.print(rs.getString("content")); } } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.closeAll(con, pstmt, null); } }}
blob:public class App_blob { // 全局参数 private Connection con; private Statement stmt; private PreparedStatement pstmt; private ResultSet rs; @Test // 1. 二进制数据类型 ( 写longblob) public void testSaveText() { String sql = "insert into test(img) values(?)"; try { // 连接 con = JdbcUtil.getConnection(); // pstmt 对象 pstmt = con.prepareStatement(sql); // 获取图片流 InputStream in = App_text.class.getResourceAsStream("7.jpg"); pstmt.setBinaryStream(1, in); // 执行保存图片 pstmt.execute(); // 关闭 in.close(); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.closeAll(con, pstmt, null); } } @Test // 2. 读取大文本数据类型 ( 读longblob) public void testGetAsText() { String sql = "select img from test where id=2;"; try { // 连接 con = JdbcUtil.getConnection(); // pstmt 对象 pstmt = con.prepareStatement(sql); // 读取 rs = pstmt.executeQuery(); if (rs.next()) { // 获取图片流 InputStream in = rs.getBinaryStream("img"); // 图片输出流 FileOutputStream out = new FileOutputStream(new File("c://1.jpg")); int len = -1; byte b[] = new byte[1024]; while ((len = in.read(b)) != -1) { out.write(b, 0, len); } // 关闭 out.close(); in.close(); } } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.closeAll(con, pstmt, null); } }}
sql 批处理、获取自增长、事务、大文本处理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。