JDBC的几个对象

  1. DriverManager : 驱动管理对象
  2. Connection : 数据库连接对象
  3. Statement : 执行sql的对象
  4. ResultSet : 结果集对象
  5. Preparedstatement : 执行sql的对象

DriverManager

驱动管理对象

功能

注册驱动

注册驱动:告诉程序该使用哪一个数据库驱动jar

DriverManager类中注册驱动的静态方法:

    • static void registerDriver(Driver driver, DriverAction da) 注册与给定的驱动程序 DriverManager

写代码时使用的:Class.forName("com.mysql.jdbc.Driver");

查看com.mysql.jdbc.Driver类中存在静态代码块(静态代码块会在类被加载时就自动执行了)

static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

注意:mysql5版本及之后的jar包可以省略注册驱动的步骤。

获取数据库连接

DriverManager类中的方法:

  • static Connection getConnection(String url, String user, String password) 尝试建立与给定数据库URL的连接。

    • 参数:
    1. url:指定连接的路径(这里的语法是MySQL的)

      • 语法:

        jdbc:mysql//ip地址(域名):端口号//数据库名称
        
        如果是连接本地的mysql服务器,且端口号是3306,则可以简写为jdbc:mysql:///数据库名称
        
    2. user:用户名(例如:root)

    3. password:密码

Connection

这是一个interface

数据库连接对象

功能

获取执行SQL的对象

Connection的两个方法来获取Statement和PrepareStatement:

  • Statement createStatement() 创建一个 Statement对象,用于将SQL语句发送到数据库。

  • PreparedStatement prepareStatement(String sql) 创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。

管理事务

  • 开启事务void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。(false为开启事务)
  • 提交事务void commit() 使自上次提交/回滚以来所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据 库锁。
  • 回滚事务void rollback() 撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。

Statement

用于执行静态SQL语句并返回其生成的结果的对象。

执行SQL语句

  1. boolean execute(String sql) : 可以执行任意的sql (了解)
  2. int elxecuteUpdate(String sql) : 执行DML (insert、 update、 delete) 语句、DDL(create, alter、drop) 语句
  • 返回值 : 影响的行数,可以通过这个影响的行数判断DML语句是否执行成功返回值>0的则执行成功,反之,则失败。
  1. ResultSet executeQuery(String sql) : 执行DQL (select)语句
import java.sql.*;

public class JDBCDemo02 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        try {
            // 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // SQL语句
            String sql = "insert into account values(null,'余尚烨',100000);";
            // 获取Connection对象
            connection = DriverManager.getConnection("jdbc:mysql:///test1", "root", "maj6226543");
            // 获取Statement对象
            statement = connection.createStatement();
            // 执行SQL语句
            int count = statement.executeUpdate(sql);  // 返回的是改的行数
            System.out.println(count);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {

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

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

        }
    }
}

ResultSet

结果集对象

ResultSet接口的方法:

  • boolean next() : 游标向下移动一行。

  • boolean previous() : 游标向上移动一行。

    注意:

    • ResultSet光标最初位于第一行之前;第一次调用方法next使第一行成为当前行;第二个调用使第二行成为当前行,依此类推。
    • 当调用next方法返回false时,光标位于最后一行之后。
  • xxx getxxx (参数) : 获取数据 (这泛指getxxx系列de方法)

    • xxx∶ 代表数据类型如 : int getInt() , string getstring()
    • 参数∶
      1. int : 代表列的编号, 从1开始 如 : getstring(1)
      2. string : 代表列名称。如 : getDouble( "balance")
import java.sql.*;

public class JDBCDemo04 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql:///test1", "root", "maj6226543");
            statement = connection.createStatement();
            String sql = "select * from account;";
            resultSet = statement.executeQuery(sql);

            while (resultSet.next()) {  // 判断下一行是否有数据
                int id = resultSet.getInt(1);  // 获取第一列数据
                String name = resultSet.getString("name");  // 获取字段为name的数据
                double money = resultSet.getDouble(3);  // 获取第三列的数据
                System.out.println(id + "---" + name + "---" + money);
            }

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally {
            if (resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

JDBC工具类

自己做的JDBC工具类

/* jdbc.properties文件 */

url=jdbc:mysql:///test1
user=root
password=maj6226543
driver=com.mysql.jdbc.Driver
/* JDBCUtils.java */

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    static {

        try {
            Properties properties = new Properties();

//            获取当前路径---->ClassLoader
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL resource = classLoader.getResource("jdbc.properties");
            String path = resource.getPath();


//            properties.load(new FileReader("src\\com\\jdbc.properties"));
            properties.load(new FileReader(path));
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            driver = properties.getProperty("driver");

            Class.forName(driver);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
    /*
     * 获取连接
     * @return 连接对象
     * */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }

    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();
            }
        }
    }

    public static void close(ResultSet res, Statement stmt, Connection conn) {
        if (res != null) {
            try {
                res.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

PreparedStatement

  • 表示预编译的SQL语句的对象。
  • 执行SQL的对象

  • 用来解决SQL注入的问题

  • 参数使用 ? 作为占位符

步骤:

  1. 导入驱动jar包

  2. 注册驱动

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

  4. 定义sql

    • 这里要使用 ? 占位符。如:select * from users where user = ? and password = ?;
  5. 获取执行sql语句的对象 PreparedStatement

    • 这里用Connection的一个方法:PreparedStatement prepareStatement(String sql)

    • 将SQL语句的String传入

  6. 给 ?赋值

    • PreparedStatement的void setxxx(参数1, 参数2)系列的方法
      • xxx:是数据类型
      • 参数1:?的索引位置(从1开始)
      • 参数2:需要的值
  7. 执行sql , 接受返回结果

  8. 处理结果

  9. 释放资源

import java.sql.*;

public class JDBCDemo05 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            // 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            
            // 获取数据库连接对象,Connection
            connection = DriverManager.getConnection("jdbc:mysql:///test1", "root", "maj6226543");
            
            // SQL语句
            String sql = "select * from account where id = ?";
            
            // 获取执行SQL语句对象(PreparedStatement),并预执行SQL语句
            preparedStatement = connection.prepareStatement(sql);
            
            // 给?赋值
            preparedStatement.setString(1,"1");     // 设置?的值
            
            // 执行SQL语句(查询select语句,返回ResultSet类型的对象)
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                System.out.println(resultSet.getString("name"));
            }

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally {
            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();
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值