数据库--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数据库基础就此结束!

相关推荐
一心赚狗粮的宇叔9 小时前
中级软件开发工程师2025年度总结
java·大数据·oracle·c#
北岛寒沫9 小时前
北京大学国家发展研究院 经济学原理课程笔记(第二十一课 金融学基础)
经验分享·笔记·学习
while(1){yan}9 小时前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
奋进的芋圆9 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
扑火的小飞蛾9 小时前
网络安全小白学习路线图 (基于提供文档库)
学习·安全·web安全
それども9 小时前
MySQL affectedRows 计算逻辑
数据库·mysql
优雅的潮叭9 小时前
c++ 学习笔记之 malloc
c++·笔记·学习
是小章啊9 小时前
MySQL 之SQL 执行规则及索引详解
数据库·sql·mysql
计算机程序设计小李同学9 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
富士康质检员张全蛋10 小时前
JDBC 连接池
数据库