JDBC

JDBC:

  *概念:Java DataBase Connectivity    Java 数据库链接, Java语言操作数据库

  *本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

  *快速入门:

    *步骤:(存在sql注入的问题)

      1.导入驱动jar包

      2.注册驱动

      3.获取数据库链接对象 Connection

      4.定义sql

      5.获取执行sql的语句对象 Statement

      6.执行sql

      7.处理结果,释放资源

    *详解各个对象:

      1.DriverManager:驱动管理对象

        *功能:

          1.注册驱动

             Class.forName("com.mysql.cj.jdbc.Driver");

          2.获取数据库链接

            Connection getConnection(String url ,String user ,String password);

              url:指定链接路径

              user:用户名

              password :密码

      2.Connection:数据库链接对象

        *功能:

          1.获取执行sql的对象:

            Statement createStatement();

            PreparedStatement preparedStatement(String sql);

          2.管理事务:

            *开启事务:setAutoCommit(bollean autoCommit):调用该方法设置参数为false,开启事务

            *提交事务:commit();

            *回滚事务:rollback();

      3.Statement:执行sql对象

        1.执行sql

          1.int executUpdate(String sql):执行DML(增删改)

            *返回值是影响的行数

          2.ResultSet executeQuery(String sql):执行DQL(查询)

      4.ResultSet:结果集对象,封装查询结果

        *boolean next( ):游标向下移动一行,当返回false时,表示这一行没有数据

          遍历结果集

            while(resultset.next()){

              sout(打印结果)

                }

            例子:

while(resultSet.next()){
    System.out.println(resultSet.getInt(1)+"--"+resultSet.getString(2));
}

        *getXxx():获取对象

           *Xxx代表类型  :例如: int getInt()

           *参数:

             1.int:代表列的编号,从1开始  如getString(1) 获取第一列的数据

      

      5.PreparedStatement:执行sql对象 

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

            1.输入用户随便,输入密码时:a' or 'a' ='a'a

            2.sql:select *from user where username = 'dasdas' and password = 'a' or 'a' ='a'

        2.解决sql注入问题:使用PreparedStatement对象来解决

        3.预编译的sql:参数使用?作为占位符

//比起比之前的步骤解决了sql注入问题

 

 

 

    **JDBU工具类

      

package com.xxxx.util;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

public class JDBCUtil {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    static {
        Properties properties =new Properties();
        try {
            properties.load(new FileInputStream("src/db.properties"));
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            driver = properties.getProperty("driver");
            try {
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                throw new RuntimeException(e);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    public static Connection getConnection() throws SQLException {
        

        return DriverManager.getConnection(url,user,password);
    }
    public static void close(ResultSet resultSet, Statement statement, Connection connection) throws SQLException {
        statement.close();
        connection.close();
        resultSet.close();
    }
}

  *JDBC控制事务:

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

    2.操作:

      *开启事务

      *提交事务

      *回滚事务

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

            *开启事务:setAutoCommit(bollean autoCommit):调用该方法设置参数为false,开启事务

            *提交事务:commit();

            *回滚事务:rollback();

      

package com.xxxx.jdbc;

import com.xxxx.util.JDBCUtil;

import java.sql.*;
import java.util.Scanner;

public class JDBC {
        //导入驱动jar包
        public static void main(String[] args) throws Exception {


            //注册驱动
            Connection connection = JDBCUtil.getConnection();
            //开启事务
            connection.setAutoCommit(false);

            String sql1 ="update tb_user set uerAge = uerAge-? where userId = ?";
            String sql2 ="update tb_user set uerAge = uerAge+? where userId = ?";
            //获取sql语句的执行对象preparedStatement
            PreparedStatement preparedStatement1 = connection.prepareStatement(sql1);
            PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);
            //执行sql
            preparedStatement1.setString(1, String.valueOf(5));
            preparedStatement1.setString(2, String.valueOf(1));

            preparedStatement2.setString(1, String.valueOf(5));
            preparedStatement2.setString(2, String.valueOf(2));
            //处理结果
            preparedStatement2.executeUpdate();
            //手动制造异常
            int x = 1/0 ;
            preparedStatement1.executeUpdate();
            //提交事务
            connection.commit();
            //回滚
            connection.rollback();
            //释放资源
            preparedStatement1.close();
            preparedStatement2.close();
            connection.close();
        }
}

 

posted @ 2022-12-25 16:20  会秃头的小白  阅读(20)  评论(0编辑  收藏  举报