zoukankan      html  css  js  c++  java
  • 20145207《Java程序设计》第9周学习总结

    教材学习内容总结

    第十六章 整合数据库

    JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性。 厂商在操作JDBC驱动程序时,依方式可将驱动程序分为4种类型:

    ·Type 1:JDBC-ODBC Bridge Driver
    ·Type 2:Native API Driver
    ·Type 3:JDbc-Net Driver
    ·Type 4:Native Protocol Driver

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

    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() ? "关闭" : "开启");
            } 
        }
    }

    在使用Connection、Statement或ResultSet时,要将之关闭以释放相关资源。

    如果有些操作只是SQL语句当中某些参数会有所不同,其余的SQL子句皆相同,则可以使用java.sql.PreparedStatement.可以使用Connection的preparedStatement()方法建立好一个预先编译的SQL语句,当中参数会变动的部分,先指定“?”这个占位字符。等到需要真正指定参数执行时,再使用相对应的setInt()、setString()等方法,指定“?”处真正应该有的参数。

    第十七章 反射与类加载器

    Java真正需要某个类时才会加载对应的.class文档,而非在程序启动就加载所有类。java.lang.Class的实例代表Java应用程序运行时加载的.class文档。可以通过Object的getClass()方法,或者通过.class常量取得每个对象对应的Class对象,如果是基本类型,也可以使用对应的打包类加上.TYPE取得Class对象。例如:Integer.TYPE可取得代表int的Class对象。

    如果事先不知道类名称,可以利用Class.forName()动态加载.class文档,取得Class对象之后,利用其newInstance()方法建立类实例。java.lang.reflect.Method实例是方法的代表对象,可以使用invoke()方法来动态调用指定的方法。

    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());
        }
    } 

    由同一类加载器载入的.class文档,只会有一个Class实例。如果同一.class文档由两个不同的类加载器载入,则会有两份不同的Class实例。

    package cc.openhome;
     
    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);
        }
    }

     

    第十八章 自定义泛型、枚举与注释

    注释

    • 注释类型

    在原始码中使用注释,对编译程序提供额外编译提示,或提供应用程序执行时期可读取的组态信息。注释可以仅用于原始码,编译后留在.class文档仅供编译程序读取或开放执行时期读取。

    • 常用标准注释

    @Override //就是标准注释,被注释的方法必须是父类或接口中已定义的方法,请编译程序协助是否真的为重新定义方法。 @Deprecated //如果某个方法原先存在与API中,后来不建议再使用,可以在该方法上注释。若有用户后续想调用或重新定义这个方法,编译程序会提出警告。对于支持泛型的API,建议明确指定泛型真正类型,如果没有指定,编译程序会提出警告。 @SuppressWarnings //指定抑制unchecked的警告产生: @SuppressWarnings(value={"unchecked"}) @SafeVarargs //表明开发人员确定避免了heap pollution问题。heap pollution问题就是编译程序无法检查执行时期的类型错误,无法具体确认自变量类型。 @FunctionalInterface //让编译程序可协助检查interface是否可做为lambda的目标类型 自定义注释类型 ·标示注释:就是注释名称本身就是信息,对编译程序或应用程序来说,主要是检查是否有注释出现,并作出对应的动作。

    • 相关规则:

    (1)如果注释名称本身无法提供足够信息,设置单值注释

    (2)注释属性也可以用数组形式指定。

    (3)在定义注释属性时,如果属性名称为value,则可以省略属性名称,直接指定值。

    (4)对成员设定默认值,使用default关键字即可。

    (5)要设定数组默认值,可以在default之后加上{},必要时{}中可放置元素值。

    定义注释时,可使用java.lang.annotation.Target限定时可指定java.lang.annotation.ElementType的枚举值。 在制作JavaDoc文件时,默认不会将注释数据加入文件中,如果想要将注释数据加入文件,可以使用java.lang.annotation.Documented。 默认父类设定的注释,不会被继承至子类,在定义注释时,设定java.lang.annotation.Inherited注释,就可以让注释被子类继承。

    交易简介

    • 隔离行为的支持上,JDBC可以通过Connection的getTransactionIsolation()取得数据库目前的隔离行为设定,通过setTransactionIsolation()可提示数据库设定指定的隔离行为,可设定常数是定义在Connection上
    • 对交易不设定隔离行为TRANSACTION_NONE
  • 相关阅读:
    c语言--第零次作业
    Beta 冲刺(3/7)
    Beta 冲刺(2/7)
    福大软工 · 第十次作业
    Beta 冲刺(1/7)
    BETA 版冲刺前准备(团队)
    Alpha 事后诸葛亮(团队)
    Alpha冲刺(10/10)
    Alpha 冲刺 (9/10)
    Alpha 冲刺 (8/10)
  • 原文地址:https://www.cnblogs.com/20145207lza/p/6746539.html
Copyright © 2011-2022 走看看