一、O-R Mapping 简介
    一】概念:可以理解为对象和数据库的映射。
    二】常用O-R Mapping映射工具
        1)Hibernate(全自动框架)
        2)lbatis(半自动框架)
        3)Commons Dbutils(只是对JDBC的简单封装)

二、DBUtils框架(核心类:QueryRunner)

一】QueryRunner类
        1》构造参数:
            public QueryRunner();
            public QueryRunner(DataSource dataSource);        
       
          2》update方法
            1)无Connection参数(对应非空参构造):
                int update(String sql, Object[] objs);
                
                注意:内部已经关闭了连接数据库的流对象,不需要进行手动关闭(查看源码)
              code:

             QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = " INSERT INTO meta.user(username,salary) VALUES(?, ?) ";
qr.update(sql, new Object[]{"jack", 9700.5});
sql = " UPDATE meta.user SET salary = ? WHERE username = ?";
qr.update(sql, new Object[]{10000, "merry"});
sql = " DELETE FROM meta.user WHERE username = ? ";
qr.update(sql, new Object[]{"xixi"});

2)有Connection参数(对应空参构造):
                int update(Connection conn, String sql, Object[] objs);
                
                注意:内部除Connection外的对象已经自动关闭,但Connection并没有自动关闭,
                      故,需要手动关闭Connection对象。
              code:

                QueryRunner qr = new QueryRunner();
QueryRunner qr = new QueryRunner();
Connection conn = C3P0Utils.getMySqlConnection();
String sql = " INSERT INTO meta.user(username, salary) VALUES(?, ?) ";
qr.update(conn, sql, new Object[]{"hehe", 7000.3});

3》query()方法
            1)同样有带有参数Connection和不带有参数Connnection两种
            2)需要ResultSetHandler接口的实现类配合使用。

三】ResultSetHandler接口
        实现类:
            1)BeanHeadler/BeanListHandler:针对Bean
                    BeanHeadler:将查询结果的第一行结果封装成一个Bean对象
                    BeanListHandler:将所有行的查询结果封装成多个Bean对象,并将Bean对象存入List中

2)ArrayHandler/ArrayListHandler:针对数组
                    ArrayHandler:将查询结果的第一行结果添加到一个数组中
                    ArrayListHandler:将所有行的查询结果添加到多个数组中,并将数组存入List中

3)MapHandler/MapListHandler:针对Map
                    MapHandler:将查询结果的第一行结果,按照 <每列字段,每列结果> 的方式放入Map集合中
                    MapListHandler:将查询结果的多行结果,按照 <每列字段,每列结果> 的方式放入多个Map集合中,并将这些Map集合放入List中

4)ScalarHandler:针对Long
                    将查询结果的 第一行,第一列 的数据返回。

code:

         QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = " SELECT * FROM meta.user "; //BeanHandler:
User user = (User) qr.query(sql, new BeanHandler(User.class));//1 : merry : 10000.0
System.out.println(user); //BeanListHandler:
List<User> list = (List<User>) qr.query(sql, new BeanListHandler(User.class));
for (User u : list) {
System.out.println(u);
}
/*1 : merry : 10000.0
1 : merry : 10000.0
2 : berry : 10000.0
3 : hehe : 7000.3*/ //ArrayHandler
Object[] info = (Object[]) qr.query(sql, new ArrayHandler());
for (int i = 0; i < info.length; i++) {
System.out.println(info[i]);//1 merry 10000.0
} //ArrayListHandler
List<Object[]> list = (List<Object[]>) qr.query(sql, new ArrayListHandler());
for (Object[] obj : list) {
for (int i = 0; i < obj.length; i++) {
System.out.print(obj[i] + " : ");
}
System.out.println();
}
/*
1 : merry : 10000.0 :
2 : berry : 10000.0 :
3 : hehe : 7000.3 : */ //MapHandler
Map<String, Object> map = (Map<String, Object>) qr.query(sql, new MapHandler());
int id = (int) map.get("id");
String username = (String) map.get("username");
double salary = (double) map.get("salary");
System.out.println(id + " : " + username + " : " + salary);//1 : merry : 10000.0 //MapListHandler
List<Map<String, Object>> list = (List<Map<String, Object>>) qr.query(sql, new MapListHandler());
for (Map<String, Object> map : list) {
int id = (int) map.get("id");
String username = (String) map.get("username");
double salary = (double) map.get("salary");
System.out.println(id + " : " + username + " : " + salary);
}
/*1 : merry : 10000.0
2 : berry : 10000.0
3 : hehe : 7000.3*/ //ScalarHandler
String sca_sql = " SELECT COUNT(*) FROM meta.user ";
long cnt = (long) qr.query(sca_sql, new ScalarHandler());
System.out.println(cnt);//

三、应用

1)一对多/多对一 关系中: (部门与员工)

          QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
//1,将部门插入表department中
String INSERT_DEPARTMENT = " INSERT INTO dbutils.department(name) VALUES(?) ";
qr.update(INSERT_DEPARTMENT, de.getName());
//2,获取部门的主键,可用于表employee表的外键
String DEPART_PRIMARY_KEY = " SELECT id FROM dbutils.department WHERE name = ? ";
int did = (int) qr.query(DEPART_PRIMARY_KEY, de.getName(), new ScalarHandler());
//3,将员工信息插入表employee中,并与表department产生关联关系
String INSERT_EMPLOYEE = " INSERT INTO dbutils.employee(name, did) VALUES(?, ?) ";
List<Employee> list = de.getList();
for (Employee e : list) {
qr.update(INSERT_EMPLOYEE, new Object[]{e.getName(), did});
}

2)多对多 关系中: (学生与老师)

         QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
//1,插入教师信息到teacher表中
String ADD_TEA_INFO = " INSERT INTO dbutils.teacher(name) values(?) ";
qr.update(ADD_TEA_INFO, tea1.getName());
//2,获取插入的教师的id
String QUERY_TEA_ID = " SELECT id FROM dbutils.teacher WHERE name = ? ";
int tid = (int) qr.query(QUERY_TEA_ID, tea1.getName(), new ScalarHandler()); //3,插入学生信息到表student中
String ADD_STU_INFO = " INSERT INTO dbutils.student(name) VALUES(?) ";
List<Student> stus = tea1.getStus();
for (Student stu : stus) {
qr.update(ADD_STU_INFO, stu.getName());
} //4,获取所有学生id
String ALL_STU_ID = " SELECT id FROM dbutils.student ";
List<Object[]> list = (List<Object[]>) qr.query(ALL_STU_ID, new ArrayListHandler());
//5,将学生id和老师id对应插入到表middle中,建立相互联系
String BUILD_REALATION = " INSERT INTO dbutils.middle(sid, tid) VALUES(?, ?) ";
for ( Object[] sids : list) {
qr.update(BUILD_REALATION, new Object[]{sids[0], tid});
}

    注意:数据库的多表查询会话费很多时间,所以有时候允许数据的冗余,以空间换取时间。

DBUtils框架的更多相关文章

  1. Apache—DBUtils框架简介

    转载自:http://blog.csdn.net/fengdongkun/article/details/8236216 Apache—DBUtils框架简介.DbUtils类.QueryRunner ...

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

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

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

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

  4. javaweb学习总结(四十一)——Apache的DBUtils框架学习

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

  5. Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

    前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...

  6. JavaWeb 后端 <十一> 之 DBUtils 框架 (基本使用 结果集 事务处理 对表读取)

    一.数据库操作框架 1.ORM:Object Relation Mapping Hibernate:非常流行 JPA:Java Persistent API.ORM标准 MyBatis:2010年开始 ...

  7. JDBC第四篇--【数据库连接池、DbUtils框架、分页】

    1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的. 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接池 ...

  8. JDBC【数据库连接池、DbUtils框架、分页】

    1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...

  9. 开源框架:Apache的DBUtils框架

    开源框架:Apache的DBUtils框架 Commons DbUtils 1.4 API 开源框架:DBUtils使用详解 Download Apache Commons DbUtils  官方文档

随机推荐

  1. [Linux] 流 ( Stream )、管道 ( Pipeline ) 、Filter - 笔记

    流 ( Stream ) 1. 流,是指可使用的数据元素一个序列. 2. 流,可以想象为是传送带上等待加工处理的物品,也可以想象为工厂流水线上的物品. 3. 流,可以是无限的数据. 4. 有一种功能, ...

  2. C#日历上显示节气、阴阳历节假日信息

    近期在做一个工作日历,想在日历上设置工作日,显示请假.加班等相关信息,显示农历日期信息(包括农历日期.节日 .节气).公历信息(节假期). 不能不说,http://www.cnblogs.com/ho ...

  3. Cantor表(中等)

    2 3 1/2 2/1 题目分析 这是NoI的一道题目,不过题目比较有创意也比较适合新生,就是一道简单的找规律的题目,首先找到第N个数应该在第几个斜行,然后判断这一行是奇数还是偶数,偶数分母递减,分子 ...

  4. 如何唯一确定一台iOS设备

    如果你的iOS应用需要针对设备做特定的操作,或者需要硬件的信息来进行判定等等的,你就需要对iOS设备进行唯一性的判定. 苹果设备有个先天的东西符合这个需求,UDID,这个东东用iTunes就可以看到, ...

  5. Java容器详解

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.在Java中,容器的类型主要有:List.Set ...

  6. windows 编程 —— 子窗口 与 子窗口控件

    目录: 子窗口与主窗口的交互 子窗口控件 按钮类别 button 滚动条类别 scrollbar 静态类别  static 编辑框类别 edit 清单方块 listbox 子窗口与主窗口的交互 创建窗 ...

  7. Android 出现警告Exported service does not require permission

    在配置Android清单文件的时候,配置service,或者activity,或者receive的时候,出现Exported service does not require permission警告 ...

  8. Android 使用 RemoteViews 发送自定义通知 ,遇到 Couldn't expand RemoteViews问题总结

    在RemoteViews这种调用方式中,你只能使用以下几种界面组件: Layout:     FrameLayout, LinearLayout, RelativeLayout Component: ...

  9. 【网络流#8】POJ 3469 Dual Core CPU 最小割【ISAP模板】 - 《挑战程序设计竞赛》例题

    [题意]有n个程序,分别在两个内核中运行,程序i在内核A上运行代价为ai,在内核B上运行的代价为bi,现在有程序间数据交换,如果两个程序在同一核上运行,则不产生额外代价,在不同核上运行则产生Cij的额 ...

  10. eclipse-android-activity_main/fragment_main文件处理

    android新建工程后,在res/layout/下有两个文件,之前用studio的时候貌似没有,只有一个文件,然后再测试Activity切换的时候,一直在纠结这个问题,下面是解决方法: 1)将fra ...