Websharp 12 - 数据库操作

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(职员表),定义了职员编号、姓名、职务等信息,如图所示,下面将通过各种例子来操作这个表。

image

连接数据库

首先要按照正常的方式创建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对象使用。

package demo;

import java.io.*;
import java.sql.*;

import websharp.util.Database;

public class AccessDatabase extends Database
{

  public AccessDatabase(String accessFile) throws Exception
  {

    // Load JDBC driver
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

    java.net.URL url = websharp.util.loader.ResourceLoader.getResource(accessFile);
    String realFileName = "";
    if (url != null)
    {
      realFileName = java.net.URLDecoder.decode(url.getPath(), "UTF-8");
      realFileName = new File(realFileName).getCanonicalPath();
    }

    String dbUrl = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=" + realFileName;

    setConnection( DriverManager.getConnection(dbUrl, "", ""));

  }

 
}
l

有了上面的AccessDatabase类,我们就可以很容易就连接到数据库了:

public static void main(String[] args)
    {
        AccessDatabase database = null;
        try
        {
             database = new AccessDatabase("demo/demo.mdb");                      

        finally
        {
            database.closeAll();
        }

    }

 

 

关闭数据库有关对象

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();
list1.add("King");
rs=database.executeQuery(list1);

database.closeResultSets();

ArrayList list2=new ArrayList();
list2.add("Mike");
rs= database.executeQuery(list2);

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
     getObject

得到记录值,和ResultSet相应的方法类似。

示例代码,取employees表第3页(每页2条)的记录:

  int pageNo=3;
        int pageSize=2;
        DataSet dataSet=database.executeQueryDataSet("select * from employees", null,pageNo,pageSize);
        int recordCount=dataSet.getRecordCount();
        pageNo=dataSet.getPageNo();
        int pageCount=dataSet.getPageCount();
        int rowCount=dataSet.getRowCount();
        System.out.println(recordCount);
        while(dataSet.next())
        {
            String name=dataSet.getColName(1);
            String value=dataSet.getString(1);
            System.out.println(name+"="+value);
        }

 

 

更新数据

1)数据的添加、删除和修改,可以通过Database的executeUpdate方法来完成。其操作和JDBC的PreparedStatement类似。

例如下面代码实现修改职员编号为3的记录:


ArrayList list=new ArrayList();
list.add("New York");
list.add(new Integer(3));
database.executeUpdate("update employees set City=? where EmployeeID=? ", list);

另外,下面还有更简洁的方法插入和修改记录。

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
        {
            database.beginTrans();
            ....
            ....
            database.commitTrans();
        }
        catch(Exception e)
        {
            database.rollbakTrans();
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值