6.10 - 6.11
今天开始开发PowerPersonal, 希望能够做成一款出色的个人管理软件,第二个目标是学习java的基础技术,从关系数据库到UI的点点滴滴。好吧,出发!
做的第一个模块是通讯录管理。超级简单,只有一个表Contact:
Contact
------------------------
CONTACT_ID: int
NAME: varchar(32)
RELATION: int
EMAIL: varchar(32)
CELLPHONE: varchar(32)
HOMEPHONE: varchar(32)
WORKPHONE: varchar(32)
QQNUM: varchar(32)
数据库使用一个轻量级的数据库derby,使用一个derby.jar就可以了。的确相当简单。
数据库连接跟jdbc兼容得很好,完全没有必要考虑太多,但是还是花了一个下午看了quickstart.
(1) 总结一下数据库连接的步骤:
(1)Class.forName(className)
( 2) conn = DriverManger.getConnection(connectionString)
( 3) statement = conn.createStatement()
注意这里:创建statement时,可以传入关于resultSet的参数,包括并发性(ReadOnly或者Updatable),Scroll_Sensitive等等
这些参数都很重要,下面用错误来说明。
(4) 创建表:statement.execute(CREATE_TABLE_SQL) 注意创建表之前可以用conn提供的getMetaData来检查数据表是否已经存在
( 5) 插入:PreparedStatement ps= conn.prepareStatement(...?...) 用?表示需要替代的参数,然后用ps.setString(index, string)来fill in.
ps.executeUpdate()
(6) 删除同上
(7)修改,可以使用如插入一样的方法,也可以直接在ResultSet中修改,然后update到数据库中。
代码很简单:
ResultSet rs = statement.executeQuery(SQL)
rs.updateString(index, string)
rs.updateRow()
但是需要注意两点:
(1)并发性要设置成UPDATABLE(在创建statement时设置)
(2)查询SQL中不能出现order by,否则会认为是readonly.
(8) 最后是数据库的shutdown。步骤是:
try {
DriverManager.getConnection("jdbc:derby:;shutdown=true");
} catch (SQLException se) {
if ( se.getSQLState().equals("XJ015") ) {
System.out.println("Database shut down normally");
}else{
System.out.println("Database did not shut down normally");
}
传递shutdown的消息,然后引擎就会关闭。
另外一个问题是:如何计算resultset的长度。
三种方法:
(1)用一个i++ (2)rs.last() / rs.getRow() 注意使用这种方法时需要ResultSet.Scroll这个参数(在创建statement时)
再另外一点就是HashMap的使用,其实用法就是相当简单的,就是一个key,value,两个都是Object类型。
不过要注意使用iterator时,注意一开始获得的iterator对象是指向null的,需要next()一下才能获得对象。iterator就是指针,明白这个就好办了。