【数据库_04】JDBC

2021-02-04 10:48:08 浏览数 (1)

一、什么是JDBC

1. JDBC概念
代码语言:javascript复制
① 官方
    * JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API
    可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
② 个人理解
    * JDBC就是定义了一组操作关系型数据库的接口。
2. 一个示例
代码语言:javascript复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class Demo_JDBC {
    public static void main(String[] args) throws Exception {
        //加载com.mysql.jdbc.Driver进内存,Driver中在静态代码块中注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取数据库连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
        //sql语句
        String sql = "insert emp(empno,ename) values(8888,'皇家马德里')";
        //获取执行对象
        Statement statement = connection.createStatement();
        //执行sql
        int i = statement.executeUpdate(sql);
        //处理数据
        System.out.println(i);
        //释放资源
        statement.close();
        connection.close();
    }
}
3. 相关类功能
代码语言:javascript复制
① DriverManager
    * 注册驱动
        java.sql.DriverManager.registerDriver(new Driver());        //在静态代码块中
    【一般使用】
        Class.forName("com.mysql.jdbc.Driver");                     // MySQL5 以后的jar包可以省略,不推荐省略
    * 获取数据库连接
        DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
② Connection
    * 获取执行 sql 对象
        connection.createStatement()        // 有漏洞,一般使用PreparedStatement
    * 事务管理
        - 开启事务
            setAutoCommit(false)            // 默认自动提交所以要设置为 false
        - 提交事务
            commit()
        - 回滚
            rollback()                      // catch 中回滚
③ Statement
    * 执行 sql 
        - int executeUpdate(String)                // 执行 DML 
        - RelustSet executeQuray(String)           // 执行 DQL
    * ResultSet 结果集
        - Boolean next()               // 向下移动一个
        - getString(int/String)        // 获取表中数据(int 索引,string 字段名)  ★ 禁止传 int 参数
④ PreparedStatement extends Statement
    * sql 改变
        //防止 sql 注入问题
        String sql = "select * from user where username = ? and password = password(?)"
    * 获取 SQL 执行对象改变
        //需要传递 SQL 预编译
        connection.prepareStatement(sql)
    * 增加赋值
        /**
        *    1 ---> 是第几个 ?
        *    2 ---> ? 代表的值
        */
        setXxx(1,2)
    * 执行 SQL 改变
        //无需传参
        preparedStatement.execute()

二、JDBC工具类

代码语言:javascript复制
//配置文件 jdbc.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/db1
user = work
password = gaohu

//utils
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
 
public class jdbc_utils {
    static String driver;
    static String url;
    static String user;
    static String password;
 
    static {
        //加载字节码文件获取配置文件流
        InputStream is = jdbc_utils.class.getClassLoader().getResourceAsStream("jdbc.properties");
        
        /**【需要获取配置文件路径是使用这种方式】
        *    //加载本类字节码文件进内存,获取统一资源定位符(URL)
        *    URL url = jdbc_utils.class.getClassLoader().getResource("jdbc.properties");    
        *    //获取URL路径
        *    String s = url.getParth();
        *    //使用 File
        *    pro.load(new File(s));
        */
 
        try {
            //创建properties集合,加载文件进内存
            Properties pro = new Properties();
            pro.load(is);
 
            //获取属性并复制
            driver = pro.getProperty("driver");
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
 
            //加载驱动
            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);
    }
 
    //释放资源
    // DML 释放两个资源
    public static void close(PreparedStatement preparedStatement, Connection connection) {
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
 
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
 
    // DQL 释放三个资源
    public static void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
 
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
 
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

三、修改密码案例

代码语言:javascript复制
import com.java.utils.jdbc_utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
 
public class jdbc_login {
    public static void main(String[] args) {
        //从键盘录入用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.nextLine();
        System.out.println("请输入旧密码");
        String password = sc.nextLine();
 
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
 
        try {
            //获取数据库连接
            connection = jdbc_utils.getConnection();
            //sql语句
            String sql = "select * from user where username = ? and password = password(?)";
            //获取执行sql对象,预编译SQL
            preparedStatement = connection.prepareStatement(sql);
            //给?赋值
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,password);
            //执行sql
            resultSet = preparedStatement.executeQuery();
            //结果处理
            if (resultSet.next()) {
                //键入新密码
                System.out.println("请输入新密码");
                String newpassword = sc.nextLine();
                //SQL
                String sqlUpdate = "update user set password = password(?) where username = ?";
                //预编译 SQL
                preparedStatement = connection.prepareStatement(sqlUpdate);
                
                //赋值
                preparedStatement.setString(1,newpassword);
                preparedStatement.setString(2,username);
                //执行SQL
                int i = preparedStatement.executeUpdate();
                
                if (i > 0) {
                    System.out.println("修改成功");
                } else {
                    System.out.println("修改失败");
                }
            } else {
                System.out.println("账号或密码错误!");
            }
 
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            jdbc_utils.close(resultSet,preparedStatement,connection);
        }
    }
}

四、事务管理案例

代码语言:javascript复制
import com.java.utils.jdbc_utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBC_Transaction {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            //获取连接

            connection = jdbc_utils.getConnection();
            //开启事务
            connection.setAutoCommit(false);
            //sql
            String sql = "update account set balance = balance   ? where name = ?";
            //预编译sql
            preparedStatement = connection.prepareStatement(sql);
            //转出500
            preparedStatement.setInt(1,-500);
            preparedStatement.setString(2,"tom");
            //执行sql
            preparedStatement.executeUpdate();
            //转入500
            preparedStatement.setInt(1,500);
            preparedStatement.setString(2,"jack");
            //执行sql
            preparedStatement.executeUpdate();
     
            connection.commit();
        } catch (Exception e) {
            if (connection != null) {
                try {
                    connection.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            jdbc_utils.close(preparedStatement,connection);
        }
    }
}

0 人点赞