20145201《Java程序设计》第九周学习总结

本文总结了Java程序设计第九周的学习内容,包括JDBC的详细解释与使用方法,数据库连接与操作流程,以及Java类与Class实例的管理。同时提供了代码示例和关键信息的测试方法。

20145201 《Java程序设计》第九周学习总结

教材学习内容总结

JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性。

JDBC全名Java DataBase Connectivity,是联机数据库的标准规范。具体而言,它定义一组标准类与接口,应用程序需要联机数据库时调用这组标准API,而标准API中的接口会由数据库厂商操作,通常称为JDBC驱动程序,如图所示:
886975-20160501105918097-199756147.png

JDBC标准分为两个部分:JDBC应用程序开发者接口和JDBC驱动程序开发者接口。

JDBC驱动程序开发者接口是数据库厂商操作驱动程序时的规范,如图所示:
886975-20160501110422160-1508831922.png

厂商在操作JDBC驱动程序时,依操作方式可将驱动程序分为4种类型:

  • Type 1:JDBC-ODBC Bridge Driver

    ODBC是由Microsoft主导的数据库连接标准,基本上JDBC是参考ODBC制定而来,所以ODBC在Microsoft系统上最为成熟。

    Type 1驱动程序会将JDBC调用转换为对ODBC驱动程序的调用,由ODBC驱动程序操作数据库。

  • Type 2:Native API Driver

    这个类型的驱动程序会以原生方式,调用数据库提供的原生链接库

    由于使用了原生链接库,所以驱动程序本身与平台相依,没有达到JDBC驱动程序的目标之一:跨平台

    由于直接调用数据库原生API,因此在速度上,有机会成为4种类型中最快的驱动程序

  • Type 3:JDBC-Net Driver

    这类型的JDBC驱动程序会将JDBC方法调用转换为特定的网络协议调用。

    这种技术可以跨平台。

    由于通过中介服务器转换,速度较慢,获得架构弹性是使用这种类型驱动程序的目的。

  • Type 4:Native Protocal Driver

    驱动程序可以使用纯粹Java技术实现,因此这种类型驱动程序可以跨平台

    是最常见的驱动程序类型

  • 基本数据库操作相关的JDBC接口或类是位于java.sql包中,要取得数据库联机,必须有几个动作:

    1.注册Driver操作对象

    2.取得Connection操作对象

    3.关闭Connection操作对象

数据库操作相关的JDBC接口或类都位于java.sql包中。
取得联机等与数据库来源相关的行为规范在javax.sql.DataSource接口,实际如何取得Connection则由操作接口的对象来负责。
Connection是数据库连接的代表对象,接下来要执行SQL的话,必须取得java.sql.Statement对象,它是SQL描述的代表对象。可以使用Connection的createStatement()来建立Statement对象。

测试可否联机数据库并取得Connection实例:

package cc.openhome;

import static java.lang.System.out;
import java.sql.*;

public class ConnectionDemo {
    public static void main(String[] args)
                              throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String jdbcUrl = "jdbc:mysql://localhost:3306/demo";
        String user = "root";
        String passwd = "openhome";
        try(Connection conn = 
                DriverManager.getConnection(jdbcUrl, user, passwd)) {
            out.printf("已%s数据库联机%n", 
                    conn.isClosed() ? "关闭" : "开启");
        } 
    }
}
  • Java真正需要某个类时才会加载对应的.class文档,而非在程序启动就加载所有类。java.lang.Class的实例代表Java应用程序运行时加载的.class文档。可以通过Object的getClass()方法,或者通过.class常量取得每个对象对应的Class对象,如果是基本类型,也可以使用对应的打包类加上.TYPE取得Class对象。例如:Integer.TYPE可取得代表int的Class对象。

在取得Class对象后,就可以操作Class对象的公开方法取得基本信息。例如,以下可取得String类的Class实例,并从中获得String的基本信息:

package cc.openhome;

import static java.lang.System.out;

public class ClassInfo {
    public static void main(String[] args) {
        Class clz = String.class;
        out.println("类名称:" + clz.getName());
        out.println("是否为接口:" + clz.isInterface());
        out.println("是否为基本类型:" + clz.isPrimitive());
        out.println("是否为数组对象:" + clz.isArray());
        out.println("父类名称:" + clz.getSuperclass().getName());
    }
}

结果如图:
886975-20160501205345097-60074523.png

例,指定加载路径,测试Class实例是否为同一对象:

import static java.lang.System.out;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class ClassLoaderDemo {
    public static void main(String[] args) {
        try {
            String path = args[0];    // 测试路径
            String clzName = args[1]; // 测试类
            Class clz1 = loadClassFrom(path, clzName);
            out.println(clz1);
            Class clz2 = loadClassFrom(path, clzName);
            out.println(clz2);
            out.printf("clz1 与 clz2 为%s实例",
                    clz1 == clz2 ? "相同" : "不同");
        } catch (ArrayIndexOutOfBoundsException e) {
            out.println("沒有指定类加载路径与名称");
        } catch (MalformedURLException e) {
            out.println("加载路径错误");
        } catch (ClassNotFoundException e) {
            out.println("找不到指定的类");
        }
    }

    private static Class loadClassFrom(String path, String clzName)
            throws ClassNotFoundException, MalformedURLException {
        ClassLoader loader = new URLClassLoader(new URL[] {new URL(path)});
        return loader.loadClass(clzName);
    }
}

结果如图:
886975-20160501205929207-1888278187.png

本周代码托管截图

886975-20160501211132785-762601004.png

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标4500行30篇400小时
第一周200/2002/220/20
第二周300/5001/318/38
第三周400/9001/422/60
第四周1000/19001/535/95
第五周800/27001/630/125
第六周700/34002/830/155
第七周400/38002/1030/185
第八周294/40942/1030/185
第九周356/44502/1230/215

参考资料

转载于:https://www.cnblogs.com/20145201lzx/p/5447852.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值