使用元数据可以在jdbc中获取数据库的定义,例如:数据库、表、列的定义信息。

  在jdbc中可以使用: 数据库元数据、参数元数据、结果集元数据。

1.DataBaseMetaData对象

  Connection.getDatabaseMetaData()

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

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

getDatabaseProductName():返回数据库的产品名称。

getDatabaseProductVersion():返回数据库的版本号。

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

getDriverVersion():返回驱动程序的版本号。

isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

2.ParameterMetaData对象

  PreparedStatement . getParameterMetaData()

Select * from user where name=? And password=?

getParameterCount():获得指定参数的个数。

getParameterType(int param):获得指定参数的sql类型。

3.ResultSetMetaData对象

ResultSet. getMetaData()

getColumnCount():返回resultset对象的列数。

getColumnName(int column):获得指定列的名称。

getColumnTypeName(int column):获得指定列的类型。

4.使用元数据优化Dao

public class BaseDao{
private Connection conn;
private PreparedStatement stmt;
private ResultSet resultSet;
public void update(String sql,Object[] paramValues){
conn = JdbcUtil.getConnection();
try {
stmt = conn.prepareStatement(sql);
int parameterCount = stmt.getParameterMetaData()
                    .getParameterCount();
if(paramValues !=null&&paramValues.length>0){
for(int i = 0;i<parameterCount;i++) {
stmt.setObject(i+1,paramValues[i]);
}
}
stmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
JdbcUtil.close(conn,stmt);
}
}
public <T> List<T> query(String sql,Object[] paramValues,Class<T> clazz){
try {
List<T> list = new ArrayList<T>();
//要封装的对象
conn = JdbcUtil.getConnection();
stmt = conn.prepareStatement(sql);
int count = stmt.getParameterMetaData().getParameterCount();
if(paramValues !=null&&paramValues.length>0){
for(int i = 0;i< count;i++)
stmt.setObject(i+1,paramValues[i]);
}
resultSet = stmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
while(resultSet.next()){
T t = clazz.newInstance();
for(int i=0;i<columnCount;i++){
//获取列的名字
String columnName = metaData.getColumnName(i + 1);
//获取列对应的值
Object object = resultSet.getObject(columnName);
//设置到对象的属性中
BeanUtils.copyProperty(t,columnName,object);
}
//添加对象
list.add(t);
}
return list;
}catch (Exception e){
throw new RuntimeException(e);
}finally {
JdbcUtil.close(conn,stmt);
}
}
}

5.DbUtils组件

  commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

  在使用DbUtils组件时,bean的属性名要和表的列名一致(大小写不敏感),否则,封装为bean对象时,相应的属性会被设置为默认值。

6.DbUtils API

DbUtils   关闭资源、加载驱动

QueryRunner   组件的核心工具类:定义了所有的与数据库操作的方法(查询、更新),这些方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。

Int  update(Connection conn, String sql, Object…  param)               执行更新带占位符的sql

Int[]  batch(Connection conn, String sql, Object[][] params)             批处理

T  query(Connection conn ,String sql, ResultSetHandler<T> rsh, Object... params)   查询方法

注意: 如果调用DbUtils组件的操作数据库方法,没有传入连接对象,那么在实例化QueryRunner对象的时候需要传入数据源对象: QueryRunner qr = new QueryRunner(ds);

Int  update( String sql, Object…  param);

Int[]  batch( String sql, Object[][] params)

DbUtils提供的封装结果的一些对象:

1)BeanHandler: 查询返回单个对象

2)BeanListHandler: 查询返回list集合,集合元素是指定的对象

3)  ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]

4)  ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中

5)  ScalarHandler 查询返回结果记录的第一行的第一列  (在聚合函数统计的时候用)

6)  MapHandler  查询返回结果的第一条记录封装为map

        conn = JdbcUtil.getConnection();
QueryRunner qr = new QueryRunner();
//使用组件提供的结果集对象封装数据
//封装单个对象
String sql = "select *from student_info where stuId = ?";
Student student = qr.query(conn, sql, new BeanHandler<Student>(Student.class),2008001); String sql = "select *from student_info";
//返回封装为对象的list的结果集
List<Student> students= qr.query(conn, sql, new BeanListHandler<Student>(Student.class)); //返回结果集的第一个结果的数组
Object[] query = qr.query(conn, sql, new ArrayHandler()); //返回结果集所有结果组成的list
List<Object[]> query = qr.query(conn, sql, new ArrayListHandler()); //返回结果集的第一个结果的列名-列值的映射
Map<String, Object> query = qr.query(conn, sql, new MapHandler()); //返回结果集的第一行的第一列
Long query = qr.query(conn, sql, new ScalarHandler<Long>());

7.使用DbUtils优化Dao

public class AdminDao implements IAdminDao {

    private Connection con;
private QueryRunner qr = new QueryRunner(); @Override
public Admin findByNameAndPwd(Admin admin) {
String sql = "select * from admin where userName=? and pwd=?";
try{
con = JdbcUtil.getConnection();
Admin ad = qr.query(con, sql,
new BeanHandler<Admin>(Admin.class),
admin.getUserName(),
admin.getPwd());
return ad;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JdbcUtil.closeAll(con, null, null);
}
} @Override
public void save(Admin admin) {
String sql = "INSERT INTO admin(userName,pwd) VALUES(?,?);";
try {
con = JdbcUtil.getConnection();
// 使用DbUtils组件的方法更新
qr.update(con, sql, admin.getUserName(),admin.getPwd());
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JdbcUtil.closeAll(con, null, null);
}
} @Override
public boolean userExists(String name) {
String sql = "select id from admin where userName=?";
try {
con = JdbcUtil.getConnection();
Integer in = qr.query(con, sql, new ScalarHandler<Integer>(), name);
if (in != null){
return true;
}
return false;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtil.closeAll(con, null, null);
}
}
}

元数据和DbUtils的更多相关文章

  1. 03 事务,连接池DBCP,C3P0,DBUtils

    事务 Transaction  其实指的一组操作,里面包含许多个单一的逻辑.只要有一个逻辑没有执行成功,那么都算失败. 所有的数据都回归到最初的状态(回滚) 事务的作用:为了确保逻辑的成功. 例子: ...

  2. jdbc学习笔记03

    作业: 1. 学生表(id,age,name) 2. 插入学生 3. 修改学生 4. 删除学生 5. 查询学生 JavaBean 俗称简单的Java对象 javaBean满足以下三点 1.私有属性 2 ...

  3. JavaEE就业学习路线(给初学者以及自学者一个学习方向)

    大家按这个路线学完后基本可以找工作了 第一节java入门 1-Java 背景介绍 2-Java 入门程序的编写 3-环境配置 4-基本概念介绍 5-类型转换 6-开发工具使用 第二节java基础 1- ...

  4. dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表

    今天用dbutils操作数据库,莫名地报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表 检查了sql语句没有问题.经过仔细排查 ...

  5. JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作

    1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...

  6. BenUtils组件和DbUtils组件

    BenUtils组件和DbUtils组件 [TOC] 1.BenUtils组件 1.1.简介 程序中对javabean的操作很频繁,所有Apache提供了一套开源api,方便javabean的操作!即 ...

  7. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表

    本文目录:       1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData        2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData       ...

  8. C3p0/元数据/内省-Bean/自定义查询封装类/查询/分页

    c3p0连接池(C3p0连接池,只有当用户获取连接时,才会包装Connection.) 第一步:导入c3p0 第二步:在classpath目录下,创建一个c3p0-config.xml 第三步:创建工 ...

  9. BeanUtils\DBUtils

    BeanUtil: 需要导入 beanutil包和logging日志包 用于给对象属性赋值. setProperty与copyProperty区别: 这个问题搁置,还不会. 将map数据拷贝到对象中, ...

随机推荐

  1. Android开发设计模式之——单例模式关于线程不安全问题处理

    单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到.比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenH ...

  2. Android自动接听&挂断电话(包含怎么应对4.1以上版本的权限检

    一  前言 这两天要研究类似白名单黑名单以及手势自动接听的一些功能,所以呢,自然而然的涉及到怎么自动接听/挂断电话的功能了.对于自动接听这一块,android4.1版本及其以上的版本和之前的版本处理逻 ...

  3. Handler知识点详解

    Handler是在多线程之间使用的,用于线程之间进行通信. 要想知道为什么需要Handler就首先说明android的主线程和工作线程. 主线程又称为UI线程.正是因为在android中,所有与UI有 ...

  4. Sqlserver_sql注入

    随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进 ...

  5. python语法笔记(五)

    1.python内存管理 (1)对象内存使用 &nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存 ...

  6. php中的 == 和 ===

    == 是等值 1 和  ‘1’ 是相等的 === 要等值并且类型相等,比如 1 和  ‘1’ 是不相等的,只有 ‘1’ 和 ‘1’ 是相等的.哈哈哈. http://ihacklog.com/post ...

  7. Falcon:三代reads比对组装工具箱

    主页:github: PacificBiosciences/FALCON 简介 Falcon是一组通过快速比对长reads,从而来consensus和组装的工具. Falcon工具包是一组简单的代码集 ...

  8. 判断手机连接的是fdd还是tdd的办法

    判断手机连接的是fdd还是tdd的办法http://bbs.ydss.cn/thread-550035-1-1.html移动4G一般都是tdd,联通则可能有tdd,还有可能是fdd,判断手机连接的是t ...

  9. VC++编译zlib

    目录 第1章简介    1 第2章版本1.2.3    2 2.1 编译汇编代码    2 2.1.1 32位汇编    2 2.1.2 64位汇编    5 2.2 Visual C++ 6.0   ...

  10. React Native For Android 架构初探

    版权声明:本文由王少鸣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/171 来源:腾云阁 https://www.qclo ...