Java中对数据库 *** 作实例

Java中对数据库 *** 作实例,第1张

可以以普通的jdbc连接的使用习惯来使用连接池。 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前所有的应用服务器取数据库连接的方式都是这种方式实现的。但是另外一个共同的问题是,它们同时不允许使用者显式的调用Connection.close()方法,而需要用其规定的一个方法来关闭连接。这种做法有两个缺点:第一:改变了用户使用习惯,增加了用户的使用难度。首先我们来看看一个正常的数据库 *** 作过程:int executeSQL(String sql) throws SQLExceptionfinallycatch(Exception e)catch(Exception e)return res}使用者在用完数据库连接后通常是直接调用连接的方法close来释放数据库资源,如果用我们前面提到的连接池的实现方法,那语句conn.close()将被某些特定的语句所替代。第二:使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用户直接调用连接的close方法,一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接,那么连接池将无法正常维护所有连接的状态,考虑连接池和应用由不同开发人员实现时这种问题更容易出现。综合上面提到的两个问题,我们来讨论一下如何解决这两个要命的问题。首先我们先设身处地的考虑一下用户是想怎么样来使用这个数据库连接池的。用户可以通过特定的方法来获取数据库的连接,同时这个连接的类型应该是标准的java.sql.Connection。用户在获取到这个数据库连接后可以对这个连接进行任意的 *** 作,包括关闭连接等。通过对用户使用的描述,怎样可以接管Connection.close方法就成了我们这篇文章的主题。为了接管数据库连接的close方法,我们应该有一种类似于钩子的机制。例如在Windows编程中我们可以利用Hook API来实现对某个Windows API的接管。在JAVA中同样也有这样一个机制。JAVA提供了一个Proxy类和一个InvocationHandler,这两个类都在java.lang.reflect包中。我们先来看看SUN公司提供的文档是怎么描述这两个类的。public interface InvocationHandlerInvocationHandler is the interface implemented by the invocation handler of a proxy instance. Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of its invocation handler.SUN的API文档中关于Proxy的描述很多,这里就不罗列出来。通过文档对接口InvocationHandler的描述我们可以看到当调用一个Proxy实例的方法时会触发Invocationhanlder的invoke方法。从JAVA的文档中我们也同时了解到这种动态代理机制只能接管接口的方法,而对一般的类无效,考虑到java.sql.Connection本身也是一个接口由此就找到了解决如何接管close方法的出路。首先,我们先定义一个数据库连接池参数的类,定义了数据库的JDBC驱动程序类名,连接的URL以及用户名口令等等一些信息,该类是用于初始化连接池的参数,具体定义如下:public class ConnectionParam implements Serializable /** * 从连接池工厂中获取指定名称对应的连接池

ConnectionManager.java

import java.sql.*

public class ConnectionManager {

private static final String DRIVER_CLASS="com.microsoft.sqlserver.jdbc.SQLServerDriver"

private static final String DATABASE_URL="jdbc:sqlserver://localhost:1433DatabaseName=student"

private static final String DATABASE_USER="xz"

private static final String DATABASE_PASSWORD="test"

private ConnectionManager()

{}

/**

* 返回连接

* @return Connection

* @throws DBAccessException

*/

public static Connection getConnection()

{

Connection dbConnection=null

try {

Class.forName(DRIVER_CLASS)

dbConnection=DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD)

} catch (ClassNotFoundException e1) {

// TODO Auto-generated catch block

e1.printStackTrace()

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

return dbConnection

}

/**

* 关闭连接

* @param conn

* Connection

*/

public static void closeConnection(Connection conn)

{

try{

if(conn!=null &&!conn.isClosed())

{

conn.close()

conn=null

}

}catch(Exception ex)

{

System.out.println(ex.getMessage())

}

}

/**

* 关闭结果集

* @param rs

* ResultSet

*/

public static void closeResultSet(ResultSet rs)

{

try{

if(rs!=null)

{

rs.close()

rs=null

}

}catch(Exception ex)

{

System.out.println(ex.getMessage())

}

}

/**

* 关闭SQL预处理语句

* @param pstmt

* PreparedStatement

*/

public static void closePreparedStatement(PreparedStatement pstmt)

{

try{

if(pstmt!=null)

{

pstmt.close()

pstmt=null

}

}catch(Exception ex)

{

System.out.println(ex.getMessage())

}

}

/**

* 关闭SQL语句

* @param stmt

* Statement

*/

public static void closeStatement(Statement stmt)

{

try{

if(stmt!=null)

{

stmt.close()

stmt=null

}

}catch(Exception ex)

{

System.out.println(ex.getMessage())

}

}

public static void main(String[]args)

{

try {

Connection con=ConnectionManager.getConnection()

if(!con.isClosed())

System.out.println("数据库连接成功。。。。。")

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

}

}

User.javapublic class User {

private String username

private String userpass

public String getUsername() {

return username

}

public void setUsername(String username) {

this.username = username

}

public String getUserpass() {

return userpass

}

public void setUserpass(String userpass) {

this.userpass = userpass

}

}

UserDAO.javaimport java.util.*

import java.sql.*

public class UserDAO {

public List<User>getAllUser()

{

Connection conn=null

PreparedStatement pstmt=null

ResultSet rs=null

List<User>userList=new ArrayList<User>()

String sql="select UserName,UserPas from Users"

try {

conn=ConnectionManager.getConnection()

pstmt=conn.prepareStatement(sql)

rs=pstmt.executeQuery()

while(rs.next())

{

User u=new User()

u.setUsername(rs.getString("UserName"))

u.setUserpass(rs.getString("UserPas"))

userList.add(u)

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}finally

{

ConnectionManager.closeConnection(conn)

ConnectionManager.closePreparedStatement(pstmt)

ConnectionManager.closeResultSet(rs)

}

return userList

}

}

1、加载驱动程序。

2、创建连接对象。

3、创建sql语句执行对象 。

4、执行sql语句。

5、对执行结果进行处理。

6、关闭相关的连接对象即可(顺序跟声明的顺序相反)。

处理结果两种情况:

1、执行更新返回的是本次 *** 作影响到的记录数。

2、执行查询返回的结果是一个ResultSet对象。

ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些 行中数据的访问。

扩展资料:

Statement

要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:

1、执行静态SQL语句。通常通过Statement实例实现。

2、执行动态SQL语句。通常通过PreparedStatement实例实现。

3、执行数据库存储过程。通常通过CallableStatement实例实现。

参考资料:百度百科JAVA


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6780287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存