元数据和DbUtils

  使用元数据可以在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);
        }
    }
}
时间: 2024-08-02 19:21:47

元数据和DbUtils的相关文章

java 课程大纲

第一章 Java基础 第一节 java入门 1-Java 背景介绍 2-Java 入门程序的编写 3-环境配置 4-基本概念介绍 5-类型转换 6-开发工具使用 第二节 java基础 1-运算符的使用 2-键盘录入的练习 3-Java语法-判断 4-Java语法-循环一 5-Java语法-循环二 6-随机数获取和使用 7-数组简介 8-数组的使用 9-方法的定义和使用 10-方法的练习 11-断点调试 12-基础语法练习一 13-基础语法练习二 第三节 面向对象 1-面向对象概述 2-类的定义和

元数据-DBUtils

1.元数据 元数据:数据库.表.列的定义信息. 元数据- DataBaseMetaData Connection.getMetaData() DataBaseMetaData对象 getURL():返回一个String类对象,代表数据库的URL. getUserName():返回连接当前数据库管理系统的用户名. getDriverName():返回驱动驱动程序的名称. getPrimaryKeys(String catalog, String schema, String table):返回指定

数据库元数据MetaData

本篇介绍数据库方面的元数据(MetaData)的有关知识.元数据在建立框架和架构方面是特别重要的知识,再下一篇我们仿造开源数据库工具类DbUtils就要使用数据库的元数据来创建自定义JDBC框架. 在我们前面使用JDBC来处理数据库的接口主要有三个,即Connection,PreparedStatement和ResultSet这三个,而对于这三个接口,还可以获取不同类型的元数据,通过这些元数据类获得一些数据库的信息. 元数据(MetaData),即定义数据的数据.打个比方,就好像我们要想搜索一首

BeanUtils\DBUtils

BeanUtil: 需要导入 beanutil包和logging日志包 用于给对象属性赋值. setProperty与copyProperty区别: 这个问题搁置,还不会. 将map数据拷贝到对象中,用populate(居住的意思),map中的的key要与对象属性名称保持一致. 要保存类似日期这种类型,需要注册转换器: 用转换工具类:ConvertUtils.register(new DateLocalConverter(),Date.class);然后在进行转换. 处理请求数据的封装: 通过对

黑马day12 数据库之元数据

声明:下面的案例在数据库为: create database day12; use day12; create table account( id int primary key auto_increment, name varchar(30), money double ); 使用的c3p0数据库 配置文件:c3p0-config.xml文件 <?xml version="1.0" encoding="UTF-8"?> <c3p0-config&

apache commons 之 DbUtils QueryRunner使用之迷雾重重

DbUtils 和 DBCP一般需要一起使用. 在ORALCE环境下运行. 首先创建一张表,创建表语句. create table tb_user(USERNAME varchar2(64)  ,PASSWORD  varchar2(64)); 首先来看一段程序运行后的异常: Exception in thread "main"java.lang.AbstractMethodError atorg.apache.commons.dbcp.DelegatingPreparedStatem

BenUtils组件和DbUtils组件

[TOC] 1.BenUtils组件 1.1.简介 程序中对javabean的操作很频繁,所有Apache提供了一套开源api,方便javabean的操作!即BeanUtils组件BeanUtils组件的作用就是简化javabean的操作 使用BeanUtils组件 引入commons-beanutils-1.8.3.jar核心包 引入日志支持包: commons-logging-1.1.3.jar即使用BeanUtils必须导入两个包才可以 1.2.基本用法,对象属性,对象,map的拷贝 Be

依靠反射来个Dbutils

闲来无事,写个dbutils玩玩,不完善,满足基本增删改查,上代码 1.Dbutils 1 package db; 2 3 import annotation.Table; 4 import java.util.*; 5 import java.sql.*; 6 import java.lang.reflect.Field; 7 8 /** 9 * 10 * @author xjy 11 * @param <T> 12 */ 13 public class DbUtil<T> {

Android中读取图片EXIF元数据之metadata-extractor的使用

一.引言及介绍 近期在开发中用到了metadata-extractor-xxx.jar 和 xmpcore-xxx.jar这个玩意, 索性查阅大量文章了解学习,来分享分享. 本身工作也是常常和处理大图片打交道,摸索摸索也是多多益善. 首先介绍一下什么是EXIF.EXIF是 Exchangeable Image File 的缩写,这是一种专门为数码相机照片设定的格式.这样的格式能够用来记录数字照片的属性信息,如相机的品牌及型号.相片的拍摄时间.拍摄时所设置的光圈大小.快门速度.ISO等信息.除此之