乐趣区

关于数据库:JDBC编程JDBC高级编程

  • 事物解决
  • 批量更新
  • 返回主动主键
  • DAO

1,事物解决

什么是事物?

事务(Transaction):数据库中保障交易牢靠的机制。JDBC 反对数据库中的事务概念,并且在 JDBC 中,事务默认是主动提交的。

事务提交的形式有两种:

  • 显示提交:应用 commit;
  • 主动提交:执行 DDL 或 DCL 语句,或者程序失常退出;

当事务所蕴含的任意一个数据库操作执行失败后,应该回滚事务(rollback),使该事务中所做的批改全副生效。

事务回滚有两种形式:

  • 显示回滚:应用 rollback。
  • 主动回滚:零碎谬误或者强行退出。

事务个性介绍:(ACID)
(1)原子性(Atomicity):事务必须是原子工作单元;对于其数据批改,要么全都执行,要么全都不执行
(2)一致性(Consistency):事务在实现时,必须使所有的数据都保持一致状态
(3)隔离性(Isolation):由并发事务所作的批改必须与任何其它并发事务所作的批改隔离
(4)持久性(Durability):事务实现之后,它对于零碎的影响是永久性的
事务是数据库的概念,JDBC 反对事务,实质还是在数据库中实现的。

JDBC 中和事务相干 API:

  • Connection.getAutoCommit() : 取得以后事务的提交形式,默认为 true
  • Connection.setAutoCommit(): 设置事务的提交属性,参数是 true:主动提交;false:不主动提交
  • Connection.commit(): 提交事务
  • Connection.rollback(): 回滚事务

JDBC 处理事务模式:
(1)先将事务的主动提交敞开;
(2)执行事务中的若干 SQL 语句;
(3)事务提交;SQL 失败则回滚;
(4)复原 JDBC 的事务提交状态;开释资源。

事务隔离级别

事务的并发读问题:

  • 脏读:读取到另一个事务未提交更新数据,即读取到了脏数据;
  • 不可反复读:对同一记录的两次读取不统一,因为另一事物对该记录做了批改;
  • 幻读(虚读):对同一张表的两次查问不统一,因为零壹拾伍插入了一条记录;

四大隔离级别

四个等级的事务隔离级别,在雷同数据环境下,应用雷同的输出,执行雷同的工具,依据不同的隔离级别,能够导致不同的后果。不同事务隔离级别可能解决的数据并发问题的能力是不同的。

  • SERIAUZABLE(串行化):不会呈现任何并发性问题,因为它是对同一数据的拜访是串行的,非并发拜访的。

性能最差

  • REPEATABLEREAD(可反复读):避免脏读和不可反复读,不能解决幻读问题。性能比 SERIAUZABLE 好
  • READCOMMITTED(读已提交数据):避免脏读,没有解决不可反复读,也没有解决幻读。性能比 REPEATABLEREAD。
  • READUNCOMMITTED(读未提交数据):可能呈现任何事物并发问题,性能最好;

2,批量更新

批量更新次要办法:

  • PreparedStatement.addBatch():将多条预编译的 SQL 语句,增加到语句列表中。
  • PreparedStatement.executeBatch():把语句列表中的所有 SQL 语句,发送给数据库解决。
  • PreparedStatement.clearBatch():清空以后 SQL 语句列表。

批量增加:

 public int[] insBatch() {
        Connection connection = null;
        Statement statement = null;
        String sql = "";
        try {
            // 获取数据连贯
            connection = basicUse.getConnection();
            // 获取发送 sql 指令执行 sql 对象
            statement = connection.createStatement();
            for (int i = 0; i < 10; i++) {StringBuffer sbf = new StringBuffer("insert into student (name, age, addr, hobby)");
                sbf.append("values ('kenx',24,' 上海 ',' 篮球 ')");
                sql = sbf.toString();
                System.out.println("执行 sql" + sql);
                // 将指定 SQL 增加到 Statement 对象的以后命令列表中
                statement.addBatch(sql);
            }
            // 执行胜利返回更新计数的数组
            int[] success = statement.executeBatch();  // 批量执行所有 sql 返回一个更新计数的数组
            return success;
        } catch (Exception e) {e.printStackTrace();
            return null;
        } finally {
            // 执行完数据库操作后记得敞开数据库连贯资源
            try {statement.close();
                connection.close();} catch (SQLException e) {e.printStackTrace();
            }

        }

    }

批量更新:

public int[] updBatch() {
        Connection connection = null;
        Statement statement = null;
        String sql = "";
        try {
            // 获取数据连贯
            connection = basicUse.getConnection();
            // 获取发送 sql 指令执行 sql 对象
            statement = connection.createStatement();
            for (int i = 1; i < 10; i++) {StringBuffer sbf = new StringBuffer("update student set  hobby=' 足球 '");
                sbf.append("where id=" + i);
                sql = sbf.toString();
                System.out.println("执行 sql" + sql);
                // 将指定 SQL 增加到 Statement 对象的以后命令列表中
                statement.addBatch(sql);
            }
            // 执行胜利返回更新计数的数组
            int[] success = statement.executeBatch();  // 批量执行所有 sql 返回一个更新计数的数组
            return success;
        } catch (Exception e) {e.printStackTrace();
            return null;
        } finally {
            // 执行完数据库操作后记得敞开数据库连贯资源
            try {statement.close();
                connection.close();} catch (SQLException e) {e.printStackTrace();
            }

        }
    }

3,返回主动主键

JDBC API:

ResultSet java.sql.Statement.getGeneratedKeys() throws SQLException

例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Tester {public static void main(String[] args) throws Exception {
        // 注册数据库驱动
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        // 获取连贯
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "***");
        // 筹备 SQL
        String sql = "insert into user(name) values('Belin')";
        // 筹备语句,配置为主动返回生成主键。PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        // 执行语句
        pstmt.executeUpdate();
        // 获取主键值,是一个 ResultSet。ResultSet rs = pstmt.getGeneratedKeys();
        if (rs.next()) {System.out.println(rs.getInt(1));
        }
    }
}

DAO:

什么是 DAO?
Data Access Object 数据拜访对象,建设在数据库和业务层之间,封装所有对数据库的拜访。

DAO 的作用:将数据拜访逻辑和业务逻辑离开。

DAO 通常包含:
①,一个 DAO 工厂类
②,一个 DAO 接口
③,一个实现 DAO 接口的具体类
④,数据传递对象(实体对象或值对象)

实体对象
将 java 程序中的对象对应到关系数据库的表中
表和类对应
表中的字段和类的属性对应
记录和对象对应

实现的步骤:

  • 先建设模型的对象 domain;
  • 编写 DAO 接口;
  • 定义 DAO 实现类;
  • 生产 DAO 测试类;
  • 在 DAO 测试类中测试方法;
退出移动版