元数据 --- 如何编写JDBC框架--DBUTILS框架

来源:互联网 发布:庆应大学留学费用 知乎 编辑:程序博客网 时间:2024/05/19 19:40

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


DataBaseMetaData 对象

用Connection对象的getMetaData()方法来获取DataBaseMetaData对象。

方法:

getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。


ParameterMetaData 对象

PreparedStatement.getParameterMetaData() 来获取对象

方法:

getParameterCount() :获得指定参数的个数
getParameterType(int param) :获得指定参数的sql类型(驱动可能不支持)


ResultSetMetaData  对象

ResultSet. getMetaData() 来获取对象

方法:

getColumnCount() :返回resultset对象的列数
getColumnName(int column) :获得指定列的名称
getColumnTypeName(int column):获得指定列的类型 java.sql.Types


例:

package com.itheima.utils;import java.sql.Connection;import java.sql.ParameterMetaData;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.util.List;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JdbcUtils {private static ComboPooledDataSource ds;static {ds = new ComboPooledDataSource("mysql");}public static Connection getConnection() throws SQLException {return ds.getConnection();}public static void release(ResultSet rs, Statement stmt, Connection conn) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}rs = null;}if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}stmt = null;}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}conn = null;}}public static void update(String sql, Object[] params) {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();stmt = conn.prepareStatement(sql);ParameterMetaData pmd = stmt.getParameterMetaData();int count = pmd.getParameterCount();if (params.length == count) {for (int x = 0; x < count; x++) {stmt.setObject(x + 1, params[x]);}stmt.executeUpdate();} else {throw new RuntimeException("参数不正确!");}} catch (SQLException e) {throw new RuntimeException("执行失败");} finally {release(rs, stmt, conn);}}public static List selectToBean(String sql, Object[] params,ResultSetHandler rsh) {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();stmt = conn.prepareStatement(sql);rs = stmt.executeQuery();return (List) rsh.handler(rs);} catch (SQLException e) {throw new RuntimeException(e);}}}

package com.itheima.utils;import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;public interface ResultSetHandler {public Object handler(ResultSet rs);}class myHandler implements ResultSetHandler {private Class clazz;public myHandler(Class clazz) {this.clazz = clazz;}@Overridepublic Object handler(ResultSet rs) {List list = new ArrayList();try {while (rs.next()) {try {Object bean = clazz.newInstance();ResultSetMetaData rsmd = rs.getMetaData();int count = rsmd.getColumnCount();for (int x = 0; x < count; x++) {String columnName = rsmd.getColumnName(x + 1);Object columnValue = rs.getObject(columnName);try {PropertyDescriptor pd = new PropertyDescriptor(columnName, bean.getClass());Method method = pd.getWriteMethod();method.invoke(bean, columnValue);} catch (Exception e) {continue;}}list.add(bean);} catch (Exception e) {e.printStackTrace();}}return list;} catch (SQLException e) {throw new RuntimeException(e);}}}

DBUtils框架

Apatch提供DBUtils开源JDBC工具类库

API介绍

org.apache.commons.dbutils.QueryRunner :DBAssist
org.apache.commons.dbutils.ResultSetHandler


工具类:

org.apache.commons.dbutils.DbUtils

提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。

方法:

public static void close(…)throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
public static voidcloseQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
public static voidcommitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
public static booleanloadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。


QueryRunner类

该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
默认的构造方法
需要一个 javax.sql.DataSource 来作参数的构造方法。
大文本操作

方法:

lpublicObject query(Connection conn, String sql, Object[] params, ResultSetHandlerrsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理PreparedStatementResultSet 的创建和关闭
lpublicObject query(String sql, Object[] params, ResultSetHandler rsh) throwsSQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得Connection。
public Object query(Connection conn, String sql, ResultSetHandler rsh) throwsSQLException : 执行一个不需要置换参数的查询操作。
public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。l
public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。


ResultSetHandler 接口

该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。

实现类:

ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key(指定的key就是我们指定哪个字段名为key)
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List


ScalarHandler:select count(*) from account;可以取出count(*)的值。











原创粉丝点击