JDBC(Java Database Connectivity)的基础知识和增删改查操作

目录

1:JDBC的作用

2.数据库的建立

3.JDBC的增删改查的操作

Statement和PreparedStatement的区别 

1.查看数据库中的信息

2.增加一个学生信息,

3.删除小明同学的信息

4. 把学号为202301同学的密码改为66666666

​5. 使用List和Map存储查询数据库信息

 总代码


1:JDBC的作用

JDBC(Java Database Connectivity)的作用是提供一个Java编程语言与关系型数据库进行连接和交互的标准接口。它允许Java程序通过JDBC驱动与各种数据库进行通信,执行数据库操作并处理返回的结果。以下是JDBC的主要作用:

  1. 数据库连接管理:JDBC允许程序与数据库建立连接,并提供了管理连接的功能。它允许创建、关闭和管理数据库连接,以确保应用程序可以与数据库进行有效的通信。

  2. 执行SQL操作:JDBC提供了执行SQL语句(如插入、删除、更新和查询)的方法和接口。通过JDBC,开发人员可以使用预编译的语句或动态构建的语句来与数据库交互,执行各种操作以满足应用程序的需求。

  3. 参数绑定和结果处理:JDBC允许开发人员使用参数绑定来安全地处理用户输入,并能够处理和解析从数据库返回的结果。这包括处理查询结果集、获取和设置数据以及处理元数据等。

  4. 事务管理:JDBC提供了事务管理的支持,允许开发人员以原子方式执行数据库操作。通过JDBC的事务支持,可以保证一组相关操作要么全部成功执行,要么全部回滚,确保数据库的一致性和完整性。

  5. 数据库元数据访问:JDBC允许应用程序获取关于数据库的元数据,如表、列、索引和约束等信息。这样的元数据访问功能使开发人员能够动态地查询数据库结构和属性,并根据需要进行适当的操作。

  6. 异常处理和错误报告:JDBC定义了一套异常类和错误码,用于捕获和处理与数据库交互过程中可能发生的异常和错误。通过适当地处理这些异常,可以提高应用程序的可靠性和容错性。

2.数据库的建立

使用mysql和navicat建立一个school数据库,在该数据库下建立一张学生表,名字为student,

该表有学号,姓名,性别,年龄,密码等属性,数据类型均为字符串类型,建立完成后如下图所示:

 3.JDBC的增删改查的操作

前置准备 :

首先,确保你已经设置好了数据库的连接和相关的JDBC驱动。

使用JDBC,我们可以通过Java代码执行数据库的增删改查操作。下面是一个简单的示例,演示如何使用JDBC执行增删改查操作。

Statement和PreparedStatement的区别 

Statement和PreparedStatement是Java编程语言中用于执行SQL语句的接口,它们之间有以下区别:

  1. 预编译:PreparedStatement在执行之前进行预编译,将SQL语句发送到数据库并进行语法分析和编译。这样可以提高后续的执行效率,尤其是在需要多次执行相同SQL语句时。而Statement在执行时每次都需要将SQL语句发送到数据库解析和编译,效率较低。

  2. 参数绑定:PreparedStatement允许使用参数占位符(例如,?)来表示动态值,并可以使用方法如setInt()setString()等将具体的值绑定到占位符上。这样可以有效地防止SQL注入攻击,并且方便进行参数化查询,提高应用程序的安全性和性能。而Statement直接将值嵌入到SQL语句中,容易受到SQL注入攻击,并且在每次更改参数时都需要手动构建新的SQL语句。

  3. 缓存与重用:由于PreparedStatement在预编译阶段进行了处理,数据库可以缓存编译好的执行计划,从而在后续的执行中可以重用该计划,提供更好的性能。而Statement每次执行都需要进行语法分析和编译,无法进行重用,效率较低。

  4. 执行效率:由于PreparedStatement进行了预编译和参数绑定,在执行相同的SQL语句多次时,通常比Statement执行的更快。而使用Statement,每次执行都需要将SQL语句解析和编译一次,效率较低。

1.查看数据库中的信息

    public void Select() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school","root","123456");
        Statement statement=connection.createStatement();
        String sql="select * from student;";
        ResultSet re=statement.executeQuery(sql);
        while(re.next()) {
            String a = re.getString("sno");
            String b = re.getString("name");
            String c = re.getString("sex");
            String d = re.getString("age");
            String e = re.getString("password");
            System.out.printf("%s %s %s %s %s\n", a, b, c, d, e);
        }
        statement.close();
        connection.close();
    }

运行结果: 

2.增加一个学生信息,

信息如下:

学号:202305 姓名:小明 性别:男 密码:123123 

代码如下:

    public void Add() throws ClassNotFoundException, SQLException {
//        1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
//        2.获取连接
        Connection connection=DriverManager.getConnection("jdbc:mysql:///school","root","123456");
//        3.编写SQL语句结果,动态值的部分用?代替
        String sql="insert into student(sno,name,sex,age,password) values(?,?,?,?,?)";
//        4.创建preparedStatement,并传入SQL语句结果
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
//        5.占位符赋值
        preparedStatement.setObject(1,"202305");
        preparedStatement.setObject(2,"小明");
        preparedStatement.setObject(3,"男");
        preparedStatement.setObject(4,"18");
        preparedStatement.setObject(5,"123123");
//        6.发送SQL语句
        int p= preparedStatement.executeUpdate();
//        7.输出结果
        if(p>0){
            System.out.printf("插入学生信息成功!\n");
        }
        else{
            System.out.printf("插入失败\n");
        }
//        8.关闭资源
        preparedStatement.close();
        connection.close();
    }

运行结果如图:

数据库信息如图:

3.删除小明同学的信息

代码如下:

    public void Delete() throws SQLException, ClassNotFoundException {
        //       1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //        2.获取连接
        Connection connection=DriverManager.getConnection("jdbc:mysql:///school","root","123456");
        //        3.编写SQL语句结果,动态值的部分用?代替
        String sql="delete from student where name=?";
        //        4.创建preparedStatement,并传入SQL语句结果
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
        //        5.占位符赋值
        preparedStatement.setObject(1,"小明");
        //        6.发送SQL语句
        int p=preparedStatement.executeUpdate();
        //        7.输出结果
        if(p>0){
            System.out.printf("删除学生信息成功!\n");
        }
        else{
            System.out.printf("删除失败!\n");
        }
        //        8.关闭资源
        preparedStatement.close();
        connection.close();
    }

运行结果如图:

 数据库信息如图:

4. 把学号为202301同学的密码改为66666666

代码如下:

    public void Change() throws ClassNotFoundException, SQLException {
        //        1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //        2.获取连接
        Connection connection=DriverManager.getConnection("jdbc:mysql:///school","root","123456");
        //        3.编写SQL语句结果,动态值的部分用?代替
        String sql="update student set password=? where sno=?";
        //        4.创建preparedStatement,并传入SQL语句结果
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
        //        5.占位符赋值
        preparedStatement.setObject(1,"66666666");
        preparedStatement.setObject(2,"202301");
        //        6.发送SQL语句
        int p=preparedStatement.executeUpdate();
        //        7.输出结果
        if(p>0){
            System.out.printf("修改学生信息成功!\n");
        }
        else{
            System.out.printf("修改失败!\n");
        }
        //        8.关闭资源
        preparedStatement.close();
        connection.close();
    }

运行结果如图:

数据库信息如图所示:

5. 使用List和Map存储查询数据库信息

代码如下:

    public void testSelect() throws SQLException, ClassNotFoundException {
        //        1.注册驱动
         Class.forName("com.mysql.cj.jdbc.Driver");
//        2.获取连接
        Connection connection=DriverManager.getConnection("jdbc:mysql:///school","root","123456");
//        3.编写SQL语句结果,动态值的部分用?代替
        String sql="select * from student";
//        4.创建preparedStatement,并传入SQL语句结果
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
//        5.占位符赋值
//        6.发送SQL语句
        ResultSet resultSet=preparedStatement.executeQuery();
//        7.结果集解析
        List<Map> list=new ArrayList<>();
//        mataData 装的当前结果集列的信息对象(他可以获取列的名称根据下标,可以获取列的数量)
        ResultSetMetaData mataData=resultSet.getMetaData();
        int num=mataData.getColumnCount();
        while(resultSet.next()){
            Map map=new HashMap();
            for(int i=1;i<=num;i++){
               Object value=resultSet.getObject(i);
               String label=mataData.getColumnLabel(i);
               map.put(label,value);
            }
            list.add(map);
        }
        System.out.printf("学生信息如下:\n");
        System.out.println(list);
//        8.关闭资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }

运行结果如图:

 总代码

import org.junit.Test;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.util.*;
public class TestAll {
    @Test
    public void Add() throws ClassNotFoundException, SQLException {
//        1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
//        2.获取连接
        Connection connection=DriverManager.getConnection("jdbc:mysql:///school","root","123456");
//        3.编写SQL语句结果,动态值的部分用?代替
        String sql="insert into student(sno,name,sex,age,password) values(?,?,?,?,?)";
//        4.创建preparedStatement,并传入SQL语句结果
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
//        5.占位符赋值
        preparedStatement.setObject(1,"202305");
        preparedStatement.setObject(2,"小明");
        preparedStatement.setObject(3,"男");
        preparedStatement.setObject(4,"18");
        preparedStatement.setObject(5,"123123");
//        6.发送SQL语句
        int p= preparedStatement.executeUpdate();
//        7.输出结果
        if(p>0){
            System.out.printf("插入学生信息成功!\n");
        }
        else{
            System.out.printf("插入失败\n");
        }
//        8.关闭资源
        preparedStatement.close();
        connection.close();
    }
    @Test
    public void Delete() throws SQLException, ClassNotFoundException {
        //       1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //        2.获取连接
        Connection connection=DriverManager.getConnection("jdbc:mysql:///school","root","123456");
        //        3.编写SQL语句结果,动态值的部分用?代替
        String sql="delete from student where name=?";
        //        4.创建preparedStatement,并传入SQL语句结果
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
        //        5.占位符赋值
        preparedStatement.setObject(1,"小明");
        //        6.发送SQL语句
        int p=preparedStatement.executeUpdate();
        //        7.输出结果
        if(p>0){
            System.out.printf("删除学生信息成功!\n");
        }
        else{
            System.out.printf("删除失败!\n");
        }
        //        8.关闭资源
        preparedStatement.close();
        connection.close();
    }
    @Test
    public void Change() throws ClassNotFoundException, SQLException {
        //        1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //        2.获取连接
        Connection connection=DriverManager.getConnection("jdbc:mysql:///school","root","123456");
        //        3.编写SQL语句结果,动态值的部分用?代替
        String sql="update student set password=? where sno=?";
        //        4.创建preparedStatement,并传入SQL语句结果
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
        //        5.占位符赋值
        preparedStatement.setObject(1,"66666666");
        preparedStatement.setObject(2,"202301");
        //        6.发送SQL语句
        int p=preparedStatement.executeUpdate();
        //        7.输出结果
        if(p>0){
            System.out.printf("修改学生信息成功!\n");
        }
        else{
            System.out.printf("修改失败!\n");
        }
        //        8.关闭资源
        preparedStatement.close();
        connection.close();
    }
    @Test
    public void Select() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school","root","123456");
        Statement statement=connection.createStatement();
        String sql="select * from student;";
        ResultSet re=statement.executeQuery(sql);
        while(re.next()) {
            String a = re.getString("sno");
            String b = re.getString("name");
            String c = re.getString("sex");
            String d = re.getString("age");
            String e = re.getString("password");
            System.out.printf("%s %s %s %s %s\n", a, b, c, d, e);
        }
        statement.close();
        connection.close();
    }
    @Test
    public void testSelect() throws SQLException, ClassNotFoundException {
        //        1.注册驱动
         Class.forName("com.mysql.cj.jdbc.Driver");
//        2.获取连接
        Connection connection=DriverManager.getConnection("jdbc:mysql:///school","root","123456");
//        3.编写SQL语句结果,动态值的部分用?代替
        String sql="select * from student";
//        4.创建preparedStatement,并传入SQL语句结果
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
//        5.占位符赋值
//        6.发送SQL语句
        ResultSet resultSet=preparedStatement.executeQuery();
//        7.结果集解析
        List<Map> list=new ArrayList<>();
//        mataData 装的当前结果集列的信息对象(他可以获取列的名称根据下标,可以获取列的数量)
        ResultSetMetaData mataData=resultSet.getMetaData();
        int num=mataData.getColumnCount();
        while(resultSet.next()){
            Map map=new HashMap();
            for(int i=1;i<=num;i++){
               Object value=resultSet.getObject(i);
               String label=mataData.getColumnLabel(i);
               map.put(label,value);
            }
            list.add(map);
        }
        System.out.printf("学生信息如下:\n");
        System.out.println(list);
//        8.关闭资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捉只树袋熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值