JDBC——MySQL

目录

JDBC概述

JDBC编程步骤演示

注册驱动 (旧方法)

java.sql类 DriverManager

注册驱动(新方法) 

获取连接 

通信协议

获取数据库操作

执行SQL

释放资源

处理查询结果集

获取查询结果 

 取数据操作


JDBC概述

1、JDBC是什么?
    Java DataBase Connectivity(Java语言连接数据库)

2、JDBC的本质是什么?
    JDBC是SUN公司制定的一套接口(interface)
        java.sql.*; (这个软件包下有很多接口。)

    接口都有调用者和实现者。
    面向接口调用、面向接口写实现类,这都属于面向接口编程。

    为什么要面向接口编程?
        解耦合:降低程序的耦合度,提高程序的扩展力。
        多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
            建议:
                Animal a = new Cat();
                Animal a = new Dog();
                // 喂养的方法
                public void feed(Animal a){ // 面向父类型编程。
                
                }
            不建议:
                Dog d = new Dog();
                Cat c = new Cat();
    
    思考:为什么SUN制定一套JDBC接口呢?
        因为每一个数据库的底层实现原理都不一样。
        Oracle数据库有自己的原理。
        MySQL数据库也有自己的原理。
        MS SqlServer数据库也有自己的原理。
        ....
        每一个数据库产品都有自己独特的实现原理。
    
    JDBC的本质到底是什么?
        一套接口。

3、JDBC开发前的准备工作,先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。

    classpath=.;D:\course\06-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar

    以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。
    IDEA有自己的配置方式。

4、JDBC编程六步(需要背会)********
    
    第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)

    第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道。)

    第三步:获取数据库操作对象(专门执行sql语句的对象)

    第四步:执行SQL语句(DQL DML....)

    第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)

    第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)

IDEA配置驱动:

第一步:新建project中新建的模块对其右键

 第二步:

 第三步:导入驱动


JDBC编程步骤演示

注册驱动 (旧方法)

java.sql
类 DriverManager

java.lang.Object
  java.sql.DriverManager
static voidregisterDriver(Driver driver)
          向 DriverManager 注册给定驱动程序。

java.sql
接口 Driver

public interface Driver

Diver不能被实例化

但mysql中有实现该接口的类Diver,此时需要通过 “包名.” 的方式使用。

代码实例:
 

        try {
            //注册驱动
            Driver driver = new com.mysql.cj.jdbc.Driver();
            DriverManager.registerDriver(driver);


        } catch (SQLException e) {
            e.printStackTrace();
        }

注册驱动(新方法) 

利用反射机制:获取当前Driver类中的静态代码块中的注册驱动的方法 

Class.forName("com.mysql.cj.jdbc.Driver");

这种方法常用,因为参数是一个字符串,字符串可以写到xxx.properties配置文件当中,以上方法不需要接受返回值。

源码:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

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

使用资源绑定器绑定属性配置文件

import java.util.ResourceBundle;

配置文件内容:(文件名jdbc)

driver =com.mysql.cj.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/books?serverTimezone=UTC
user = root
password = 638721

调用

        ResourceBundle resourceBundle = ResourceBundle.getBundle("jdbc");
        String driver = resourceBundle.getString("driver");
        String url = resourceBundle.getString("url");
        String user = resourceBundle.getString("user");
        String password = resourceBundle.getString("password");

获取连接 

java.sql
接口 Connection

public interface Connection

extends Wrapper

static ConnectiongetConnection(String url, String user, String password)
          试图建立到给定数据库 URL 的连接。

 代码实例:

            //获取连接
            String url = "jdbc:mysql://127.0.0.1:3306/b20041508?serverTimezone=UTC";

            String user = "root";
            String password = "638721";
            Connection connection = DriverManager.getConnection(url,user,password);
            System.out.println("数据库连接对象:" + connection);
            //数据库连接对象:com.mysql.cj.jdbc.ConnectionImpl@eb21112

  url:统一资源定位符(网络中某个资源的绝对路径)
                https://www.baidu.com/?tn=80035161_1_dg //这就是URL。
                URL包括哪几部分
                    协议
                    IP
                    资源名

            http://182.61.200.7:80/index.html
                http:// 通信协议
                182.61.200.7 服务器IP地址
                80  服务器上软件的端口
                index.html  服务器上的某个资源名 

对于上述代码的url: 

                jdbc:mysql:// 协议
                127.0.0.1 IP地址
                3306 mysql数据库端口号
                b20041508 具体的数据库实例名

                说明:localhost和127.0.0.1都是本机IP

通信协议

通信协议是通信之前就提前定好的数据传送格式。

数据包具体怎么传数据,格式提前定好的。

获取数据库操作

StatementcreateStatement()
          创建一个 Statement 对象来将 SQL 语句发送到数据库。
Statement statement = connection.createStatement();

执行SQL

intexecuteUpdate(String sql)
          执行给定 SQL 语句,该语句可能为 INSERTUPDATEDELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
            //执行SQL
            String sql = "insert into dept(deptno,dname,loc) values('50','人事部','郑州')";
            //执行DML语句(insert delete update)
            //返回值是“影响数据库中的记录条数”
            int count = statement.executeUpdate(sql);
            System.out.println(count == 1 ? "保存成功" : "保存失败");

返回值是“影响数据库中的记录条数”。

释放资源

为了保证资源一定释放,在finally语句块中关闭资源
并且要遵循从小到大依次关闭,分别对其try-catch
/*try……catch*/
finally {
            //释放资源
            //为了保证资源一定释放,在finally语句块中关闭资源
            //并且要遵循从小到大依次关闭,分别对其try-catch
            if(statement != null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

处理查询结果集

java.sql
接口 ResultSet

public interface ResultSet

extends Wrapper

Statement接口中的方法,专门执行DQL语句

ResultSetexecuteQuery(String sql)
          执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。

获取查询结果 

ResultSet resultset = null;
resultset = statement.executeQuery(sql);

 对于查询结果集ResultSet可调用next()方法

booleannext()
          将光标从当前位置向前移一行。

next()方法原理:

 取数据操作

getString取的是对应列(字段)的数据

 StringgetString(int columnIndex)
          以 Java 编程语言中 String 的形式获取此 ResultSet 对象的当前行中指定列的值。
 StringgetString(String columnLabel)
          以 Java 编程语言中 String 的形式获取此 ResultSet 对象的当前行中指定列的值。

JDBC中所有下标从1开始。 

            //处理查询结果
            while(resultset.next()){
                String readerno = resultset.getString(1);
                String readername = resultset.getString(2);
                String readertype = resultset.getString(3);
                String readerdept = resultset.getString(4   );
                System.out.println(readerno + "," + readername + "," + readertype + ","
                 + readerdept);
            }

这里标号表示对应列号,这样很简便但不灵活,可读性也差,getString后应传入该查询结果后的对应字段的字符串

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值