zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }

    事务

    技术:
    |-- Connection
    void 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);
            }
        }
    }
  • 相关阅读:
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    129. Sum Root to Leaf Numbers
    117. Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/linst/p/5874365.html
Copyright © 2011-2022 走看看