数据库--JDBC编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

前面我们都是在MySQL的编辑界面上敲代码,而这节课我们就要把SQL代码在我们的Idea上进行编写。废话不多说开始我们的旅程!


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是JDBC

实际开发中,SQL是很少手动输入的,绝大部分的SQL都是通过代码,自动执行的,这个时候就需要让其他编程语言(本节是使用Java)来操作数据库。

而MySQL是一个客户端/服务端架构的语言,根据MySQL提供API写个数据库客户端时非常容易的。

比如Oracle,SQLServer,SQLite等数据库都有API。

但是不同的数据库提供的API是不一样的,他们的开发团队不相同,所以API那么多,对于程序员的学习成本就越高,于是在Java的圈子里,就把这些API同一编程一套,指定成标准!就被称为JDBC。

目前JDBC这套API已经成了Java标准库的一部分,由于Java的影响力还是很大的,以自身作为标准,各种数据库厂商,都提供了能够适应JDBC相关的驱动包!

所以我们只需要掌握了JDBC这套API,无论操作哪个数据库,操作的代码都是不变的,基本相同。
即JDBC最主要的就是屏蔽了不同数据库原生API之间的差异,
而是使用了JDBC这一套API接口实现来规范了所有的数据库的编程操作。

二、JDBC的使用

JDBC这里的api看起来蛮多很复杂,但实际上都是固定套路,非常简单,多练就记住了。

- 描述数据库的连接和用户密码

这样一段代码,就设置好了数据库服务器连接,要操作的数据库用户和密码。

至于setURL这里面的字符串含义,我们下面也来一一解析:

**"jdbc:mysql":**这个url是给jdbc中的MySQL

来使用的

**"127.0.0.1":**服务器所在的IP地址,此处的IP时环回IP,表示主机自己。

**"3306":**这个时端口号,MySQL安装时候配置的,默认时3306.
"javatest": :要访问的数据库名。

**"characterEncoding=utf8" :**描述了请求的字符编码方式,我的MySQL版本时8.0.33的,一般情况都是utf8

**"useSSL=false":**关闭加密功能,这里不做展开介绍。

上述的内容,在后续讲述网络知识的时候,还会见到,这里只是简单的了解即可。

JDBC支持两种风格的代码,一种是DataSource,一种是DriverManger.

  • DataSource 相比于DriverManger内置了数据库连接池,可以重复利用连接
    (比如:线程池,字符串常量池......)
  • DriverManger使用的时候,需要借助反射,数据不常规的编程手段,博主文章中采用的是DataSource ,
    想要看DriverManger.我会在最后的代码总结时展示

- 于数据库建立连接

上述的操作,只是描述了数据库服务器在哪里,并没有真正建立起连接来,下面我们进行连接操作,才是真正开始通过网络去与数据库服务器进行通信。

- 构造SQL语句

通过connection.prepareStatement方法构造出一个对象,PreparedStatement类型的,其实这个对象背后做了很多事,比如会对SQL语句进行一些预处理......
上面的写法是直接写死了,如果是查询操作还好,那如果是要执行新增操作呢?也是直接写死吗?

更多的时候,插入的数据是动态的,,那要怎么写呢?可以使用PerparedStatement来通过占位符替换的方式,从而实现动态SQL的构造:

这里每个?的位置都是通过1开始计算的,setString(1,sn)就是将第一个?位置的数据插入成sn(学号),后面的以此类推。

构造出指定的SQL语句后,就可以通过statement这个引用来执行了。

- 执行SQL语句

excuteQuery执行后,会返回一个结果集,如果是excuteUpdate则返回这个操作影响的几行。

- 遍历结果集

- 断开连接

- 依次释放资源,关闭连接

JDBC 使用步骤总结:

1.创建DataSource ->描述了数据库服务器在哪里(url,user,password)

2.建立连接; dataSource.getConnection();

3.拼装SQL语句

Statement或者Preparement

4.执行SQL execute方法/executQuery/execuUpdate

5.遍历结果集合

ResultSet,迭代器遍历

6.依次释放,关闭资源

1)ResultSet,2)Statement,3)Connection

JDBC在实际工作中,可能并不会直接使用,上述的代码大家也能看到,写起来还是比较麻烦的,因此就有了一些库和框架,针对JDBC进行了进一步的封装,让我们使用起来更方便,比如后续会学习到的Mybatis这种......

代码实例

sql 复制代码
//这是DataSource
 public static void main(String[] args) {
        //1.定义MySQL数据源对象
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        //设置数据库连接
        mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/javatest?characterEncoding=utf8" +
                "&allowPublicKeyRetrieval=true&useSSL=false");
        //用户名
        mysqlDataSource.setUser("root");
        //密码
        mysqlDataSource.setPassword("Wm127369#");
        //定义JDBC的数据源对象
        DataSource dataSource = mysqlDataSource;
        //定义连接对象
        Connection connection = null;
        //定义预处理SQL执行对象
        PreparedStatement statement = null;
        //定义结果集
        ResultSet resultSet = null;
        try {
            //1通过数据源获取数据库连接
            connection = dataSource.getConnection();
            //2.获取预处理SQL执行对象
            //定义要执行的SQL
            String sql = "select student_id,sn,name,mail,class_id from student where name = ?";
            statement = connection.prepareStatement(sql);
            //接收用户的输入
            System.out.println("请输入学生的姓名:");
            Scanner scanner = new Scanner(System.in);
            String name = scanner.next();
            //3.用真实值替换占位符
            statement.setString(1,name);
            //4.执行SQL,获取结果集
            resultSet = statement.executeQuery();
            //5.遍历结果集
            while (resultSet.next()){
                long stuId = resultSet.getLong("student_id");
                String stuSn = resultSet.getString(2);
                String stuName = resultSet.getString(3);
                String stuMail = resultSet.getString(4);
                long classId = resultSet.getLong(5);
                System.out.println(MessageFormat.format("学生编号 = {0},学号 = {1},学生姓名{2},邮箱 = {3},班级编号 = {4}",stuId,stuSn,
                        stuName,stuMail,classId));
            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            //依次释放资源,关闭连接
            if (resultSet !=null){
                try {
                    resultSet.close();
                }catch ( SQLException e){
                    e.printStackTrace();
                }
            }
            if (statement !=null){
                try {
                    statement.close();
                }catch ( SQLException e){
                    e.printStackTrace();
                }
            }
            if (connection !=null){
                try {
                    connection.close();
                }catch ( SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }

//这是DriverManager
  public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet =null;
        try {
            //1.加载数据库厂商提供的驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
             //2.获取数据库连接
            connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java113?characterEncoding=utf8" +
                    "&allowPublicKeyRetrieval=true&useSSL=false", "root", "Wm127369#");
            //3.创建Statement对象
            statement = connection.createStatement();
            //4.定义SQL并执行SQL语句
            System.out.println("请输入学生姓名:");
            Scanner scanner = new Scanner(System.in);
            //接收用户输入
            String name = scanner.next();
            String sql = "select id,name,chinese,math,english from exam where name ='"+name + "'";
            statement.executeQuery(sql);
            //5.执行SQL,获取查询结果
            resultSet = statement.executeQuery(sql);
            //6.对结果进行遍历,获取结果集
            while (resultSet.next()){
                long stuId = resultSet.getLong(1);
                String stuName = resultSet.getString(2);
               float stuChinese = resultSet.getFloat(3);
                float stuMath = resultSet.getFloat(4);
                float stuEnglish = resultSet.getFloat(5);
                System.out.println(MessageFormat.format("学生编号={0},学生姓名 = {1}, 语文成绩 = {2},数学成绩 = {3},英语成绩 = {4}",stuId,
                        stuName,stuChinese,stuMath,stuEnglish));

            }
        }catch (SQLException e){
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }finally {
            //依次释放资源,关闭连接
            if (resultSet !=null){
                try {
                    resultSet.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if (statement !=null){
                try {
                    statement.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if ( connection !=null){
                try{
                    connection.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }

总结

其实JDBC并不难,就是几个固定的套路,如果是应付考试,还是需要直接多建几个表利用JDBC使用一些复杂查询,多练习练习,如果是工作中,用JDBC就不多了,会使用更方便的框架,如果你是一个很有想法的同学,可以基于JDBC进行修改,搭建一套属于直接的框架来......
MySQL数据库基础就此结束!

相关推荐
_dindong3 小时前
Linux网络编程:进程间关系和守护进程
linux·运维·服务器·网络·c++·学习
小白黑科技测评3 小时前
2025 年视频去水印工具实测:擦擦视频双版本解析一键去字幕与多格式兼容能力
java·人工智能·音视频·智能电视·1024程序员节
华仔啊3 小时前
Go 语言未来会取代 Java 吗?别争了,先看完这篇再说
java·后端·go
多多*3 小时前
Spring Bean的生命周期 第二次思考
java·开发语言·rpc
能不能别报错3 小时前
K8s学习笔记(二十四) ingress
笔记·学习·kubernetes
CodeCraft Studio3 小时前
FastReport VCL发布2026.1版本:全面支持RAD Studio 13,PDF输出功能显著增强
数据库·pdf·rad studio·fastreport·报表设计器·报表开发工具·vcl
小丁努力不焦虑4 小时前
c++基本语法
java·c++·算法
Olrookie4 小时前
Maven快速上手笔记
java·笔记·maven
能不能别报错4 小时前
K8s学习笔记(二十三) 网络策略 NetworkPolicy
笔记·学习·kubernetes