元数据-DBUtils

1.元数据

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

元数据- DataBaseMetaData

Connection.getMetaData()

DataBaseMetaData对象

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

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

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

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

getTables()

元数据- ParameterMetaData

MySQL不支持获取参数类型,但是在数据库的url后跟上参数就可以支持了,但是打印出来参数的类型都是varchar

jdbc:mysql:///day12?generateSimpleParameterMetadata=true

PreparedStatement . getParameterMetaData()

获得代表PreparedStatement元数据的ParameterMetaData对象。

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

ParameterMetaData对象

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

getParameterTypeName(int param) 获得指定参数的sql类型

getParameterType异常处理

Parameter metadata not available for the given statement

url后面拼接参数

?generateSimpleParameterMetadata=true

元数据- ResultSetMetaData

ResultSet. getMetaData()

获得代表ResultSet对象元数据的ResultSetMetaData对象。

ResultSetMetaData对象

getColumnCount() 返回resultset对象的列数

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

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

2.DBUtils实现增删改查

导入MySQL的驱动包,c3p0的包,c3p0的配置文件

public void del() throws SQLException{
MyQueryRunner runner = new MyQueryRunner(new ComboPooledDataSource());
runner.update("delete from account where id=?",3);
}
public void add() throws SQLException{
MyQueryRunner runner = new MyQueryRunner(new ComboPooledDataSource());
runner.update("insert into account values(null,?,?)","c",1000);
}
 
public void add3() throws SQLException{
MyQueryRunner runner = new MyQueryRunner(new ComboPooledDataSource());
runner.update("update account set money=? where name=?", 777,"a");
}
public void add2() throws SQLException{
QueryRunner runner = new QueryRunner(new ComboPooledDataSource());
runner.update("update account set money=? where name=?", 888,"a");
}
 
public void update1(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
ComboPooledDataSource source = new ComboPooledDataSource();
try{
conn = source.getConnection();
ps = conn.prepareStatement("update account set money=? where name=?");
ps.setDouble(1, 999);
ps.setString(2, "a");
ps.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}finally{
DbUtils.closeQuietly(conn, ps, rs);
}
}
/**
 * Mydb方式实现查询
 * @throws SQLException 
 *
 *回调函数:当方法a调用方法b,而方法b在执行的过程中,其中的一些逻辑需要由方法a来告知,此时需要方法a在调用方法b时将逻辑传入,而java中是不允许传递java源代码,此时可以使用回调机制来解决
 *所谓的回调,就是方法a和方法b约定一个接口,在这个接口中定义一个方法,这个方法的名字通常叫做hander方法,a方法在调用b时,传入此接口的一个实现,其中利用handler方法,将逻辑传入,方法b在执行的过程中需要执行a传入的逻辑时,调用接口实现的handler方法即可,此时a调用b时,b回来调用的a传入的逻辑,所以这个过程叫做回调.
 */
@Test
public void find3() throws SQLException{
MyQueryRunner runner = new MyQueryRunner(new ComboPooledDataSource());
List<Account> list = runner.query("select * from account where money>?"
, new MyResultSetHandler<List<Account>>(){
 
public List<Account> handle(ResultSet rs) throws SQLException {
List<Account> list = new ArrayList<Account>();
while(rs.next()){
Account acc = new Account();
acc.setId(rs.getInt("id"));
acc.setName(rs.getString("name"));
acc.setMoney(rs.getDouble("money"));
list.add(acc);
}
return list;
}
}, 500);
System.out.println(list);
}
/**
 * DbUtils方式实现查询
 * @throws SQLException 
 */
@Test
public void find2() throws SQLException{
QueryRunner runner = new QueryRunner(new ComboPooledDataSource());
List<Account>list = runner.query("select * from account where money>?"
, new ResultSetHandler<List<Account>>(){
public List<Account> handle(ResultSet rs) throws SQLException {
List<Account> list = new ArrayList<Account>();
while(rs.next()){
Account acc = new Account();
acc.setId(rs.getInt("id"));
acc.setName(rs.getString("name"));
acc.setMoney(rs.getDouble("money"));
list.add(acc);
}
return list;
}
}, 500);
System.out.println(list);
}
/**
 * 古老方式实现的查询
 *  ---sql/sql中的参数/结果集的处理
 */
@Test
public void find1(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
ComboPooledDataSource source  = new ComboPooledDataSource(); 
List<Account> list = new ArrayList<Account>();
try{
conn = source.getConnection();
ps = conn.prepareStatement("select * from account where money>?");
ps.setDouble(1, 500);
rs = ps.executeQuery();
while(rs.next()){
Account acc = new Account();
acc.setId(rs.getInt("id"));
acc.setName(rs.getString("name"));
acc.setMoney(rs.getDouble("money"));
list.add(acc);
}
System.out.println(list);
}catch (Exception e) {
e.printStackTrace();
}finally{
DbUtils.closeQuietly(conn, ps, rs);
}
}
}
 
 
public class MyQueryRunner {
private DataSource source = null;
public MyQueryRunner() {
}
public MyQueryRunner(DataSource source) {
this.source = source;
}
public int update(String sql, Object... params) throws SQLException{
Connection conn = source.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
//--获取参数元数据,获取参数的个数
ParameterMetaData metaData = ps.getParameterMetaData();
int count = metaData.getParameterCount();
//--循环设置参数的值
for(int i=1;i<=count;i++){
ps.setObject(i, params[i-1]);
}
//--执行update操作
int num = ps.executeUpdate();
DbUtils.closeQuietly(conn, ps, null);
return num;
}
public <T> T query(String sql, MyResultSetHandler<T> rsh, Object... params)
           throws SQLException{
Connection conn = source.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
//--获取参数元数据,获知参数个数
ParameterMetaData metaData = ps.getParameterMetaData();
int count = metaData.getParameterCount();
//--循环设置参数
for(int i=1;i<=count;i++){
ps.setObject(i, params[i-1]);
}
//--执行查询获取结果集
ResultSet rs = ps.executeQuery();
//--回调处理结果集的逻辑
T t = rsh.handle(rs);
DbUtils.closeQuietly(conn, ps, rs);
return t;
}
}

3.DBUtils_ResultSetHander的实现类

ArrayHandler:把结果集中的第一行数据转成对象数组。

ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。

BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

ColumnListHandler:将结果集中某一列的数据存放到List中。

KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。

ScalarHandler:获取结果集中第一行数据指定列的值,常用来进行单值查询

DBUtils

1.DbUtils

工具类

2.QueryRunner -- 两行代码搞定增删改查

(1)QueryRunner() --需要控制事务时,使用这组方法

intupdate(Connection conn, String sql)

Execute an SQL INSERT, UPDATE, or DELETE query without replacement parameters.

intupdate(Connection conn, String sql, Object... params)

Execute an SQL INSERT, UPDATE, or DELETE query.

intupdate(Connection conn, String sql, Object param)

Execute an SQL INSERT, UPDATE, or DELETE query with a single replacement parameter.

<T> T query(Connection conn, String sql, ResultSetHandler<T> rsh)

Execute an SQL SELECT query without any replacement parameters.

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

Execute an SQL SELECT query with replacement parameters.

(2)QueryRunner(DataSource ds) --不需要控制事务用这组方法

intupdate(String sql)

Executes the given INSERT, UPDATE, or DELETE SQL statement without any replacement parameters.

intupdate(String sql, Object... params)

Executes the given INSERT, UPDATE, or DELETE SQL statement.

intupdate(String sql, Object param)

Executes the given INSERT, UPDATE, or DELETE SQL statement with a single replacement parameter.

<T> T query(String sql, ResultSetHandler<T> rsh)

Executes the given SELECT SQL without any replacement parameters.

<T> T query(String sql, ResultSetHandler<T> rsh, Object... params)

Executes the given SELECT SQL query and returns a result object.

时间: 2024-10-10 04:16:27

元数据-DBUtils的相关文章

元数据和DbUtils

使用元数据可以在jdbc中获取数据库的定义,例如:数据库.表.列的定义信息. 在jdbc中可以使用: 数据库元数据.参数元数据.结果集元数据. 1.DataBaseMetaData对象 Connection.getDatabaseMetaData() getURL():返回一个String类对象,代表数据库的URL. getUserName():返回连接当前数据库管理系统的用户名. getDatabaseProductName():返回数据库的产品名称. getDatabaseProductVe

数据库元数据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等信息.除此之

java数据访问(2):DBUtils

导入包 <dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.5</version> </dependency> <!-- 导入Mysql数据库链接jar包 --> <dependency> <groupId>mysql</g