JavaWeb(七)JDBC——MySQL

本文详细介绍了JavaWeb中JDBC的概念、组成及使用,包括数据库连接、增删查改操作,以及JDBC的拓展知识,如结果集ResultSet、预编译PreparedStatement、批处理和事务处理。通过实例展示了JDBC连接MySQL数据库的过程,以及事务管理在并发操作中的重要性。
摘要由CSDN通过智能技术生成

上一章讲解了JSP的高级标签运用,链接:EL表达式 && JSTL标签库

任何软件,除去文档和程序以外,剩下的就是数据了。那么在学习JavaWeb的途中就得学会对数据库的访问,就得提及JDBC。

目录

何为JDBC?

JDBC的组成

JDBC的使用

    添加、改变、删除记录

    查询记录

JDBC的拓展知识

    结果集ResultSet

        光标

        元数据

        特性

    预编译PreparedStatement

    批处理

    时间类型转换问题

    存储数据大的文件

    事务

        定义

通俗理解

特性(ACID)

MySQL里的事务

JDBC事务

事务隔离级别

其他数据库连接的URL格式

源码剖析

后话


何为JDBC?

JDBC(Java Database Connectivity)就是Java数据库连接,说白了就是使用Java语言向数据库发送SQL语句来操作数据库。


JDBC的组成

提及一下以前的历史,SUN公司与各大数据库厂商讨论,最终得出一个结论:由SUN公司提供一套访问数据库的规范(一组接口),并提供连接数据库的协议标准,然后各大数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API。而SUN公司提供的规范命名为JDBC,而各个厂商提供的遵循了JDBC规范的访问所属数据库的API被称之为驱动。

那么就可以得出JDBC地组成:JDBC Driver Interface 以及 JDBC API

JDBC Driver Interface:是面向JDBC驱动程序开发商的编程接口,它会把我们通过JDBC API发给数据库的通用指令翻译给他们自己的数据库。

JDBC API:是提供给开发者的一组独立于数据库的API,对任何数据库的操作,都可以用这组API来进行。那么要把这些通用的API翻译成特定数据库能懂的"指令",就要由JDBC Driver Interface来实现了。


JDBC的使用

JDBC有四大配置参数:驱动类名称、连接的数据库url、用户名以及密码。对于数据库url来说,不同的数据库厂商有不同的数据库格式。接下来使用其对数据库进行增删查改,以MYSQL数据库为例。

首先是连接数据库模块:

        String driverClassName = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/student";
        String userName = "root";
        String password = "123456";
        // 1.加载驱动
        Class.forName(driverClassName);
        // 2.获得Connection
        Connection con = DriverManager.getConnection(url, userName, password);

值得一提的是,其中加载驱动类是可以省略的,但为了兼容低版本的JDBC,还是写上为妙。因为在JDBC4.0后,每个驱动的Jar包中,在META-INF/services目录下提供了一个名为java.sql.Driver的文件,文件的内容就是该接口的实现类名称,即如下所示:

回到正题,这几串代码又是如何产生联系的呢?找到com.mysql.jdbc.Driver的源文件,其中有一个static块,块内的代码如下所示:

    static {
            try {
                DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
    }

从块内的代码来看,块内的内容就是把自己(驱动)注册到DriverManager中。那么当执行Class.forName方法时就会初始化驱动类,并且自行执行static块内的代码,以达到注册驱动的目的。

接下来对数据库进行增删改查,其顺序是通过Connection得到Statement对象,再由Statement对象发送sql语句。

先创建一个message表,相关字段设置如下所示:

CREATE TABLE message (
    number char(15) PRIMARY KEY,
    name char(15),
    age int(5)
);

    添加、改变、删除记录

        Connection con = null;
        try {
            // 连接数据库的四大参数
            String driverClassName = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/student";
            String userName = "root";
            String password = "123456";
            // 1.加载驱动
            Class.forName(driverClassName);
            // 2.获得Connection
            con = DriverManager.getConnection(url, userName, password);
            // 3.通过Connection得到Statement对象
            Statement stmt = con.createStatement();
            // 4.使用Statement发送sql语句
            // String sql = "INSERT INTO message VALUES('0001', 'zhangsan', 18)";
            // String sql = "UPDATE message SET age=30 where number='0001'";
            String sql = "DELETE FROM message";
            // 返回影响的行数
            int total = stmt.executeUpdate(sql);
            System.out.println(total);

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e.getMessage());
        } finally {
            if (con != null)
                con.close();
        }

结果如图所示:

    查询记录

        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            String driverClassName = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/student";
            String userName = "root";
            String password = "123456";
            // 1.加载驱动
            Class.forName(driverClassName);
            // 2.获得Connection
            con = DriverManager.getConnection(url, userName, password);
            // 3.通过Connection得到Statement对象
            stmt = con.createStatement();
            // 4.使用Statement发送sql语句
            String sql = "SELECT * FROM message";
            // 返回结果集
            rs = stmt.executeQuery(sql);
            while (rs.next()) {
                // 可以用数字代表表中的第几列获取记录
                String id = rs.getString(1);
                // 也可以直接用表中的列名获取记录
                // rs.getString("number");
                String name = rs.getString(2);
                int age = rs.getInt(3);
                System.out.println(id + "---" + name + "---" + age);
            }

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e.getMessage());
        } finally {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (con != null) con.close();
        }

结果如图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值