元数据和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&¶mValues.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&¶mValues.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的更多相关文章
- 03 事务,连接池DBCP,C3P0,DBUtils
事务 Transaction 其实指的一组操作,里面包含许多个单一的逻辑.只要有一个逻辑没有执行成功,那么都算失败. 所有的数据都回归到最初的状态(回滚) 事务的作用:为了确保逻辑的成功. 例子: ...
- jdbc学习笔记03
作业: 1. 学生表(id,age,name) 2. 插入学生 3. 修改学生 4. 删除学生 5. 查询学生 JavaBean 俗称简单的Java对象 javaBean满足以下三点 1.私有属性 2 ...
- JavaEE就业学习路线(给初学者以及自学者一个学习方向)
大家按这个路线学完后基本可以找工作了 第一节java入门 1-Java 背景介绍 2-Java 入门程序的编写 3-环境配置 4-基本概念介绍 5-类型转换 6-开发工具使用 第二节java基础 1- ...
- dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表
今天用dbutils操作数据库,莫名地报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表 检查了sql语句没有问题.经过仔细排查 ...
- JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作
1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...
- BenUtils组件和DbUtils组件
BenUtils组件和DbUtils组件 [TOC] 1.BenUtils组件 1.1.简介 程序中对javabean的操作很频繁,所有Apache提供了一套开源api,方便javabean的操作!即 ...
- JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表
本文目录: 1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData 2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData ...
- C3p0/元数据/内省-Bean/自定义查询封装类/查询/分页
c3p0连接池(C3p0连接池,只有当用户获取连接时,才会包装Connection.) 第一步:导入c3p0 第二步:在classpath目录下,创建一个c3p0-config.xml 第三步:创建工 ...
- BeanUtils\DBUtils
BeanUtil: 需要导入 beanutil包和logging日志包 用于给对象属性赋值. setProperty与copyProperty区别: 这个问题搁置,还不会. 将map数据拷贝到对象中, ...
随机推荐
- git本地文件回滚操作
今天有几个文件改在了其他分支上.需要回滚. 参考了下面两篇文章: Link Link 简单讲,分多个不同的阶段: 1. 用git status命令看,发现是unstaged,那么就是只在work ...
- Android APK混淆
APK混淆 1 修改project.properties文件 即可实现对项目进行全局混码将proguard.config=${sdk.dir}/tools/proguard/proguard-andr ...
- RTB
RTB —— Real Time Bidding 的简称,就是实时竞价.跟传统购买形式相比,RTB是在每一个广告展示曝光的基础上进行竞价,就是每一个PV都会进行一次展现竞价,谁出价高,谁的广告就会被这 ...
- C#_拆箱跟装箱
Net的类型分为两种,一种是值类型,另一种是引用类型.这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上.那么如果要把一个值类型数据放到堆上,就需要装箱操作:反之,把一个放在堆上的 ...
- eclipse设置字体、背景(豆绿)色、自动提示
背景色:(护眼豆绿色) window-->preferences-->General-->Editors-->Text Editors-->(最下遍一栏中的)Backgr ...
- jmeter 建立一个扩展LDAP测试计划
添加用户 第一步你想做的每一个JMeter测试计划是添加一个线程组元素. 线程组告诉JMeter的用户数量你想模拟,用户应该发送的次数 请求,他们应该发送的请求的数量. 继续添加 线程组 首先选择元素 ...
- python 练习 17
#!/usr/bin/python # -*- coding: UTF-8 -*- f1 = 1 f2 = 1 for i in range(1,21): print '%12d %12d' % (f ...
- python 练习 13
#!/usr/bin/python # -*- coding: UTF-8 -*- l = [] for i in range(3): x = int(raw_input('integer:\n')) ...
- Android 使用dagger2进行依赖注入(基础篇)
0. 前言 Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用dagger2进行依赖注入.如果你不还不了解依赖注入,请看这一篇. 1. 简单的依赖 ...
- Qt之QCustomPlot(图形库)
简述 QCustomPlot是一个基于Qt C++的图形库,用于绘制和数据可视化 - 制作漂亮的2D图 - 曲线图.趋势图.坐标图.柱状图等,并为实时可视化应用程序提供高性能服务.它没有进一步的依赖关 ...