利用JDBC对数据库的增删查改
在本节中,我们将通过一个示例说明如何利用JDBC对数据库进行增删查改等各种操作,以及怎样对结果集中的数据进行处理。
我们假设现在数据库中有一张表tbl_user用来存放用户信息。为了简便起见,我们只设了3个字段:用户名vcUsername、密码vcPassword和注册日期dtRegDate。
新用户注册时要将客户的相关信息存入数据库;用户登录时要进行密码验证;用户注销时要将其信息删除;用户修改自己的信息时要对数据库中的数据进行修改。
在这个示例中我们将调用示例13-1获取数据库连接。另外,我们还编写了一个User类用来操作用户信息,如示例13-2所示。
【程序源代码】
示例13-3的UserMgr类中封装了对数据库中的用户信息进行增删查改等操作的方法。
【程序源代码】
【程序注解】
要对数据库进行操作,首先必须建立一个数据库连接。关于这个问题,我们已经在13.3节中进行了详细讨论。因此,本例中直接调用示例13-1中的getConnection()方法(第20行)。当然,在此之前,必须将DBConnection类import进来(第6行)。然后我们就可以利用已经获取的数据库连接创建一个Statement对象stmt,并调用Statement类提供的方法执行SQL语句,如executeUpdate(String sql)、executeQuery(String sql)等。
如果是添加、删除或修改用户信息,那么执行了executeUpdate(String sql)方法之后即完成了相应操作。但如果是查询用户信息,则还需对结果集进行处理。例如,在getUser(String username)方法(第64行)中,我们根据用户名查询到了相应用户的信息并存入了一个结果集中。然后从第78行到第87行对结果集中的数据进行处理,并关闭Statement和Connection对象。
首先判断rs.next()是否为真,即是否从数据库中取到了数据。如果为真,则创建一个User类的实例,并调用其set方法将结果集中的数据置入user对象中。值得注意的是,我们在添加用户的时候,注册时间是用getDate()方法自动获取的,这个时间会精确到毫秒级,而我们在获取用户注册时间时往往只要知道用户是在哪一天注册的就可以了,因此我们使用了结果集的getDate()方法获取注册时间(第84行)。这个方法将返回一个Date型值,但User类的setRegDate()方法要求传递一个字符串参数,所以我们要调用Date类的toString()方法将此时间转化为一个字符串。如果你的确想要获得用户的精确注册时间,也可以直接调用结果集的getString()方法。总之,在完成了对user对象的属性设置之后,我们便可以将这个对象作为getUser()方法的返回值,以供该方法的调用者使用。
还有一点需要说明的是,我们这里假设数据库里的用户名是惟一的。如果数据库中存在重名的用户,我们可以定义一个Vector对象,在从结果集中获取了每一个用户的信息之后即将该user对象加入vector中,然后将vector作为getUser()方法的返回值。(T111)
本文选自飞思图书《精通Java核心技术》
我们假设现在数据库中有一张表tbl_user用来存放用户信息。为了简便起见,我们只设了3个字段:用户名vcUsername、密码vcPassword和注册日期dtRegDate。
新用户注册时要将客户的相关信息存入数据库;用户登录时要进行密码验证;用户注销时要将其信息删除;用户修改自己的信息时要对数据库中的数据进行修改。
在这个示例中我们将调用示例13-1获取数据库连接。另外,我们还编写了一个User类用来操作用户信息,如示例13-2所示。
【程序源代码】
|
示例13-3的UserMgr类中封装了对数据库中的用户信息进行增删查改等操作的方法。
【程序源代码】
|
【程序注解】
要对数据库进行操作,首先必须建立一个数据库连接。关于这个问题,我们已经在13.3节中进行了详细讨论。因此,本例中直接调用示例13-1中的getConnection()方法(第20行)。当然,在此之前,必须将DBConnection类import进来(第6行)。然后我们就可以利用已经获取的数据库连接创建一个Statement对象stmt,并调用Statement类提供的方法执行SQL语句,如executeUpdate(String sql)、executeQuery(String sql)等。
如果是添加、删除或修改用户信息,那么执行了executeUpdate(String sql)方法之后即完成了相应操作。但如果是查询用户信息,则还需对结果集进行处理。例如,在getUser(String username)方法(第64行)中,我们根据用户名查询到了相应用户的信息并存入了一个结果集中。然后从第78行到第87行对结果集中的数据进行处理,并关闭Statement和Connection对象。
首先判断rs.next()是否为真,即是否从数据库中取到了数据。如果为真,则创建一个User类的实例,并调用其set方法将结果集中的数据置入user对象中。值得注意的是,我们在添加用户的时候,注册时间是用getDate()方法自动获取的,这个时间会精确到毫秒级,而我们在获取用户注册时间时往往只要知道用户是在哪一天注册的就可以了,因此我们使用了结果集的getDate()方法获取注册时间(第84行)。这个方法将返回一个Date型值,但User类的setRegDate()方法要求传递一个字符串参数,所以我们要调用Date类的toString()方法将此时间转化为一个字符串。如果你的确想要获得用户的精确注册时间,也可以直接调用结果集的getString()方法。总之,在完成了对user对象的属性设置之后,我们便可以将这个对象作为getUser()方法的返回值,以供该方法的调用者使用。
还有一点需要说明的是,我们这里假设数据库里的用户名是惟一的。如果数据库中存在重名的用户,我们可以定义一个Vector对象,在从结果集中获取了每一个用户的信息之后即将该user对象加入vector中,然后将vector作为getUser()方法的返回值。(T111)
本文选自飞思图书《精通Java核心技术》