【JDBC上篇】什么是JDBC

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 【JDBC上篇】什么是JDBC,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、对JDBC本质的理解

Java DataBase Connectivity(Java语言连接数据库),其本质是SUN公司指定的一套接口(interface),这套接口在 java.sql.* 下

既然是一套接口,接口都有调用者和实现者,面向接口调用,面向接口写实现类,都属于面向接口编程。面向接口编程的优势是解耦合,降低程序的耦合度,提高程序的扩展力。

JDBC
驱动:

数据库的驱动大多以jar包的形式存在,解压后得到很多class文件,这些class文件就是对JDBC接口的实现,驱动由各大数据库厂家提供。
驱动

2、代码模拟JDBC的本质

SUN公司提供接口规范:

/**
 * SUN公司提供
 */
public interface JDBC {
    //连接数据库的方法
    void getConnection();
}

各数据库厂商面向接口写各自的实现类,称驱动:

/**
 * 数据库厂商角色,如MySql
 * 编写JDBC接口的实现类,称为驱动
 */
public class MySQL implements JDBC{
    @Override
    public void getConnection() {
        //这里写MySQL底层的一些具体实现
        System.out.println("连接MySQL成功");
    }
}

用户面向接口编程:

/**
 * Programmer面向接口编程
 */
public class JavaProgrammer {
    public static void main(String[] args) {
        JDBC jdbc = new MySQL();
        jdbc.getConnection();
    }
}

运行效果:
在这里插入图片描述

3、JDBC编程的六步

  • 注册驱动:告诉Java程序,即将要连接的是哪个品牌的数据库
  • 获取连接:表示JVM进程和数据库进程之间的通道打开,属于进程之间的通信
  • 获取数据库操作对象:即专门执行SQL语句的对象
  • 执行SQL语句:DQL、DML…
  • 处理查询结果集:只有上一步是SELECT查询语句的时候,才有这一步
  • 释放资源:资源使用完成后,关闭资源

IDEA配置JDBC驱动—方式一

MySQL驱动下载地址:http://dev.mysql.com/downloads/connector/j/
在这里插入图片描述

在这里插入图片描述
解压完成后,将驱动(jar包)复制到对应工程的lib目录下,右键Add as a library
在这里插入图片描述

IDEA配置JDBC驱动—方式二

在对应模块上右键,选择open Moudle Setting
在这里插入图片描述
选择Libraries后点击加号
在这里插入图片描述
选择对应的jar驱动包,点击OK
在这里插入图片描述
选择对应需要添加的模块后点击OK
在这里插入图片描述

代码实现:

import java.sql.*;

public class JdbcTest {
    public static void main(String[] args) {
        Connection conn = null;
        Statement statement = null;

        try {
            /**
             * 注册驱动
             */
            Driver driver = new com.mysql.cj.jdbc.Driver(); //多态,左边的是Driver接口java.sql.Driver,右边的是MySQL的实现类Driver
            DriverManager.registerDriver(driver);
            /**
             * 获取连接
             */
            String url = "jdbc:mysql://127.0.0.1:3306/testDB";
            String user = "root";
            String password = "code9527";
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接对象:" + conn);
            /**
             * 获取数据库操作对象
             */
            statement = conn.createStatement();
            /**
             * 执行SQL语句
             */
            String sql = "insert into dept(deptno,dname,loc) VALUES (001,'研发','天津')";
            int count = statement.executeUpdate(sql);
            System.out.println(count == 1 ? "保存成功" : "保存失败");
            /**
             * 处理查询结果集
             * 上面不是SELECT,暂时不管
             */

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            /**
             * 在finally中释放资源,确保被一定关闭
             * 从小到大依次关闭,分别try..catch
             */

            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

☀ 代码格式化调整快捷键Alt+Ctrl+L

  • 注意区分两个Driver:
java.sql.DriverJava提供的Driver接口

com.mysql.jdbc.DriverMySQL厂商写的MySQL驱动类,实现了上面的Driver接口
  • int executeUpdate(String sql)方法是用来执行INSERT、UPDATE、DELETE语句的,返回值是“影响数据库中记录的条数”,如上面程序中插入了一条数据,则返回1

运行结果:
在这里插入图片描述
在这里插入图片描述

4、通过类加载的方式注册驱动

分析com.mysql.jdbc.Driver的源代码,发现其在静态代码块中进行了注册驱动的操作:
static

而类加载的时候会执行静态代码块:(小复习)

在这里插入图片描述
所以可以通过调用forName方法让类加载进而来注册驱动,这时也不用接收返回值,因为我们要的仅仅是类加载这个动作:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcTest1 {
    public static void main(String[] args) {
        Connection conn= null;
        Statement statement = null;
        try{
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testDB","root","95279527");
            //获取数据库操作对象
            statement = conn.createStatement();
            //执行SQL语句
            String sql = "UPDATE dept SET dname='智能研发' WHERE deptno=1";
            int count = statement.executeUpdate(sql);
            System.out.println(count == 1 ? "更新成功" : "更新失败");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
        	//关闭资源
        }
    }
}

牢记:通过类加载注册驱动 Class.forName(“com.mysql.cj.jdbc.Driver”);

运行后:
run

5、属性配置文件与JDBC

将驱动信息与数据库连接信息全部写入properties配置文件:
在这里插入图片描述
实际开发中,不要把数据库的信息写死在Java程序中。引入配置文件后:
code

6、处理查询结果集

返回的结果集对象是如下的一个东西:
结果集

  • 光标(resourceSet.next())返回true,说明这一行有数据。调用getString()方法取出数据即可。

  • getString()方法:不管数据库中的数据类型是什么,都以String类型取出

  • getString方法可以传入列的下标(JDBC中下标从1开始),也可以传入列名,但后者更加健壮

  • getString方法传入列名的时候,传入的是查询结果集的列名。如下:此时,传入getString的应该是no,而不是deptno

Sting sql = "select deptno as no ,dname,loc from dept";
  • 和getString类比,想以int类型取出数据,则用getInt(),依此有getDouble()等。这样拿出来以后就可以直接做数学运算了
  • close的时候,根据关系,应该是先resultSet再statement,最后是conn

完整代码:

import java.sql.*;
import java.util.ResourceBundle;

public class JdbcTest3 {
    public static void main(String[] args) {
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        String driver = bundle.getString("driver");
        String url = bundle.getString("url");
        String user = bundle.getString("user");
        String password = bundle.getString("password");

        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);
            statement = conn.createStatement();
            String sql = "SELECT deptno as no,dname,loc FROM dept";
            /**
             * executeQuery方法是专门执行查询语句的(DQL),返回时ResultSet类型
             * executeUpdate是专门执行增删改语句的,返回时int
             */
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                int deptno = resultSet.getInt("no");
                String dname = resultSet.getString("dname");
                String loc = resultSet.getString("loc");
                System.out.println(deptno + " " + dname + " " + loc);
            }
        } catch (Exception 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(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:
run

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/146089.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!