JDBC 基本操作步骤

本文详细介绍了如何在Java中加载JDBC驱动,通过DriverManager获取数据库连接,创建Statement和PreparedStatement对象执行SQL查询和更新,以及处理ResultSet中的数据。特别强调了PreparedStatement的安全优势。
摘要由CSDN通过智能技术生成

1、加载驱动

首先将驱动 jar 包从数据库系统官方网站上下载下来,并将驱动 jar 包添加到构建路径中。

Class.forName("驱动串");

这里的驱动串就是需要加载的 JDBC 驱动程序的名称。

JDBC 的驱动方式可以分为 4 种类型:JDBC-ODBC 桥接方式、Native-API 驱动、JDBC-Net 驱动和 Native-protocol驱动。

2、获取连接

可以通过驱动管理器 DriverManager 类获取和数据库系统的连接。

Connection conn=DriverManager.getConnection("连接串","连接数据库的用户名称","对应的口令");

连接串用于代表需要连接的数据库,连接串的标准 jdbc 主协议:子协议:其它部分,但是不同的数据库系统其对应的连接串不同。 

3、构建语句对象

在与特定数据库建立连接后,就可以发送 SQL 语句,在发送 SQL 语句之前需要创建一个语句对象。

Statement stmt=conn.createStatement();
ResultSet res=stmt.executeQuery("select * from tb_student");

通过语句对象提交所需要执行的 SQL 语句。一般不建议使用 Statement 对象,这个对象用于提交静态 sql 语句。有 sql 注入漏洞,建议使用 Statement 的子接口 PreparedStatement。

1、Statement 对象中提供了 executeQuery 方法来执行查询 select 操作,这个方法会返回查询结果集 ResultSet类对象,其中包含 SQL 语句的查询结果。

2Statement 对象中提供了 executeUpdate 方法来执行 insertupdate delete 修改操作,这个方法会返回一个 int 值,表示 sql 的增删改操作所影响的数据行数。

4、接收查询结果集

JDBC 中使用 ResultSet 对象来表示查询结果集,可以理解为一个指向满足查询结果的行指针,其中并不存放实际数据,所以在使用结果集之前不能关闭连接。

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from tb_student");

5、遍历处理结果集

ResultSet 对象包含了执行查询后满足条件的所有行,提供了对应的访问方法,有一组对应的 getXxx 方法获取指定列的值。

ResultSet 提供的成员方法:

1boolean next() throws SQLException; 行指针后移,并判断是否有数据,如果可以获取数据的返回 true,否则 false。

2xxx getXxx(int columnIndex) throws SQLException 按照列的序号获取对应类型的数据。8 种简单类型、String 都有对应的 getXxx 方法。注意:这里的需要从1开始,一般在具体应用种不建议使用序号。

3xxx getXxx(String columnLabel) throws SQLException; 按照列的名称获取对应列类型的数据。

while(resultSet.next()){
    Long id=resultSet.getLong("id");
    String username= resultSet.getString("username");
    String password=resultSet.getString("password");
    //日期有 3 种:日期 java.sql.Date、时间 java.sql.Time、日期和时间 java.sql.Timestamp
    Date birth=resultSet.getDate("rdate");//sql 包种的所有日期类型都继承于 java.util.Date
    Boolean sex=resultSet.getBoolean("sex");
    System.out.println(id+"\t"+username+"\t"+password+"\t"+birth+"\t"+(sex?"男":"女"));
}

6、关闭对象

手动关闭 ResultSetStatement Connection,必须保证 Connection 对象关闭 。

建议使用 try/finally 结构。

代码

创建table

CREATE TABLE `tbl_users`
(
    `id`       bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
    `username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    `password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    `rdate`    datetime NULL DEFAULT CURRENT_TIMESTAMP,
    `sex`      tinyint(1) NULL DEFAULT 1,
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE INDEX `username`(`username` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

创建对象

public class User {
    private Long id;
    private String username;
    private String password;
    private Date rdate;
    private Boolean sex;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getRdate() {
        return rdate;
    }

    public void setRdate(Date rdate) {
        this.rdate = rdate;
    }

    public Boolean getSex() {
        return sex;
    }

    public void setSex(Boolean sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", rdate=" + rdate +
                ", sex=" + sex +
                '}';
    }
}

 代码实现

public class Test {
    public static void main(String[] args) {
        ArrayList<User> users = new ArrayList<>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC",
                    "root", "123456");
            ps = conn.prepareStatement("select * from tbl_users");
            rs = ps.executeQuery();
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getLong("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setRdate(rs.getDate("rdate"));
                user.setSex(rs.getBoolean("sex"));
                users.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            } finally {
                try {
                    ps.close();
                } catch (SQLException e2) {
                    e2.printStackTrace();
                } finally {
                    try {
                        conn.close();
                    } catch (SQLException e3) {
                        e3.printStackTrace();
                    }
                }
            }
        }
        for (User tmp : users)
            System.out.println(tmp);
    }
}

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值