20145223《Java程序设计》第9周学习总结
教材学习内容总结
第十六章:整合数据库
JDBC入门
1、JDBC简介:
2.JDBC主要分成两个部分,JDBC应用程序开发者接口和JDBC驱动程序开发者接口
3.应用程序使用JDBC联机数据库的通用语法:
Connection conn = DriverManager.getConnection(……);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM T_USER");
取得Connection:
try {
String url = "jdbc:mysql://localhost:3306/demo?" +"user=root&password=123";
Connection conn = DriverManager.getConnection(url);
...
}
catch(SQLException e) {
....
}
String url = "jdbc:mysql://localhost:3306/demo";
String user = "root";
String password = "123";
Connection conn = DriverManager.getConnection(url,user, password);
4.JDBC数据库驱动程序依实作方式可以分为四个类型
Type 1:JDBC-ODBC Bridge
Type 2:Native-API Bridge
Type 3:JDBC-middleware
Type 4:Pure Java Driver
5.取得Connection的方式,依所使用的环境及程序需求而有所不同
设计一个DBSource界面
package onlyfun.caterpillar;
import java.sql.Connection;
import java.sql.SQLException;
public interface DBSource {
public Connection getConnection() throws SQLException;
public void closeConnection(Connection conn) throws SQLException;
}
public class SimpleDBSourceimplementsDBSource {
…
public SimpleDBSource(String configFile) throws IOException,
ClassNotFoundException {
props = new Properties();
props.load(new FileInputStream(configFile));
url = props.getProperty("onlyfun.caterpillar.url");
user = props.getProperty("onlyfun.caterpillar.user");
passwd = props.getProperty("onlyfun.caterpillar.password");
Class.forName(
props.getProperty("onlyfun.caterpillar.driver"));
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, passwd);
}
public void closeConnection(Connection conn) throws SQLException {
c onn.close();
}
}
onlyfun.caterpillar.driver=com.mysql.jdbc.Driver
onlyfun.caterpillar.url=jdbc:mysql://localhost:3306/demo
onlyfun.caterpillar.user=root
onlyfun.caterpillar.password=123456
DBSource dbsource = new SimpleDBSource();
Connection conn = dbsource.getConnection();
if(!conn.isClosed()) {
System.out.println("数据库连接已开启…");
}
dbsource.closeConnection(conn);
if(conn.isClosed()) {
System.out.println("数据库连接已关闭…");
}
6.Statement、ResultSet(1)
要执行SQL的话,必须取得java.sql.Statement物件,它是Java当中一个SQL叙述的具体代表对象
Statement stmt = conn.createStatement();
插入一笔数据,可以如下使用Statement的executeUpdate()方法
stmt.executeUpdate("INSERT INTO t_message VALUES(1, 'justin', " +
"'justin@mail.com', 'mesage...')");
7.Statement、ResultSet(2)
·executeUpdate()会传回int结果,表示资料变动的笔数
·executeQuery()方法则是用于SELECT等查询数据库的SQL
·executeQuery()会传回java.sql.ResultSet对象,代表查询的结果
·可以使用ResultSet的next()来移动至下一笔数据,它会传回true或false表示是否有下一笔资料
·使用getXXX()来取得资料
8.Statement、ResultSet(3)
·Statement的execute()可以用来执行SQL,并可以测试所执行的SQL是执行查询或是更新
·传回true的话表示SQL执行将传回ResultSet表示查询结果,此时可以使用getResultSet()取得ResultSet物件
·如果execute()传回false,表示SQL执行会传回更新笔数或没有结果,此时可以使用getUpdateCount()取得更新笔数
·如果事先无法得知是进行查询或是更新,就可以使用execute()
9.preparedStatement()
·preparedStatement()方法建立好一个预先编译(precompile)的SQL语句
·当中参数会变动的部份,先指定"?"这个占位字符
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO t_message VALUES(?, ?, ?, ?)");
需要真正指定参数执行时,再使用相对应的setInt()、setString()等方法,指定"?"处真正应该有的参数
stmt.setInt(1, 2);
stmt.setString(2, "momor");
stmt.setString(3, "momor@mail.com");
stmt.setString(4, "message2...");
10.ResultSet还提供了对结果集进行滚动的方法:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
反射与类加载器
1.java.lang.Class的实例代表Java应用程序运行时加载的.class文档,类、接口、Enum等编译过后,都会生成.class文档。Class类没有公开构造函数,实例时候JVM自动产生,每个.class文档加载时,JVM会自动生成对应的Class对象。
2.取得Class对象的方式:
(1)通过Object的getClass方法
(2)通过.class常量取得每个对象对应的Class对象
(3)如果是基本类型,可以使用对应的打包类加上.TYPE取得Class对象
3.类信息是在编译时期存储在.class文档,这是java支持执行运行时类型识别的方式。编译时期若使用到相关类,编译程序会检查对应的.class文档中记载的信息,以确定是否可完成编译。执行时期使用某类是,会先检查是否有对应的Class对象,如果没有,会加载对应的.class文档并生成对应的Class实例。
4.默认使用getClass()或.class取得的Class实例会是同一个对象。
5.类连接:指的是把类的二进制数据合并到JRE中,这又分为3个阶段:
·校验:检查载入Class文件数据的正确性。
·准备:给类的静态变量分配存储空间,并进行默认初始化。
·解析:将类的二进制数据中的符号引用替换成直接引用。
6.JVM运行时会产生3个ClassLoader,分别为:BootstrapClassLoader(根类加载器)、ExtClassLoader(扩展类加载器)和AppClassLoader(系统类加载器)。
7.类加载器之间的父子关系和管辖范围:
第十八章 自定义泛型、枚举与注释
·泛型使得编译器能够在编译期间对集合中加入的对象进行检查,如果加入了不同类型的对象,就会报错,而不必等到运行期间再进行相关的类型转换。和原来没有使用泛型相比,它将原来需要在运行时期才能发现的异常提前到了编译期间,使得程序的安全性也大大提高,泛型一般用于集合类中。
·泛型也可以仅定义在方法上,可在方法返回类型前使用定义泛型,之后就可以使用T来定义返回类型、参数类型,或在方法内声明变量、转换类型等,在定义泛型时,使用extends限制指定T实际类型时,必须是某类的子类。
·枚举:枚举也是JDK1.5之后的版本以后Java新加入的特性。使用枚举可以表示一组常量数据。枚举的本质是一个类,可以使用enum关键字来声明一个枚举类型。
·使用枚举需要注意的是:
1、枚举类型可以定义在类的内部也可以定义在类的外部。如果定义在类的内部,那么其访问控制符可以是public,protected,private或者默认的控制符。如果定义在类的外部,其访·问控制符只能是public和默认控制符;
2、枚举类型中定义的value值都默认为public static final的。其值一经定义就不能在被修改了。多个value值之间需要用逗号隔开;
3、枚举类型中除了可以声明常量之外还可以声明方法。但是方法需要在常量之后,并且常量和方法之间要用分号区分;
4、枚举类型中的值可以通过枚举类型名直接对他们进行访问;
5、枚举类型不能声明为abstract或者final类型;
·枚举类型的常用方法
public final String name()//返回枚举常量的名称;
public final int ordinal()//返回枚举常量在枚举类型中的位置,第一个枚举值序号为0,依次类推;
public String toString()//返回枚举常量的名字,可以重写此方法;
public static valueOf(enumType,String name)//返回与name名字相对应的枚举常量;
·JDK8标注增强功能
1.ElementType的枚举成员是用来限定哪个声明位置可以进行标注。在JDK8中,增加了两个枚举成员TYPE _PARAMETER、TYPE _USE。
2.ElementType.TYPE _ USE可用于标注在各式类型,一个标注如果被设定为ElementType.TYPE_USE,只要是类型名称,都可以进行标注。
3.@Repeatable 可以让你在同一个位置重复相同标注
4.@Filters 作为收集重复标注信息的容器,而每个@Filters储存各自指定的字符串值。
·
学习总结
不知不觉java的学习已经到了第九周,书上的内容基本上已经自学完了,但是我觉得后期的学期与实际操作并没有很好结合在一起。在接下来的学习中,希望可以在老师布置的项目课程里好好地利用这些知识并且能够更加熟练地运用java这一门技能。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 20篇 | 400小时 | |
第一周 | 200/200 | 1/1 | 15/12 | |
第二周 | 180/380 | 1/1 | 18/12 | |
第三周 | 600/980 | 1/1 | 17/16 | |
第四周 | 400/380 | 1/1 | 16/15 | |
第五周 | 300/680 | 1/1 | 14/14 | |
第六周 | 200/200 | 2/2 | 10/10 | |
第七周 | 100/100 | 2/2 | 10/10 | |
第八周 | 50/50 | 1/2 | 5/5 | |
第九周 | 70/70 | 1/1 | 8/8 |