java主要通过JDBC来完成数据库操作。我们假设你已经熟悉了如何通过JDBC来连接数据库和对数据表进行操作。
Websharp中的数据库操作也是基于JDBC的,但它对JDBC进一步封装,例如提供了websharp.util.Database 和websharp.util.Dabaset两个类对数据库进行操作。
Database 类对java.sql.Connection 和java.sql.PreparedStatement进行了部分的封装,封装了常用的操作。
Dabaset 是一个数据集,它和ResultSet不同,ResultSet在生存周期里是连接到服务器的,而Dataset的数据是一次性把所有符合条件的数据都从服务器端取回来,存于客户端,然后就和服务器断开。对于大数据量用ResultSet,对于取小数据量或者分页数据,可以用Dataset。
本文通过class/demo/demo.mdb这个MS Access格式的数据库来演示Websharp对数据库的操作。demo.mdb包含了一张employees(职员表),定义了职员编号、姓名、职务等信息,如图所示,下面将通过各种例子来操作这个表。
连接数据库
首先要按照正常的方式创建Connection,然后新建一个Database 对象并把Connection对象传给Database ,有两种方式:
public Database(Connection conn) throws SQLException //直接从构造函数传递Connection
public setConnection(Connection conn) //调用此方法传递Connection
为了方便Access连接的创建,我们简单封装了一个AccessDatabase类,其继承于Database对象,在构造函数传递的是数据库文件的Classpath,并用到了JDBC和ODBC的桥接驱动来创建一个新的Connection,然后把此Connection给Database对象使用。
|
有了上面的AccessDatabase类,我们就可以很容易就连接到数据库了:
public static void main(String[] args) finally } |
关闭数据库有关对象
Database 对象包含如下方法,可以关闭数据库有关对象。下面这些方法都不会抛出异常。
方法 | 说明 |
closeResultSets | 关闭所有由Database 创建的ResultSet对象 |
closeStatements() | 关闭所有由Database 创建的PreparedStatement对象 |
close() | 关闭所有由Database 创建的ResultSet和PreparedStatement |
closeAll() | 关闭所有由Database 创建的ResultSet/PreparedStatement,同时也关闭Connection对象。一般需要在程序代码最下面加上finally异常处理块,并调用此方法,保证没有连接泄露。 |
查询数据
1)一般查询
ResultSet rs = database.executeQuery("select * from employees", null);
2)带参数的查询。参数列表用到了ArrayList,例如查找职员“King”的记录:
ArrayList list=new ArrayList();
list.add("King");
ResultSet rs = database.executeQuery("select * from employees where LastName=? ", list);
通过database创建的一个或多个ResultSet 可以一次性调用database.close()来关闭,不会抛异常。
3)PreparedStatement查询。下面代码段连续执行了两遍查询,分别查找King和Mike这两人的记录。此代码和代码2)区别是,此代码执行两次查询只创建了一个PreparedStatement,而代码2)中每一次查询都会在内部创建新的PreparedStatement。所以,涉及多次类似语句的查询,用代码3)的方式比较节约数据库资源。
database.prepareStatement("select * from employees where LastName=? "); ArrayList list1=new ArrayList(); database.closeResultSets(); ArrayList list2=new ArrayList(); database.close(); |
4)分页查询。按照每页记录数,当前是第几页的方式返回一页的记录数。可以结合DataSet对象来简单实现分页查询。Database包含方法:
public DataSet executeQueryDataSet(String sql, ArrayList list, int nPageNo, int nPageSize) throws SQLException
传递参数包括SQL语句,参数值列表,当前第几页,每页记录数,返回就是一个DataSet 对象了。
DataSet 对象的相关方法:
方法 | 说明 |
getRecordCount | 记录总数,指查询结果的总数,而不是返回的记录数 |
getRowCount | 返回的实际记录数,小于或等于每页记录数 |
getPageNo | 当前的页码。如果传递的页数超出最大页数,则返回最大页数。 |
getPageCount | 总页数 |
first next | 前后遍历记录集 |
getColName(int) | 通过列号得到列名。从1开始 |
getString | 得到记录值,和ResultSet相应的方法类似。 |
示例代码,取employees表第3页(每页2条)的记录:
int pageNo=3; |
更新数据
1)数据的添加、删除和修改,可以通过Database的executeUpdate方法来完成。其操作和JDBC的PreparedStatement类似。
例如下面代码实现修改职员编号为3的记录:
|
另外,下面还有更简洁的方法插入和修改记录。
2)完全插入记录。即插入所有字段的值,实现全插入功能的方法是:
public int insert(String strTableName, ArrayList list) throws Exception
参数是插入的表名,插入的值,例如要实现和语句 insert into table test values('A',1,'B') 同样的功能,可以用如下的代码:
ArrayList list=new ArrayList(); list.add("A"); list.add(new Integer(1)); list.add("B"); database.insert("test",list); |
3)部分插入记录。插入记录时候,只插入部分字段的值。
public int insert(String strTableName, FieldList list) throws Exception
第二个参数是FieldList 对象,FieldList 可以指定给哪些字段赋值。代码2)中因为是全插入,不用指定哪些字段。
例如要实现与 insert into table test(f1,f2,f3) values('A',1,'B')同样的功能,可以用下面的代码:
FieldList list=new FieldList();
list.add("f1","A");
list.add("f2",1);
list.add("f3","B");
database.insert("test",list);
4)修改记录。
public int update(String strTableName, FieldList list, String where) throws Exception
public int update(String strTableName, FieldList list, String keyField, Object keyValue) throws Exception
参数:修改的表名,修改的字段与字段值,修改条件
SQL语句:update test set f1='A', f2=1 where id=3 ,
实现代码:
FieldList list=new FieldList();
list.add("f1","A");
list.add("f2",1);
database.update("test",list,"id=3"); //方法一
database.update("test",list,"id",new Integer(3)); //方法二
5)删除记录。
public int delete(String strTableName, String keyName, Object keyValue) throws Exception
例如删除id=3的记录则 database.delete("test","id",new Integer(3));
事务处理
代码格式如下所示,beginTrans()和commitTrans()有可能抛出异常,出现异常的时候要执行rollbackTrans()回滚操作。rollbackTrans()不会抛出异常。
try |