Jdbc--Dbutils工具

Dbutils工具:

Dbutils是对jdbc的一个简单封装,可以让我们在书写jdbc代码时,更加简单方便 。

元数据:

元数据MetaData : 指数据库中 库、表、列的定义信息

1、库元数据:

DataBaseMetaData代表的是数据库的元数据。

获取:con.getMetaData();返回一个DataBaseMetaData对象。

DataBaseMetaData对象的方法:

getURL():返回一个String类对象,代表数据库的URL。

getUserName():返回连接当前数据库管理系统的用户名。

getDriverName():返回驱动驱动程序的名称。

getPrimaryKeys(String catalog, String schema, String table):返回指定表主键的结果集

2、ParameterMetaData

我们使用PreparedStatement执行sql语句时,可以在sql语句中使用”?”占位符,

而ParameterMetaData它就是用于获取占位符相关信息。

可以通过PreparedStatement对象的getparameterMetaData()方法获取到parameterMetaData对象。

常用方法:

a)getParameterCount() 

i.获得指定参数的个数

b)getParameterTypeName(int param) 

i.获得指定参数的sql类型

注意:获取占位符的类型时,会产生异常需要在URL后面加上:generateSimpleParameterMetadata=true。

然而添加后异常没有了,但是参数类型却都是varchar类型,因为MySQL的数据库驱动对此方法的支持有问题。

3、ResultSetMetaData

它描述的是select语句执行后获取的结果集的相关信息

通过ResultSet接口的getMetaData()方法获取ResultSetMetaData对象。也可以通过PreparedStatement对象获取

常用方法:

a)getColumnCount() 

i.返回resultset对象的列数

b)getColumnName(int column) 

i.获得指定列的名称

c) getColumnTypeName(int column)

i.获得指定列的类型 

dbutils:

dbutils是对jdbc代码的封装.

导包:

commons-dbutils-1.4.jar。

核心:

1.QueryRunner类

在QueryRunner类中有三个方法

1)query方法  它是用于执行select语句

2)update方法  它是用于执行insert,update delete语句

3)batch方法  它是用于执行批处理

2.DbUtils类

它的方法全是static,它提供了关于事务及关闭资源的操作

3.ResultSetHandler接口

它的主要作用是对select语句执行后得到的结果集进行封装。

怎样封装结果集是需要我们自己手动完成。

但是ResultSetHandler提供了九个实现类,可以按照一定的规则对结果集进行封装。

QueryRunner:

构造方法:

QueryRunner();

QueryRunner(DataSource ds);

对于我们使用QueryRunner,用以上两个构造就可以。它们的区别:

如果是无参数的,那么在使用它的query,update,batch方法时,就需要有Connection参数的。我们需要进行手动的事务控制。

如果是有参数的QueryRunner,那么在使用它的query,update,batch方法时,就不需要使用有Connection参数的方法。事务是自动处理的。

操作sql的方法:

query(Connection conn, String sql, ResultSetHandler<T> rsh) Execute an SQL SELECT query without any replacement parameters.

query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) Execute an SQL SELECT query with replacement parameters.

以上配合无参构造使用。

query(String sql, ResultSetHandler<T> rsh) Executes the given SELECT SQL without any replacement parameters.

query(String sql, ResultSetHandler<T> rsh, Object... params)  Executes the given SELECT SQL query and returns a result object.

以上配置有参数QueryRunner构造使用

其它参数使用:

1.sql  代表要执行的sql语句

2.rsh  代表查询执行后得到的结果集怎样封装。

3.params 它代表的是sql语句中的占位符的值

返回值:

代表的是结果集封装的对象的类型

Update:

有Connection参数与无参数的QueryRunner构造使用

无Connection参数与有参数的QueryRunner构造使用

其它参数

1.sql  要执行的sql语句

2.params sql语句中的占位符的值

返回值

类型是int,它与executeUpdate方法返回值类似。

Batch:

有Connection参数与无参数的QueryRunner构造使用

无Connection参数与有参数的QueryRunner构造使用

其它参数

1.sql  要执行的sql语句

2.params,它是一个二维数组,就是我们要批处理的sql语句的参数

简单说,二维数组中的每一个一维数组的内容就是一条sql语句的参数。

ResultSetHandler:

在ResultSetHandler接口中的handle方法,它的参数就是我们执行sql语句后得到的结果集. 

public int update(Connection con, String sql, Object... params)

throws SQLException {

// 1.得到一个PreparedStatement对象

PreparedStatement pst = con.prepareStatement(sql);

// 2.对参数赋值

// 可以通过ParameterMetaData来获取sql语句中相关的参数信息

ParameterMetaData pmd = pst.getParameterMetaData();

// 2.1 得到参数有几个

int count = pmd.getParameterCount();

if (count == params.length) {

// 2.2对参数进行赋值

for (int i = 1; i <= count; i++) {

pst.setObject(i, params[i - 1]);

}

}

// 3.执行操作

return pst.executeUpdate();

}

2.query方法实现

public <T> T query(Connection con, String sql, MyResultSetHandler<T> mrs,

Object... params) throws Exception {

// 1.得到一个PreparedStatement对象

PreparedStatement pst = con.prepareStatement(sql);

// 2.对参数赋值

// 可以通过ParameterMetaData来获取sql语句中相关的参数信息

ParameterMetaData pmd = pst.getParameterMetaData();

// 2.1 得到参数有几个

int count = pmd.getParameterCount();

if (count == params.length) {

// 2.2对参数进行赋值

for (int i = 1; i <= count; i++) {

pst.setObject(i, params[i - 1]);

}

}

// 3.执行操作

ResultSet rs = pst.executeQuery();

return mrs.handle(rs); // 调用接口中的handle方法将结果集封装成指定的对象。

我们在使用query方法时,必须传递一个MyResultSetHandler接口实现类的对象

}

ResultSetHandler接口九个实现类:

ArrayHandler,它是将结果集中第一条记录封装到一个Object[]数组中。

ArrayListHandler,它是将结果集中每一条记录封装到Object[]数组中,在将这些数组封装到List集合中

BeanHandler, 它是将结果集中第一条记录封装到一个指定的javaBean中。

BeanListHandler, 它是将结果集中每一条记录封装到javaBean中,在将这些javaBean在封装到List集合中

ColumnListHandler,  将结果集中指定的列封装到List集合中。

KeyedHandler, 将结果集中每一条记录封装到Map<String,Object>,在将这些Map集合在封装到一个Map信,这个Map集合的key是我们指定的一个列的值,value就是Map<String,Object>;

MapHandler, 将结果集中第一条记录封装到了Map<String,Object> key就是字段名称,value是对应的字段值。

MapListHandler, 将结果集中每一条记录封装到了Map<String,Object> key就是字段名称,value是对应的字段值。在将Map封装到List集合.

猜你喜欢

转载自jackpot1234.iteye.com/blog/2330726