20145207《Java程序设计》第9周学习总结
教材学习内容总结
第十六章 整合数据库
JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性。 厂商在操作JDBC驱动程序时,依方式可将驱动程序分为4种类型:
·Type
1:JDBC-ODBCBridge Driver
·Type
2:NativeAPI Driver
·Type
3:JDbc-NetDriver
·Type
4:NativeProtocol Driver
取得联机等与数据库来源相关的行为规范在javax.sql.DataSource接口,实际如何取得Connection则由操作接口的对象来负责。 Connection是数据库连接的代表对象,接下来要执行SQL的话,必须取得java.sql.Statement对象,它是SQL描述的代表对象。可以使用Connection的createStatement()来建立Statement对象。
package cc.openhome;
importstatic
java.lang.System.out;
import java.sql.*;
publicclass
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
staticjava.lang.System.
out;
publicclass
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;
publicclass 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(
ArrayIndexOutOfBoundsExceptione) {
out.
println(
"沒有指定類別載入路徑與名稱");
}
catch(
MalformedURLExceptione) {
out.
println(
"載入路徑錯誤");
}
catch(
ClassNotFoundExceptione) {
out.
println(
"找不到指定的類別");
}
}
private
static
Class
loadClassFrom(
Stringpath,
StringclzName)
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