首页 > 其他分享 >2022-08-19 day32 第一小组 王鸣赫

2022-08-19 day32 第一小组 王鸣赫

时间:2022-08-21 19:44:58浏览次数:78  
标签:事务 rs 19 08 day32 sql null conn pstmt

目录

Statement的不足:

1、大量的字符串拼接,代码可读性降低。
2、sql注入

SQL注入:BUG
通过字符串的拼接,可以得到一个恒等的sql语句,可以跳过某些判断。

PreparedStatement:预编译(预加载)接口

  • 1、通过conn获取的对象
  • 2、是Statement接口的子接口
  • 3、sql语句中可以传参。用?占位,通过setXXX方法来给?赋值
  • 4、提高性能
  • 5、避免sql注入
点击查看代码
public class Ch02 {

    @Test
    public void test03() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = JDBCUtil.getConnection();

            String sql = "select * from user where username = ? and password = ?";

            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,"aaa");
            pstmt.setString(2,"b' or '1' = '1");

            rs = pstmt.executeQuery();
            if(rs.next()) {
                System.out.println("登录成功...");
            }else {
                System.out.println("账号或密码错误...");
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtil.close(conn,pstmt,rs);
        }
    }

    @Test
    public void test02() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = JDBCUtil.getConnection();

            String sql = "select * from scores where s_id = ?";

            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,7);

            rs = pstmt.executeQuery();
            while(rs.next()) {
                int sId = rs.getInt("s_id");
                int score = rs.getInt("score");
                int cId = rs.getInt("c_id");
                System.out.println("学号:" + sId + ",分数:" + score + ",科目号:" + cId);
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtil.close(conn,pstmt,rs);
        }
    }

    @Test
    public void test01() {

        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            conn = JDBCUtil.getConnection();
            String sql = "update teacher set name = ? where id = ?";
            // 预编译
            pstmt = conn.prepareStatement(sql);
            // 给占位符赋值,根据位置
            pstmt.setString(1,"JJ");
            pstmt.setInt(2,6);

            // 正式执行sql
            int i = pstmt.executeUpdate();
            System.out.println(i);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtil.close(conn,pstmt);
        }

    }
}

数据库事务:是数据库的特性

  • Mysql的数据库引擎
  • 1.在MySQL中,只有使用了Innodb引擎的数据库才支持事务
  • 2.事务处理可以用来维护数据的完整性。保证sql语句要么全部执行,
  • 要么全部不执行。
  • 3.发生在DML中,增删改。

事务的四大特征ACID

  • 1、原子性 A。
  • 一个事务,要么全部完成,要么全部不完成。
  • 2、一致性 C。
  • 在事务开始之前和事务结束之后,数据库的完整性没有被破坏。
  • 3、隔离性 Isolation
  • 数据库允许多个事务同时对数据进行处理。每个事务之间是相互隔离。
  • 4、持久性 D
  • 事务结束以后,对数据的增删改是永久性的。
  • 术语:提交事务,回滚事务(事务回滚)
  • 1、事务一旦提交,就不可能回滚。
  • 2、当一个连接对象被创建时,默认情况下自动提交事务。
  • 3、关闭连接时,数据会自动提交事务。
  • 操作事务的步骤:
  • 1、关闭事务的自动提交
  • 当做出增删改操作,把变化发生在内存中,提交事务,才会真正提交给数据库。
点击查看代码
public class Ch02 {

    @Test
    public void test01() {
        Connection conn = null;
        PreparedStatement pstmt1 = null;
        PreparedStatement pstmt2 = null;

        try {
            conn = JDBCUtil.getConnection();
            // 关闭事务的自动提交
            // true:开启(默认) false:关闭
            // 开启一个事务
            conn.setAutoCommit(false);
            // 把id为1的账户余额-1000
            String sql1 = "update bank set balance = balance - 1000 where id = 1";
            pstmt1 = conn.prepareStatement(sql1);
            pstmt1.executeUpdate();

            String sql2 = "update bank set balance = balance + 1000 where id = 2";
            pstmt2 = conn.prepareStatement(sql2);
            pstmt2.executeUpdate();

            int i = 10 / 0;

            // 提交事务
            conn.commit();

            System.out.println("转账成功...");

        } catch (Exception e) {
            try {
                // 事务回滚
                conn.rollback();
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
            throw new RuntimeException(e);
        } finally {
            JDBCUtil.close(conn,pstmt1);
            JDBCUtil.close(null,pstmt2);
        }
    }

}

标签:事务,rs,19,08,day32,sql,null,conn,pstmt
From: https://www.cnblogs.com/wmh19990109/p/16610646.html

相关文章

  • 2022-08-18 day31 第一小组 王鸣赫
    目录MySQL常用函数聚合函数数值型函数字符串型函数日期和时间函数获取时间和日期时间戳和日期转换函数根据日期获取年月日的数值时间日期的计算加密函数流程控制函数数据库......
  • 2022-08-17 day30 第一小组 王鸣赫
    目录DQL查询语言子查询需求日期格式DQL查询语言子查询按照结果集的行列数不同,子查询可以分为以下几类:标量子查询:结果集只有一行一列(单行子查询)列子查询:结果集有一列......
  • 219. 存在重复元素 II
     思路难度简单506收藏分享切换为英文接收动态反馈给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i]==nu......
  • 2022-08-20 第二小组 张鑫 学习笔记
    实训四十二天1.学习重点1.数据库连接池2.基础框架3.QueryRunner类2.学习内容数据库连接池connection是一种稀有资源,一个连接建立就创造了一个资源JDBC使用数据库连......
  • [2008年NOIP普及组] 排座椅
    [2008年NOIP普及组]排座椅思路:首先运用结构体存入每行每列的具体信息,读入m行n列k条横向l条纵向通道d对同学说话,按顺序为每行每列编号。再一对一对地拆说话的同学(要计......
  • 【2022.8.19】MySQL数据库(6)
    学习内容概要视图触发器存储过程事物内置函数流程控制、循环结构索引与慢查询内容详细视图解释:SQL语句执行的结果为一张虚拟表我们基于这张虚拟表去做其......
  • 2022-08-21-设计模式之桥接模式
    java设计模式之桥接模式-学习整理23种设计模式---桥接模式什么是桥接模式?桥接模式的定义是?生活当中涉及到桥接模式的实例:桥接模式的结构及主要角色:咖啡案例实现(组......
  • SRTP_Log_20220821
    WorkingContent:1.把网络深度加深了一些,效果会好一些  2.发现神经网络每次的输出都不太一样,可能因为很多值都可以达到使loss降低的效果 ......
  • 2022-08-21-设计模式之观察者模式
    java设计模式之观察者模式-学习整理23种设计模式---观察者模式什么是观察者模式?定义是什么?观察者模式包含的角色有什么?四个核心的角色:抽象观察者,具体观察者;抽象被观察......
  • Common language of English Courses-001-20220821
    CommonlanguageofEnglishcourses您在EF中心学习英语多久了?howlonghaveyourbeenlearnenglishinefcenter.howlonghaveyourbeenlearningenglishatef......