美文网首页饥人谷技术博客
JDBC编程:JDBC高级编程

JDBC编程:JDBC高级编程

作者: _Jun | 来源:发表于2020-12-03 16:48 被阅读0次
  • 事物处理
  • 批量更新
  • 返回自动主键
  • 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测试类中测试方法;

相关文章

  • JDBC编程:JDBC高级编程

    事物处理 批量更新 返回自动主键 DAO 1,事物处理 什么是事物? 事务(Transaction):数据库中保证...

  • JDBC:Java数据库连接

    JDBC常用接口 JDBC编程步骤 执行SQL语句 管理结果集 事务管理 高级应用:分页、高级查询、高级函数使用

  • JDBC编程目录

    JDBC编程目录 SQL基础JDBC基础JDBC进阶

  • JDBC编程一一jdbc高级编程(DAO模式)

    事务简介 事务(Transaction):数据库中保证交易可靠的机制 JDBC支持数据库中的事务概念 在JDBC中...

  • 第一章 简介

    1.1 The JDBC API jdbctm API提供了从JavaTM编程语言编程访问关系型数据。使用JDBC...

  • Java数据库连接——JDBC编程

    本文概述 本篇文章将分四块内容对JDBC编程进行介绍:一. JDBC编程概述二. JDBC开发步骤三. 工具类撰写...

  • Mybatis_day01

    1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使用jdbc的原始方法...

  • java_JDBC

    1.JDBC是什么 2.JDBC本质 3.JDBC前期的准备工作 4.JDBC编程六步

  • 1-JDBC是什么

    JDBC概念 JDBC (Java Database Connectivity) API,即Java数据库编程接口...

  • java数据库管理之jdbc

    JDBC的开发步骤 注入攻击(不用这个代码编程序) (用这个代码编程序) 更新操作 JDBC的工具类(代码固定) ...

网友评论

    本文标题:JDBC编程:JDBC高级编程

    本文链接:https://www.haomeiwen.com/subject/dhpmwktx.html