首页 > 代码库 > 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 批处理、获取自增长、事务、大文本处理