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

    20145206 《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);
        }
    }
    

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

    泛型也可以仅定义在方法上,可在方法返回类型前使用定义泛型,之后就可以使用T来定义返回类型、参数类型,或在方法内声明变量、转换类型等。
    在定义泛型时,使用extends限制指定T实际类型时,必须是某类的子类。

    定义enum时有个特定值类本体语法,可用于操作接口或重新定义父类方法。

    定义enum时可以自行定义构造函数,条件是不得为公开构造函数,也不可以在构造函数中调用super()。

    本周代码托管截图

    其中一个的截图过程:

    其他(感悟、思考等,可选)

    本周在学习了16-18章的基础上,还完成了实验四,了解了在安卓平台上应用java程序,虽然过程很艰辛,但是也让我学到了很多东西;使用git托管代码也不再成为障碍,感觉书上很多知识掌握的不够好,在之后做项目时希望可以多多练习。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 100/100 1/2 10/15
    第二周 100/200 2/4 15/30
    第三周 300/500 1/5 30/60
    第四周 300/800 1/6 30/90
    第五周 347/1147 1/7 30/120
    第六周 352/1499 2/9 30/150
    第七周 258/1757 2/11 30/180
    第八周 350/2107 2/13 30/210
    第九周 550/2657 2/15 30/240

    参考资料

  • 相关阅读:
    nginx的安装及简单负载均衡配置
    memcached 的配置及 spymemcached 客户端简单使用
    我的github地址
    学习3ds max插件开发过程中的一些小结
    编译opengl编程指南第八版示例代码通过
    lua执行字节码的过程介绍
    lua解析赋值类型代码的过程
    lua解析脚本过程中的关键数据结构介绍
    lua解释执行脚本流程
    lua中的string类型
  • 原文地址:https://www.cnblogs.com/ZouJR/p/5440179.html
Copyright © 2011-2022 走看看