dbutils工具

元数据

问题:元数据是什么,有什么作用? 
元数据(metaData) 指数据库中 库、表、列的定义信息 

1.DataBaseMetaData 数据库元数据(了解)
问题:怎样获取一个DataBaseMetaData?

Connection接口中定义了一个方法 getMetaData();

问题:常用API

String driverName = dmd.getDriverName(); //获取驱动名称
System.out.println(driverName);

String userName = dmd.getUserName();//获取用户名
System.out.println(userName);

String url = dmd.getURL();//获取url
System.out.println(url);

String databaseProductName = dmd.getDatabaseProductName(); //获取数据库名称
System.out.println(databaseProductName);

String databaseProductVersion = dmd.getDatabaseProductVersion();//获取数据库版本.
System.out.println(databaseProductVersion);

ResultSet getPrimaryKeys(String catalog,
String schema,
String table)
throws SQLException
获取表中主键相关描述
每个主键列描述都有以下列:
TABLE_CAT String => 表类别(可为 null) 
TABLE_SCHEM String => 表模式(可为 null) 
TABLE_NAME String => 表名称 
COLUMN_NAME String => 列名称 
KEY_SEQ short => 主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)。 
PK_NAME String => 主键的名称(可为 null2.ParameterMetaData 参数元数据
参数元数据主要用于获取:sql语句中占位符的相关信息.

问题:怎样获取ParameterMetaData?
在PreparedStatement中有一个方法getParameterMetaData可以获取.

问题:怎样使用?
int count = pmd.getParameterCount(); // 获取参数 个数
System.out.println(count);

String type1 = pmd.getParameterTypeName(1);//获取参数的类型
System.out.println(type1);

注意:在获取参数类型时会产生异常
java.sql.SQLException: Parameter metadata not available for the given statement
解决方案:
在url后添加参数
jdbc:mysql:///day18?generateSimpleParameterMetadata=true
添加这个参数后,我们在获取,它的结果也是varchar,原因:是mysql驱动的支持问题。 

3.ResultSetMetaData 结果集元数据

问题:怎样获取结果集元数据?
可以通过ResultSet的getMetaData()方法获取.

问题:怎样使用?
System.out.println(rsmd.getColumnCount());//获取结果集中列数量

System.out.println(rsmd.getColumnName(2));//获取结果集中指定列的名称.

System.out.println(rsmd.getColumnTypeName(3));//获取结果集中指定列的类型
View Code

 dbutils工具

问题:dbutils是什么,有什么作用?
它就是一个简单的jdbc封装工具.使用dbutils可以简化操作.要使用dbutils需要导入jar包. 

dbutils核心
1.QueryRunner类
它是用于执行sql语句的类。
1.query 用于执行select 
2.update 用于执行update delete insert
3.batch 批处理
2.ResultSetHandler接口
用于定义结果集的封装    
它提供九个实现类,可以进行不同的封装。
3.DbUtils类
它提供关于关闭资源以及事务rollback,commit操作。
-----------------------------------------------------
Dbutlis详解
1.QueryRunner
1.QueryRunner怎样获取
1.new QueryRunner()
如果是使用这种构造创建的QueryRunner,它的事务是手动控制.
2.new QueryRunner(DataSource ds);
如果是使用这种构造,它的事务是自动事务,简单说,一条sql一个事务。

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);

-----------------------------------------------------------------    
ResultSetHandler接口    
用于封装结果集.

============================================================================
模仿QueryRunner
1.query方法模仿
public <T> T query(Connection con, String sql, MyResultSetHandler<T> 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 <= count; i++) {
pst.setObject(i, params[i - 1]);
}

ResultSet rs = pst.executeQuery(); // 得到了结果集,要将结果集封装成用户想要的对象,但是,工具不可能知道用户需求。

return mrs.handle(rs);
}
2.update方法模仿
public int update(Connection con, String sql, Object... params) throws SQLException {

PreparedStatement pst = con.prepareStatement(sql); // 得到一个预处理的Statement.
// 问题:sql语句中可能存在参数,需要对参数赋值。

ParameterMetaData pmd = pst.getParameterMetaData();
// 可以得到有几个参数
int count = pmd.getParameterCount();
for (int i = 1; i <= count; i++) {
pst.setObject(i, params[i - 1]);
}

int row = pst.executeUpdate();
// 关闭资源
pst.close();
return row;
}
===============================================================================    
ResulsetHandler九个实现类

ArrayHandler, 将结果集中第一条记录封装到Object[],数组中的每一个元素就是记录中的字段值。
ArrayListHandler, 将结果集中每一条记录封装到Object[],数组中的每一个元素就是记录中的字段值。在将这些数组装入到List集合。

BeanHandler(重点), 将结果集中第一条记录封装到一个javaBean中。
BeanListHandler(重点), 将结果集中每一条记录封装到javaBean中,在将javaBean封装到List集合.

ColumnListHandler, 将结果集中指定列的值封装到List集合.

MapHandler, 将结果集中第一条记录封装到Map集合中,集合的 key就是字段名称,value就是字段值
MapListHandler, 将结果集中每一条记录封装到Map集合中,集合的 key就是字段名称,value就是字段值,在将这些Map封装到List集合

KeyedHandler,在使用指定的列的值做为一个Map集合的key,值为每一条记录的Map集合封装。
ScalarHandler 进行单值查询 select count(*) from account;

---------------------------------------------------------
扩展:实现BeanHandler
使用BeanUtils实现
Object obj = null;

Map<String, String[]> map = new HashMap<String, String[]>();

ResultSetMetaData md = rs.getMetaData();
int count = md.getColumnCount();

if (rs.next()) {
try {
obj = clazz.newInstance();
for (int i = 1; i <= count; i++) {
map.put(md.getColumnName(i),
new String[] { rs.getString(md.getColumnName(i)) });
}
BeanUtils.populate(obj, map);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

}

return obj;
View Code

 虚拟主机

    使用虚拟主机可以将项目部署成顶级域名
        
        1.在service.xml文件
            1.端口修改为80
            2. 配置主机
              <Host name="www.customer.com"  appBase="D:\java1110\workspace\day19_2"
                    unpackWARs="true" autoDeploy="true">

              
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                       prefix="localhost_access_log." suffix=".txt"
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />

                       <Context path="" docBase="D:\java1110\workspace\day19_2\WebRoot" />
              </Host>
            3.在hosts文件中配置
                127.0.0.1  www.customer.com
View Code

 

posted @ 2017-04-06 21:39  ABO-阿博  阅读(256)  评论(0编辑  收藏  举报