MySQL~Java的数据库编程:JDBC(JDBC的环境配置以及使用)

8 篇文章 1 订阅

 

目录

JDBC的环境配置

JDBC的使用步骤(Java操作数据库)

建立数据库连接

方式一:DriverManager

 方式二:DataSource(数据源/数据库连接池)

DataSource与DriverManager的对比 

创建操作命令对象Statement

Statement

PreparedStatement

CallableStatement

执行SQL语句

处理结果集 

释放资源 

JDBC实现查询操作完整代码


什么是JDBC?

JDBC即Java Database Connectivity,Java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个api由java.sql.*、javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.

· 多种:可以同时支持多种关系型数据库,可以任意切换(兼容性)

· 统一:使用一套标准的jdbc api操作的代码

JDBC的优势

· Java语言访问数据库操作完全面向抽象接口编程

· 开发数据库应用不用限定在特定数据库厂商的API

· 程序的可移植性增强 

JDBC的环境配置

①首先需要提前准备数据库驱动包

②创建项目,并创建一个lib目录,将jar包放置在lib目录中

③项目右键,打开当前项目的设置

④按照如下顺序将依赖包添加至项目中

⑤进行完上述步骤后即配置完成,之后检验是否配置成功即可.

只要能看到如上提示即配置成功.

JDBC的使用步骤(Java操作数据库)

数据库:是一个网络主机上的数据库服务端进程,需要使用URL来连接.

· 协议名:网络传输数据的格式

· 服务器地址:服务器(进程)所在主机对应的地址(ip,域名)

      本机的ip:127.0.0.1

      域名:localhost

· 服务器端口号:主机中端口绑定的一个进程

· 带层次的文件路径:服务资源(资源可能是一个文件,也可能是虚拟资源)

再进行下列jdbc操作之前,首先需要建立一个数据库,例如在下列演示中,我使用的是自己提前建好的db_test数据库,并针对其进行操作

建立数据库连接

方式一:DriverManager

import java.sql.*;
public class First {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1、建立数据库连接
        Class.forName("com.mysql.jdbc.Driver");
        /**
         * DriverManager是jdbc的api,Connection也是(Java.sql开头)
         * url:
         * ①服务器地址,看看是不是要连接的数据库ip/域名
         * ②带层次的路径:数据库名
         * ③用户名,密码
         */
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test?user=root&password=142516&useUnicode=true&characterEncoding=UTF-8");
    }
}

 方式二:DataSource(数据源/数据库连接池)

连接池初始化时就创建了一定数量的数据库连接对象(Connection),一个程序连接某个数据库使用一个连接池就行.

import java.sql.Connection;
import java.sql.SQLException;

public class CourseQuery {
    public static void main(String[] args) throws SQLException {
        /**
         * 使用数据库连接池来获取数据库连接对象
         * 一个Java程序,创建多个还是1个连接池对象一个
         */
        MysqlDataSource ds = new MysqlDataSource();
        //url中的参数,可以使用方法来设置
        ds.setURL("jdbc:mysql://localhost:3306/db_test");
        ds.setUser("root");
        ds.setPassword("142516");
        //安全连接,如果不设置有警告
        ds.setUseSSL(false);
        //设置编码格式:按某个编码保存数据,也要按一样的编码来使用
        ds.setCharacterEncoding("UTF-8");
        Connection c = ds.getConnection();
    }
}

DataSource与DriverManager的对比 

· DriverManager每次都是新建一个物理连接,释放的时候是关闭物理连接,相当于实际操作MySQL中的点击关闭

· DataSource是初始化的时候就创建一定数量的连接,释放时只是重置并放回连接池,即可以实现复用

·  DriverManager效率低,而DataSource效率高

创建操作命令对象Statement

Statement对象用于执行sql代码,共有三种操作命令对象,分别为:StatementPreparedStatementCallableStatement.

Statement

不带占位符简单操作命令对象,用于执行不带参数的简单SQL语句

        //2、创建操作命令对象
        Statement s = c.createStatement();

PreparedStatement

 使用PreparedStatement创建操作命令对象时,需要对其传入sql语句

· 其用于执行带或不带参数的sql语句

· SQL语句会预编译在数据库系统

· 执行速度快于Statement对象

        //2.创建操作命令对象
        //使用PreparedStatement创建操作命令对象时,必须对其传入sql语句
        String sql = "select id, name from course where name=?";
        PreparedStatement ps = c.prepareStatement(sql);

CallableStatement

用于执行存储过程的,后续学习后会记录在该博客中.

执行SQL语句

· 如果是插入、修改、删除操作,调用executeUpdate方法,返回int类型表示处理成功多少条

//插入,修改,删除,都调用executeUpdate,返回int是执行成功多少条
int n = ps.executeUpdate();

· 如果是查询操作,处理结果集ResultSet,调用excuteQuery方法,返回结果集

由于在利用PreparedStatement创建操作命令对象时已经传入了sql语句,因此在执行的时候就不需要再传了. 

//Statement创建操作命令对象
ResultSet rs = s.executeQuery("select id, name from course");
//PreparedStatement创建操作命令对象
ResultSet rs = ps.executeQuery();

处理结果集 

        while(rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            System.out.println(String.format("id: %d,name: %s\n",id, name));
        }

释放资源 

 反向释放(ResultSet -> Statement -> Connection),都是调用close方法释放

        //关闭结果集
        if(rs != null) {
            try {
                rs.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }

        }
        //关闭命令
        if(s != null) {
            try {
                s.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
        //关闭连接
        if(c != null) {
            try {
                c.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }

JDBC实现查询操作完整代码

下述为Java操作数据库实现查询操作的完整代码,创建操作命令对象时利用Statement创建,并实现根据用户输入来查询的操作.

package org.example;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import java.sql.*;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Li_yizYa
 * Date: 2022—05—03
 * Time: 19:43
 */
public class CourseQuery {
    public static void main(String[] args) throws SQLException {
        //1.连接数据库
        /**
         * 使用数据库连接池来获取数据库连接对象
         * 一个Java程序,创建多个还是1个连接池对象一个
         */
        MysqlDataSource ds = new MysqlDataSource();
        //url中的参数,可以使用方法来设置
        ds.setURL("jdbc:mysql://localhost:3306/db_test");
        ds.setUser("root");
        ds.setPassword("142516");
        //安全连接,如果不设置有警告
        ds.setUseSSL(false);
        //设置编码格式:按某个编码保存数据,也要按一样的编码来使用
        ds.setCharacterEncoding("UTF-8");
        Connection c = ds.getConnection();
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入要查找的书名:>");
        String inputName = scan.nextLine();

        //2.创建操作命令对象
        //使用PreparedStatement创建操作命令对象时,必须对其传入sql语句
        String sql = "select id, name from course where name=?";
        PreparedStatement ps = c.prepareStatement(sql);
        /**
         * 替换占位符: setXXX(index, value)
         * XXX: 值的类型
         * index: 是占位符的索引位置(从1开始)
         * value: 要替换的值
         */
        ps.setString(1, inputName);

        //3.执行sql语句
        ResultSet rs = ps.executeQuery();

        //4.处理结果集
        while (rs.next()){//遍历每一行数据
            //获取id字段的值
            int id = rs.getInt("id");
            String name = rs.getString("name");
            System.out.printf("id: %s, name: %s\n", id, name);
        }
        //5.释放资源:反向释放(resultSet, Statement, Connection).close()
        if(rs != null) {
            try {
                rs.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }

        }
        //关闭命令
        if(ps != null) {
            try {
                ps.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
        //关闭连接
        if(c != null) {
            try {
                c.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

· 数据库中目前存储了六本书,可以随意查询以下六本书

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Li_yizYa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值