首页 > 其他分享 >2022-8-19 第六组 JDBC(2)

2022-8-19 第六组 JDBC(2)

时间:2022-08-19 21:46:32浏览次数:69  
标签:事务 JDBC String 19 static 2022 sql password conn

PreparedStatement:执行sql的对象

1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题

1. 输入用户随便,输入密码:a' or 'a' = 'a
2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a' 
3. 解决sql注入问题:使用PreparedStatement对象来解决
4. 预编译的SQL:参数使用?作为占位符

2. 步骤:

1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
	* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 
6. 给?赋值:
	* 方法: setXxx(参数1,参数2)
	* 参数1:?的位置编号 从1 开始
	* 参数2:?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源

3. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作

1. 可以防止SQL注入
2. 效率更高

抽取JDBC工具类 : JDBCUtils

目的:简化书写

分析:

1. 注册驱动也抽取
2. 抽取一个方法获取连接对象
	* 需求:不想传递参数(麻烦),还得保证工具类的通用性。
	* 解决:配置文件
		jdbc.properties
			url=
			user=
			password=
3. 抽取一个方法释放资源

代码实现:

public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
 * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
 */
static{
    //读取资源文件,获取值。
    try {
        //1. 创建Properties集合类。
        Properties pro = new Properties();
        //获取src路径下的文件的方式--->ClassLoader 类加载器
        ClassLoader classLoader = JDBCUtils.class.getClassLoader();
        URL res  = classLoader.getResource("jdbc.properties");
        String path = res.getPath();
        System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties
        //2. 加载文件
        pro.load(new FileReader(path));
        //3. 获取数据,赋值
        url = pro.getProperty("url");
        user = pro.getProperty("user");
        password = pro.getProperty("password");
        driver = pro.getProperty("driver");
        //4. 注册驱动
        Class.forName(driver);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

获取连接

public static Connection getConnection() throws SQLException {

    return DriverManager.getConnection(url, user, password);
}

/**
 * 释放资源
 * @param stmt
 * @param conn
 */
public static void close(Statement stmt,Connection conn){
    if( stmt != null){
        try {
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    if( conn != null){
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

JDBC控制事务:

1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。

2. 操作:

1. 开启事务
2. 提交事务
3. 回滚事务

3. 使用Connection对象来管理事务

* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
	* 在执行sql之前开启事务
* 提交事务:commit() 
	* 当所有sql都执行完提交事务
* 回滚事务:rollback() 
	* 在catch中回滚事务

4. 代码:

public class JDBCDemo10 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt1 = null;
        PreparedStatement pstmt2 = null;

        try {
            //1.获取连接
            conn = JDBCUtils.getConnection();
            //开启事务
            conn.setAutoCommit(false);

            //2.定义sql
            //2.1 张三 - 500
            String sql1 = "update account set balance = balance - ? where id = ?";
            //2.2 李四 + 500
            String sql2 = "update account set balance = balance + ? where id = ?";
            //3.获取执行sql对象
            pstmt1 = conn.prepareStatement(sql1);
            pstmt2 = conn.prepareStatement(sql2);
            //4. 设置参数
            pstmt1.setDouble(1,500);
            pstmt1.setInt(2,1);

            pstmt2.setDouble(1,500);
            pstmt2.setInt(2,2);
            //5.执行sql
            pstmt1.executeUpdate();
            // 手动制造异常
            int i = 3/0;

            pstmt2.executeUpdate();
            //提交事务
            conn.commit();
        } catch (Exception e) {
            //事务回滚
            try {
                if(conn != null) {
                    conn.rollback();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JDBCUtils.close(pstmt1,conn);
            JDBCUtils.close(pstmt2,null);
        }
    }

}

标签:事务,JDBC,String,19,static,2022,sql,password,conn
From: https://www.cnblogs.com/ychptz/p/16603391.html

相关文章

  • 2022-08-19 第五组 罗佳明
    一、学习重点  二、学习内容案例一:查询(面对对象思想)packagecom.jsoft.morning.test;importorg.junit.Test;importjava.util.List;publicclassDemo{......
  • 2022 Gartner RPA魔力象限,弘玑Cyclone位置飞跃国产RPA进击全球
     文/王吉伟 7月25日,国际权威分析机构Gartner发布了2022全球RPA魔力象限报告(GartnerRPAMQ),UiPath、AutomationAnywhere、微软等来自全球的15家厂商入选该报告。这......
  • 2022-08-19 第八组 卢睿 学习心得
    目录JDBCStatement的不足SQL注入PreparedStatement:预编译(预加载)接口案例ResultSetMetaData(了解即可)数据库事务Mysql的数据库引擎4事务的四大特征ACID原子性A。一致性C......
  • 8.19
    CF1720D2题意:给定序列\(A\),求\(A\)的最长子序列\(B\),满足\(a_p\oplusp+1<a_{p+1}\oplusp\)\(n\leq3*10^5,0\leqa_i\leq10^9\)题解:枚举两边的值从高位到地位有多......
  • 2022-8-18 第六组 JDBC
    JDBC1.概念:JavaDataBaseConnectivityJava数据库连接,Java语言操作数据库JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商......
  • 2022-8-19 第一组 (≥▽≤) 学习笔记
    目录1.JDBC2.数据库事务面试题1.JDBCStatement的不足之处大量的字符串拼接,代码可读性降低sql注入PreparedStatement——预编译(预加载)接口通过Connection获取的......
  • 2022暑假集训总结
    经过简介7月20日到达内江天立学校,在小学部的机房上课。这里没什么人,比较安静,也没有那么热,学习环境挺好的。开始是老姚给我们上的课,主要讲了tarjan,然后由几位学长讲课。期......
  • 【2022-08-19】mysql基础知识(六)
    mysql基础知识(六)mysql之视图view什么是视图?视图就是通过查询得到的一张虚拟表,然后保存下来,下次直接进行使用即可。即:将SQL语句的查询结果当做虚拟表保存起来,以后可......
  • 20220819总结
    这次考试太烂了,又没考过Diavolo。T1简单的入门题,先热身。#include<iostream>#defineintlonglong#defineN5001usingnamespacestd;intn,ans;doublea[N]......
  • 2022-08-19 田龙跃 JDBC知识
    JAVA链接数据库步骤1.加载驱动2.建立链接3.获取statement语句对象执行sql4.处理结果集5.关闭连接加载驱动Class.forName(驱动名称)建立连接connection=DriverMa......