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);
            }
        }
    }
  • 相关阅读:
    Python网络编程学习_Day9
    Python基础知识学习_Day8
    Python基础知识学习_Day7
    Python基础知识学习_Day6
    Python基础知识学习_Day5
    Python基础知识学习_Day4
    Python基础知识学习_Day3
    Python基础知识学习_Day2
    Python基础知识学习_Day1
    如何使用ssh工具便于远程管理
  • 原文地址:https://www.cnblogs.com/linst/p/5874365.html
Copyright © 2011-2022 走看看