Java进阶学习第十九天dbutils与案例
文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.05.15 lutianfei none 元数据 元数据(metaData) 指数据库中 库 、 表 、 列 的定义信息 DataBaseMetaData 数据库元数据 获取一个DataBaseMetaData Connection接口中定义了一个方法 getMetaDat
文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.05.15 | lutianfei | none |
元数据
- 元数据(metaData) 指数据库中 库、表、列的定义信息
DataBaseMetaData 数据库元数据
-
获取一个DataBaseMetaData
- Connection接口中定义了一个方法 getMetaData();
- Connection.getMetaData()
-
通过DataBaseMetaData获得 数据库连接的基本参数
- getURL():返回一个String类对象,代表数据库的URL。
- getUserName():返回连接当前数据库管理系统的用户名。
- getDriverName():返回驱动驱动程序的名称。
- getPrimaryKeys(String catalog, String schema, String table):返回指定表主键列的结果集
-
获得数据库、表、列、主键、外键 定义信息
- getTables
- getColumns
- getPrimaryKeys
-
常用API
- String driverName = dmd.getDriverName(); //获取驱动名称
- String userName = dmd.getUserName();//获取用户名
- String url = dmd.getURL();//获取url
- String databaseProductName = dmd.getDatabaseProductName(); //获取数据库名称
- String databaseProductVersion = dmd.getDatabaseProductVersion();//获取数据库版本.
- ResultSet getPrimaryKeys(String catalog,String schema,String table)
- 获取表中主键相关描述,每个主键列描述都有以下列:
- TABLE_CAT String => 表类别(可为 null)
- TABLE_SCHEM String => 表模式(可为 null)
- TABLE_NAME String => 表名称
- COLUMN_NAME String => 列名称
- KEY_SEQ short => 主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)。
- PK_NAME String => 主键的名称(可为 null)
- 获取表中主键相关描述,每个主键列描述都有以下列:
ParameterMetaData 参数元数据
参数元数据主要用于获取:sql语句中占位符的相关信息.
-
PreparedStatement . getParameterMetaData()
- 获得代表PreparedStatement元数据的ParameterMetaData对象。
-
常用API
- getParameterCount():获得指定参数的个数
- getParameterTypeName(int param) :获得指定参数的sql类型
-
注意:在获取参数类型时会产生异常
- java.sql.SQLException: Parameter metadata not available for the given statement
- 解决方案:
- 在url后添加参数:jdbc : mysql:///day18?generateSimpleParameterMetadata=true
- 原因:是mysql驱动的支持问题。
ResultSetMetaData 结果集元数据(重点)
-
ResultSet. getMetaData()
- 获得代表ResultSet对象元数据的ResultSetMetaData对象。
-
常用API
- getColumnCount() 返回resultset对象的列数
- getColumnName(int column) 获得指定列的名称
- getColumnTypeName(int column) 获得指定列的类型
public static void main(String[] args) throws SQLException {
Connection con = JdbcUtils.getConnection();
ResultSet rs = con.createStatement().executeQuery(
"select * from account");
// 得到结果集元数据
ResultSetMetaData rsmd = rs.getMetaData();
// System.out.println(rsmd.getColumnCount());//获取结果集中列数量
//
// System.out.println(rsmd.getColumnName(2));//获取结果集中指定列的名称.
//
// System.out.println(rsmd.getColumnTypeName(3));//获取结果集中指定列的类型。
int count = rsmd.getColumnCount();
for (int i = 1; i
System.out.print(rsmd.getColumnName(i)+"("+rsmd.getColumnTypeName(i)+")" + "\t");
}
System.out.println();
while (rs.next()) {
for (int i = 1; i
System.out.print(rs.getObject(i) + "\t\t");
}
System.out.println();
}
}
dbutils工具
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
简单说,它就是一个简单的jdbc封装工具,使用dbutils可以简化操作,要使用dbutils需要导入jar包。
JAR包:
commons.dbutils-1.4.jar
-
API介绍:
- org.apache.commons.dbutils.QueryRunner — 核心
- org.apache.commons.dbutils.ResultSetHandler
- 工具类
- org.apache.commons.dbutils.DbUtils。
DBUtils学习
-
1、
QueryRunner
框架核心类 ,所有数据库操作都是必须通过 QueryRunner 进行的,用于执行sql语句的类。- 1.query 用于执行select
- 2.update 用于执行update delete insert
- 3.batch 批处理
-
2、
ResultSetHandler
结果集封装接口,完成将ResultSet 结果集 封装为一个Java对象- 用于定义结果集的封装
- 它提供九个实现类,可以进行不同的封装。
-
3、
DbUtils
工具类 提供驱动管理、事务管理、释放资源等一系列公共方法- 它提供关于关闭资源以及事务rollback,commit操作。
- DbUtils里面的所有方法都是静态的。主要方法如下:
- public static void
close(…)
throws java.sql.SQLException- DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
- public static void
closeQuietly(…)
- 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLException。
- public static void
commitAndCloseQuietly
(Connection conn)- 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
- public static boolean
loadDriver
(java.lang.String driverClassName):这一方装载并注册*JDBC驱动程序*,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。
- public static void
Dbutlis详解
-
1.QueryRunner怎样获取
- 1.new QueryRunner()
- 如果是使用这种构造创建的QueryRunner,它的事务是手动控制。
- 2.new QueryRunner(DataSource ds);
- 如果是使用这种构造,它的事务是自动事务,简单说,一条sql一个事务。
- 1.new QueryRunner()
-
2.QueryRunner中的三个核心方法
- query
- update
- batch
- 对于上述三个方法,它们提供很多重载。
- 如果QueryRunner在创建时,没有传递DataSource参数,那么在使用query,update,batch方法时,要传递Connection参数
- 如果QueryRunner在创建时,传递了Dataource参数,那么在使用query,update,batch方法时,不需要传递Connection参数。
总结:
-
怎样配套使用:
- QueryRunner runner=new QueryRunner();
- runner.query(Connection,sql,ResultSetHandler,Object… param);
- runner.update(Connection,sql,Object…param);
- runner.batch(Connection con,sql,Object[][] objs);
- QueryRunner runner=new QueryRunner(DataSource ds);
- runner.query(sql,ResultSetHandler,Object… param);
- runner.update(sql,Object…param);
- runner.batch(sql,Object [][] objs);
- QueryRunner runner=new QueryRunner();
模仿QueryRunner
- 1.query方法模仿
public T query(Connection con, String sql, MyResultSetHandler mrs,Object... params) throws SQLException {
PreparedStatement pst = con.prepareStatement(sql); // 得到一个预处理的Statement.
// 问题:sql语句中可能存在参数,需要对参数赋值。
ParameterMetaData pmd = pst.getParameterMetaData();
// 可以得到有几个参数
int count = pmd.getParameterCount();
for (int i = 1; i params