如何使用JDBC操作数据库,JDBC实战案例详细解读

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1. 前言

前面 3 篇 JDBC 入门级基础文章中我们已经探讨了什么是 JDBC如何使用JDBC 操作数据库JDBC API 详细解读以及数据库连接池的基础等。文章带来的反馈还不错今天我们使用前面学习的内容做一个实战案例训练。

image-20230124125442886

今天是初三我们继续努力都朝春天去别烂在过去和梦里要肆意妄为要志得意满

前面我们说过在 Java 代码中执行 sql 查询语句以后返回一个 ResultSet 类的对象并且 ResultSet 类提供了方法让我们可以操作查询结果数据例如可以直接打印所有查询的数据。

示例

public class JDBCDemo {

    public static void main(String[] args) throws Exception {
        //1. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接
        String url="jdbc:mysql://localhost:3306/blog?useSSL=false";
        String username="root";
        String ppassword="abc123";//密码
        Connection conn = DriverManager.getConnection(url,username,password);
        //3. 定义sql
        String sql="select * from student";
        //4. 获取sql执行对象
        Statement stmt = conn.createStatement();
        //5. 执行sql
        ResultSet rs = stmt.executeQuery(sql);
        //6. 处理结果
        while (rs.next()){
            int id=rs.getInt(1);
            String name=rs.getString(2);
            String gender=rs.getString(3);

            System.out.println(id);
            System.out.println(name);
            System.out.println(gender);

            System.out.println("---------");
        }
        //7. 释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

运行结果

image-20230124144624978

显然这样并不是我们想要的效果数据零散不好处理。所以我们可以把每条数据封装为一个实体类的对象每个对象对应数据库表的一条记录并且把每个对象放到集合中存储。练习使用的数据库表

drop table if exists student;

create table student(
	id int primary key auto_increment,
	name varchar(10),
	gender char(1)
);

insert into student(name,gender) values
('张三','男'),
('李四','女'),
('王五','男');

在 Navicat 中查看数据表

image-20230124162412597

2. 实战案例

查询学生信息表数据封装为 Student 类对象并存放在 ArrayList 集合中。

思路要解决这个问题大概分为以下几个步骤

  • 创建一个 Student 实体类
  • 查询数据库中的数据并且赋值给对象的属性
  • 将对象存储到 ArrayList 集合中

第一步创建一个Student 实体类并定义 set() 方法重写 Object 类中的 toString 方法方便查看打印效果。

public class Student {
    private int id;
    private String name;
    private String gender;

    public int getId() {
        return id;
    }

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

    public void setName(String name) {
        this.name = name;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

小tips 在 idea 中使用 Alt + Inset 快捷键可以快速给类添加或重写一些方法例如 get() set() toString() 方法等。使用 Ctrl + 鼠标左键可以快速选择多项方法。

第二步使用 Java 代码操作数据库查询数据库表中所有学生信息并通过 set() 方法赋值给 Student 类的对象将对象存储到集合中。

public class JDBCDemo {

    public static void main(String[] args) throws Exception {
        //1. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接
        String url = "jdbc:mysql://localhost:3306/blog?useSSL=false";
        String username = "root";
        String ppassword = "abc123";//密码
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql = "select * from student";
        //4. 获取sql执行对象
        Statement stmt = conn.createStatement();
        //5. 执行sql
        ResultSet rs = stmt.executeQuery(sql);
        //6. 处理结果
        List<Student> students = new ArrayList<>();

        while (rs.next()) {
            Student s = new Student();
            int id = rs.getInt(1);
            String name = rs.getString(2);
            String gender = rs.getString(3);

            s.setId(id);
            s.setName(name);
            s.setGender(gender);

            students.add(s);
        }
        System.out.println(students);
        //7. 释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

运行结果

image-20230124151820540

这样我们的程序就达到了预期的效果将来需要使用的数据全部封装为对象并存放在了集合中。

3. 增删改查操作练习

在数据库连接池入门篇中我们学习了 Druid 连接池的使用数据库连接池允许重复使用一个现有的数据库连接对象提升了系统的响应速度和时间。下面我们使用数据库连接池来练习解决上面的问题并且在获取 sql 执行对象时我们使用 PreparedStatement 类解决sql 注入的问题。

3.1 查询所有

查询所有数据并把查询结果数据封装为对象存储在集合中这里的数据表Student 实体类和上面例子中相同。

public class DruidDemo {

    public static void main(String[] args) throws Exception {
        //加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        //获取数据库连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //获取数据库连接对象
        Connection conn = dataSource.getConnection();
        //定义sql
        String sql = "select * from student";
        //获取 sql 执行对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //执行 sql
        ResultSet rs = pstmt.executeQuery();
        //处理数据将查询结果数据封装为对象存储在集合中
        List<Student> students = new ArrayList<>();
  
        while (rs.next()) {
            Student s = new Student();
            int id = rs.getInt(1);
            String name = rs.getString(2);
            String gender = rs.getString(3);

            s.setId(id);
            s.setName(name);
            s.setGender(gender);

            students.add(s);
        }
        System.out.println(students);
        //释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }
}

3.2 添加数据

现在演示往数据库中添加一条记录应用场景为用户在客户端输入一条数据时我们需要将数据添加到数据库。示例

public class DruidDemo {

    public static void main(String[] args) throws Exception {
        //接收到用户的数据
        int id=4;
        String name="小美";
        String gender="女";
        //加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        //获取数据库连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //获取数据库连接对象
        Connection conn = dataSource.getConnection();
        //定义sql
        String sql = "insert into student values(?,?,?)";
        //获取 sql 执行对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //设置参数
        pstmt.setInt(1,id);
        pstmt.setString(2,name);
        pstmt.setString(3,gender);
        //执行 sql
        int count = pstmt.executeUpdate();//返回受影响的行数
        //处理数据
        if(count>0){
            System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        }
        //释放资源
        pstmt.close();
        conn.close();
    }
}

image-20230124161437384

此时的数据表

image-20230124162502370

3.3 修改数据

现在数据表中的数据应用场景为用户在客户端修改数据对应数据库中的数据也要完成修改。示例

public class DruidDemo {

    public static void main(String[] args) throws Exception {
        //接收到用户的数据
        int id=1;
        String name="小王";
        String gender="女";
        //加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        //获取数据库连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //获取数据库连接对象
        Connection conn = dataSource.getConnection();
        //定义sql
        String sql = "update student set name=?,gender=? where id=?";
        //获取 sql 执行对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //设置参数
        pstmt.setString(1,name);
        pstmt.setString(2,gender);
        pstmt.setInt(3,id);
        //执行 sql
        int count = pstmt.executeUpdate();//返回受影响的行数
        //处理数据
        if(count>0){
            System.out.println("修改成功");
        }else{
            System.out.println("修改失败");
        }
        //释放资源
        pstmt.close();
        conn.close();
    }
}

image-20230124161542027

此时的数据表

image-20230124162612729

3.4 删除数据

下面演示删除数据用户在客户端选择删除某条数据记录时数据库中的数据也要完成删除操作。示例

public class DruidDemo {

    public static void main(String[] args) throws Exception {
        //接收到用户的数据
        int id=4;
        //加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        //获取数据库连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //获取数据库连接对象
        Connection conn = dataSource.getConnection();
        //定义sql
        String sql = "delete from student where id=?";
        //获取 sql 执行对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //设置参数
        pstmt.setInt(1,id);

        //执行 sql
        int count = pstmt.executeUpdate();//返回受影响的行数
        //处理数据
        if(count>0){
            System.out.println("删除成功");
        }else{
            System.out.println("删除失败");
        }
        //释放资源
        pstmt.close();
        conn.close();
    }
}

image-20230124161944039

此时的数据表

image-20230124162647734

4. 总结

本文是 JDBC 基础教程的练习篇学会使用 Java 代码操作数据库完成数据库数据表表中数据的增删改查操作。

大家新年好下期见。


🔖Java编程基础教程系列

Java编程进阶之路从入门到精通 👉 点击订阅👈

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 数据库