JDBC基础,介绍了简单的连接数据库,并通过在后端写SQL语句对数据库进行基本的增删查改操作

本文介绍了JDBC的基础知识,包括JDBC的作用,连接数据库所需的参数,如数据库URL、用户名和密码。通过Class.forName()加载数据库驱动,使用DriverManager.getConnection()建立连接。接着讲解了JDBC的核心API,如DriverManager、Connection、Statement、PreparedStatement和ResultSet接口及其常用方法。最后,展示了使用JDBC进行增删改查操作的示例代码,包括添加、修改、删除和查询数据的过程。

一、JDBC基础

跟数据库连接,并且可以对数据库里面的数据通过SQL语句进行处理等操作。

1.1 JDBC

JDBC是SUN公司的,所以要按照他们的规范来,因为MYSQL和Oracle都是SUN公司的。三个产品都是一个公司的,一般不会出现兼容性不好的问题吧,甚至用他们来配合非常的美。

1.2 JDBC链接数据库需要的参数

  1. 需要明确哪一个数据库,针对于不同的数据库有着不同的驱动去进行连接。

  2. 导包 我们现在项目一般用到的是msyql数据库,导mysql-connector-java-5.1.47.jar包

  3. 对数据库进行连接,需要知道链接的数据库,当前的主机名,ip地址以及端口号等

 jdbcUrl=jdbc:mysql://localhost:3306/连接的数据库名称?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
  1. 链接对应数据库需要使用用户名和密码,使用字符串数据

1.3 连接数据库案例

IDEA连接数据库,这是灰常重要的IDEA需要连接数据库!!!

显示

依次点击,会进入到一个数据库连接界面

现在是

接下来,我们需要回想一下反射当中的获取Class对象的方法:Class.forName(String str)

这个方法有两种用途~

package JDBC;
public class JdbcDemo01 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        String JbdcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";
        String username = "root";
        String password = "root";
        /**
         * 加载驱动,Class.forName(String str)
         * 通过反射的形式去加载,当前方法有两个用处
         *  1.获取指定类型的Class
         *  2.如果对应类型当前Java程序尚未加载,则加载指定类型
         *  当前的方法只是用了第二个功能
         */
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection(JbdcUrl, username, password);

        System.out.println(connection);
        connection.close();
    }
}

在这里插入图片描述

1.4 JDBC核心API

class java.sql.DriverManager 	
	Java JDBC 驱动管理类,主要负责驱动注册和数据库连接对象获取
	常用方法:
		public static void registerDriver(java.sql.Driver driver);	
			注册符合 JDBC 规范要求的 Driver 对象,增强当前 Java 程序,可以操作数据库
		public static java.sql.Connection getConnection(String jdbcUrl, String username, 
				String password)
			根据提供的 JdbcUrl JDBC 数据库连接规范 URL,对应的数据库用户名和密码获取到数据库 
			java.sql.Connection 连接对象

interface java.sql.Connection 
	Java JDBC 数据库连接对象接口,主要用于获取数据库连接相关的信息,获取数据库 SQL 搬运工对象
	常用方法:
		public java.sql.Statement createStatement();
			通过该数据库连接对象,获取对应当前数据库的 SQL 语句搬运工对象
		public java.sql.PreparedStatement prepareStatement(String sql);
			通过该数据库连接对象,根据参数 SQL 语句,获取对应当前数据库的 SQL 语句预处理搬运工对象。

interface java.sql.Statment
	Java JDBC 规范 数据库搬运工对象,在项目中主要处理的 SQL 语句可以分为两大部分,一部分为更新(insert, 
	update, delete),一部分为查询(select)
	常用方法:
		public int executeUpdate(String sql);
			执行 SQL 语句更新操作,主要可以执行的 SQL 语句类型为 insert,update,delete 操作,返回值是 
			int 类型,返回值是当前 SQL 语句执行,对应数据表受到影响的行数。
				Query OK, 1 row affected(5ms)
		public java.sql.Resultset executeQuery(String sql);
			执行 SQL 语句查询操作,主要可以执行的 SQL 语句类型为 select 操作,返回值为 
			java.sql.ResultSet 数据库查询结果集对象。

interface java.sql.PreparedStatment extends java.sql.Statment
	Java JDBC 规范 数据库【预处理】搬运工对象,在项目中主要处理的 SQL 语句可以分为两大部分,一部分为更新
	(insert, update, delete),一部分为查询(select)PreparedStatment 可以引入 SQL 语句参数操作。SQL
	参数为 ? 占位符
	常用方法:
		public void setXXX(int index, XXX value);
			可以给予 SQL 语句参数赋值操作,第一个参数是 SQL 语句参数下标位置(1 开始),给予当前 SQL 语句
			的实际参数。类型支持任意类型(int, double, float, long, Object, String ...)
		public int executeUpdate();
			执行 SQL 语句更新操作,主要可以执行的 SQL 语句类型为 insert,update,delete 操作,返回值是 
			int 类型,返回值是当前 SQL 语句执行,对应数据表受到影响的行数。
				Query OK, 1 row affected(5ms)
		public java.sql.Resultset executeQuery();
			执行 SQL 语句查询操作,主要可以执行的 SQL 语句类型为 select 操作,返回值为 
			java.sql.ResultSet 数据库查询结果集对象。

interface java.sql.ResultSet
	Java JDBC 规范,数据库查询结果集对象。可以认为是 select 查询 SQL 语句最终结果表格对应的 Java 类型。
	常用方法:
		XXX getXXX(String columnName);
			根据列名/字段名,获取数据库当前数据行对应的数据信息,类型可以是任意类型,但是要求和数据库存储类型
			一致。支持(int, String, Long...)
		XXX getXXX(int columnIndex);	
        	根据列下标,获取数据库当前数据行对应的数据信息,类型可以是任意类型,但是要求和数据库存储类型一致。
        	支持(int, String, Long...)
        	【注意】列下标从 1 开始
        boolean next();
        	1. 判断当前数据库查询结果集对象是否还有数据行可以解析,如果可以返回 true,否则返回 false
        	2. 提取当前数据行进行解析操作,同时指向下一行数据

1.5 使用JDBC进行初步的增删改查操作

添加操作

package JDBC;
import java.sql.*;
public class JdbcDemo02 {
    public static void main(String[] args) {
        String JbdcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";
        String username = "root";
        String password = "root";
        Connection connection = null;
        Statement statement = null;

        /**
         * 加载驱动,Class.forName(String str)
         * 通过反射的形式去加载,当前方法有两个用处
         *  1.获取指定类型的Class
         *  2.如果对应类型当前Java程序尚未加载,则加载指定类型
         *  当前的方法只是用了第二个功能
         */
        try {
            //加载JDBC连接数据库的驱动
            Class.forName("com.mysql.jdbc.Driver");
            //通过DriverManager连接到数据库 数据库连接对象接口,主要用于获取数据库连接相关的信息
            connection = DriverManager.getConnection(JbdcUrl, username, password);
            // 准备SQL插入语句
            String sql = "insert into gp_01.student(name, age, gender) VALUES ('小申',22,true)";
            //获取 SQL 语句搬运工对象
            statement = connection.createStatement();
            //执行 SQL 语句 返回结果是对数据库影响的行数
            int rows = statement.executeUpdate(sql);
            System.out.println("对数据库影响了" + rows + "行");

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            //按照先开后关的原则进行关闭资源
            try {
                if (statement != null) {
                    statement.close();
                }
                if (connection != null){
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

运行结果发现数据已经添加到数据库中~
显示

修改操作

//跟上面的代码除了sql语句外完全一样 
String sql = "update gp_01.student set name = '被修改的小申' where id = 14";

显示

删除操作

String sql = "delete from gp_01.student where id = 14";

显示

查询操作

接下来开始变的不一样了,查询操作!一般我们都是很少动数据库中的数据,大部分都只是对数据库中的数据进行查询操作,但是想查询操作返回影响了几行数据,怪怪的~

查询操作和上面的有所不同,代码如下:

package JDBC;
public class JdbcDemo03 {
    public static void main(String[] args) {
        String JbdcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";
        String username = "root";
        String password = "root";
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        /**
         * 加载驱动,Class.forName(String str)
         * 通过反射的形式去加载,当前方法有两个用处
         *  1.获取指定类型的Class
         *  2.如果对应类型当前Java程序尚未加载,则加载指定类型
         *  当前的方法只是用了第二个功能
         */
        try {
            //加载JDBC连接数据库的驱动
            Class.forName("com.mysql.jdbc.Driver");
            //通过DriverManager连接到数据库 数据库连接对象接口,主要用于获取数据库连接相关的信息
            connection = DriverManager.getConnection(JbdcUrl, username, password);
            // 准备SQL插入语句
            String sql = "select * from gp_01.student where id = 1";
            //获取 SQL 语句搬运工对象
          statement =   connection.createStatement();
            //执行 SQL 语句 返回结果是ResultSet数据类型,里面存储了数据
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()){
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                int gender = resultSet.getInt("gender");
                System.out.println(id);
                System.out.println(name);
                System.out.println(age);
                System.out.println(gender);
            }

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            //按照先开后关的原则进行关闭资源
            try {
                if (resultSet != null){
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null){
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

显示

可以看出查询的代码和增删改的代码是不同的~~

public void testSelectAll() {
        // 1. 准备数据库连接必要的参数
        String jdbcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";
    String username = "root";
    String password = "root";

    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");

        connection = DriverManager.getConnection(jdbcUrl, username, password);

        statement = connection.createStatement();

        String sql = "select * from student";

        resultSet = statement.executeQuery(sql);

        ArrayList<Student> list = new ArrayList<>();

        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            boolean gender = resultSet.getBoolean("gender");

            list.add(new Student(id, name, age, gender));
        }

        list.forEach(System.out::println);

    } catch (ClassNotFoundException | SQLException e) {
        throw new RuntimeException(e);
    } finally {
        try {
            if (resultSet != null) {
                resultSet.close();
            }

            if (statement != null) {
                statement.close();
            }

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

1.6 包含有未知数的SQL增删改查操作

package JDBC;
/**
 * @Description
 * @Author zpd
 * @Date 2023/3/17
 */
public class JdbcDemo04 {
    public static void main(String[] args) {
        // 1. 准备数据库连接必要的参数
        String jdbcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";
        String username = "root";
        String password = "root";

        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(jdbcUrl, username, password);
        /*
        PreparedStatement   操作流程
            1. 准备 SQL 语句,可以使用 ? 占位参数
            2. 通过数据库连接对象 预处理 SQL 语句,得到 PreparedStatement 对象
            3. PreparedStatement 对象 赋值参数操作
            4. 执行 SQL 语句得到对应结果
         */
            String sql = "select * from gp_01.student where id = ?";
            statement = connection.prepareStatement(sql);
            //给sql第一个未知数据赋值为1
            statement.setString(1, "1");

            resultSet = statement.executeQuery();

            if (resultSet.next()) {
                System.out.println("PreparedStatement 操作登陆成功");
            } else {
                System.err.println("PreparedStatement 操作登陆失败");
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值