`

day15 JDBC元数据 DBUtils 开发模型

 
阅读更多

人们直接使用JDBC开发,非常麻烦 ----- 企业中开发web程序,连接数据库 通过JDBC框架
1、JDBC元数据API (编写JDBC框架基础)
2、编写自己JDBC框架(重点理解框架编写思想,代码不做要求)
3、Apache DBUtils 框架

什么是数据库元数据(MetaData):数据库存储结构定义信息 (库、表、列 定义信息)
学习元数据API 获得 数据库、表、列定义信息

1、DatabaseMetaData 数据库元数据 ----- 获得数据库结构信息
新建web工程
将mysql驱动 c3p0的jar包 复制WEB-INF/lib
将c3p0-config.xml 复制 src目录下 (修改数据库连接参数)
编写JDBCUtils (用c3p0连接池获得一个连接)

create table users(
  id int primary key not null auto_increment,
  username varchar(40) unique not null,
  password varchar(40) not null,
  email varchar(100)
);

insert into users values(null,'zs','123','zs@itcast.cn');
insert into users values(null,'lisi','123456','lisi@itcast.cn');
insert into users values(null,'wu','123','wangwu@itcast.cn');

* 获得JDBC连接参数 、获得主键、外键信息 、获得数据表、获得数据列信息

2、ParameterMetaData 参数元数据 ---- 获得预编译SQL语句中 ? 信息
getParameterCount()  参数个数 ---- ? 个数
getParameterType(int param)  ----- 参数类型
getParameterTypeName(int param)  --- 参数类型名称

获得类型时:
java.sql.SQLException: Parameter metadata not available for the given statement

3、ResultSetMetaData 结果集元数据 ---- 获得结果集列名称、数量、类型
getColumnCount() 返回resultset对象的列数
getColumnName(int column)  获得指定列的名称
getColumnTypeName(int column) 获得指定列的类型

* 学习JDBC元数据API ---- 编写通用JDBC程序(JDBC框架)
构造bean
 @Test
 public void testmeta() throws SQLException {
  PreparedStatement pre = JDBUtils.getConnection().prepareStatement(
    "select * from nc_info limit 0,1");
  ResultSetMetaData meta = pre.getMetaData();
  for (int i = 1; i <= meta.getColumnCount(); i++) {
   if (meta.getColumnTypeName(i).equalsIgnoreCase("INT")) {
    System.out
      .println("int " + meta.getColumnName(i).toLowerCase());
   }
   if (meta.getColumnTypeName(i).equalsIgnoreCase("varchar")) {
    System.out.println("String "
      + meta.getColumnName(i).toLowerCase()+";");
   }
  }
 }

------------------------------------------------------------------------------------
每次编写JDBC程序都发现存在好多重复代码 ---- 通过通用程序进行简化
1、通过CUD方法设计
create table account(
  id int primary key not null auto_increment,
  name varchar(40),
  money double
);
insert into account values(null,'aaa',1000);
insert into account values(null,'bbb',1000);
insert into account values(null,'ccc',1000);

为两张表 编写DAO程序 insert 方法(update方法和delete方法 和插入方法类似)

public static void update(String sql, Object... args) {} ---- 参数传入SQL 和 SQL中?对应数据

2、通用R方法设计
public static Object query(String sql, MyResultSetHandler handler,Object... args) {}


Apache DBUtils (轻量级) ---- 使用方便
只是对JDBC程序进行简单封装,从而简化开发者 创建连接、结果集封装、释放资源

QueryRunner 是DBUtils 核心操作类
ResultSetHandler 结果集封装处理器
DbUtils 工具类

DbUtils 工具类 : 加载驱动、关闭、事务提交、回滚

QueryRunner
QueryRunner()  ---- 空参数构造器
QueryRunner(DataSource ds)  --- 接收数据库连接池构造器

batch(Connection conn, String sql, Object[][] params)  ---- 传递连接批处理
batch(String sql, Object[][] params)  ---- 不传递连接批处理

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

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

1、如果使用 QueryRunner(DataSource ds) 构造QueryRunner 对象,数据库事务交给DBUtils框架进行管理 ---- 默认情况下每条sql 单独一个事务
batch(String sql, Object[][] params)
query(String sql, ResultSetHandler<T> rsh, Object... params)
update(String sql, Object... params)

2、如果使用 QueryRunner() 构造QueryRunner , 需要自己管理事务,因为框架没有连接池无法获得数据库连接
batch(Connection conn, String sql, Object[][] params)
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
update(Connection conn, String sql, Object... params)

学习QueryRunner 通用insert 、update 、delete操作方法 -----  update(String sql, Object... params)
* sql中?顺序、数量和可变参数params 对应

 // 事务控制
 @Test
 public void testTransfer() throws SQLException {
  double money = 100;
  String outAccount = "aaa";
  String inAccount = "bbb";
  String sql1 = "update account set money = money - ? where name= ?";
  String sql2 = "update account set money = money + ? where name= ?";

  // QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  // 默认每条sql 一个单独事务

  QueryRunner queryRunner = new QueryRunner();// 不要传递连接池 --- 手动事务管理
  Connection conn = JDBCUtils.getConnection();
  conn.setAutoCommit(false);
  try {
   queryRunner.update(conn, sql1, money, outAccount);
   // int d = 1 / 0;
   queryRunner.update(conn, sql2, money, inAccount);

   System.out.println("事务提交!");
   DbUtils.commitAndCloseQuietly(conn);
  } catch (Exception e) {
   System.out.println("事务回滚!");
   DbUtils.rollbackAndCloseQuietly(conn);
   e.printStackTrace();
  }
 }

 @Test
 public void testDelete() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "delete from users where id = ?";
  queryRunner.update(sql, 3);
 }

 @Test
 public void testUpdate() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "update users set password = ? where username = ?";
  Object[] param = { "nihao", "小明" };
  queryRunner.update(sql, param);
 }

 @Test
 public void testInsert() throws SQLException {
  // 第一步 创建QueryRunner对象
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());

  // 第二步 准备方法参数
  String sql = "insert into users values(null,?,?,?)";
  Object[] param = { "小丽", "qwe", "xiaoli@itcast.cn" };

  // 第三步 调用 query / update
  queryRunner.update(sql, param);
 }

学习query方法 完整数据表查询 ----- 需要将ResultSet 结果集 封装为一个对象
* 在DBUtils框架中 提供 九个ResultSetHandler 实现类
* 如果想将结果集封装为一个指定的对象,可以直接使用九个实现类

九个默认Handler : ArrayHander 、ArrayListHandler 、BeanHander、BeanListHandler、ColumnListHandler、MapHandler、MapListHandler、KeyedHander、ScalarHandler
* 最常用 BeanHander、BeanListHandler、ColumnListHandler、ScalarHandler


// ScalarHandler 通过保存只有一行一列 结果数据 ---- 分组函数
 @Test
 public void demo9() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "select count(*) from account";

  long count = (Long) queryRunner.query(sql, new ScalarHandler(1));
  System.out.println(count);
 }

 // KeyedHandler 将结果集每一行数据 保存map , 将map保存另一个map , key 指定列
 @Test
 public void demo8() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "select * from account";

  Map<Object, Map<String, Object>> map = queryRunner.query(sql,
    new KeyedHandler("id"));
  System.out.println(map);
 }

 // MapListHandler 将结果集每一行数据 保存map中,key列名 value数据 ---- 在讲map对象保存List集合
 @Test
 public void demo7() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "select * from account";
  List<Map<String, Object>> list = queryRunner.query(sql,
    new MapListHandler());
  for (Map<String, Object> map : list) {
   System.out.println(map);
  }
 }

 // MapHander 将结果集第一行数据 封装Map集合,key是列名 value第一行数据
 @Test
 public void demo6() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "select * from account";
  Map<String, Object> map = queryRunner.query(sql, new MapHandler());
  System.out.println(map);
 }

 // ColumnListHandler 作用获得结果集的某一列
 @Test
 public void demo5() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "select * from account";

  // 因为每列类型 都不一样
  // List<Object> list = queryRunner.query(sql,
  // new ColumnListHandler("name"));
  List<Object> list = queryRunner.query(sql, new ColumnListHandler(2));
  System.out.println(list);
 }

 // BeanListHander 结果集每一条数据 ---JavaBean对象 再保存list集合
 @Test
 public void demo4() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "select * from account";
  List<Account> accounts = queryRunner.query(sql,
    new BeanListHandler<Account>(Account.class));

  for (Account account : accounts) {
   System.out.println(account.getId());
   System.out.println(account.getName());
   System.out.println(account.getMoney());
   System.out.println("----------------");
  }
 }

 // BeanHandler 将结果集第一行数据 封装 JavaBean对象中
 @Test
 public void demo3() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "select * from account";

  // 传入 Account.class 为了在方法中 通过反射构造Account对象
  // 使用BeanHandler 注意事项 :表列名 与 类中属性名称一致
  Account account = queryRunner.query(sql, new BeanHandler<Account>(
    Account.class));
  System.out.println(account.getId());
  System.out.println(account.getName());
  System.out.println(account.getMoney());
 }

 // ArrayListHandler 结果集每一行数据保存Object[] ----- List
 @Test
 public void demo2() throws SQLException {
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "select * from account";
  List<Object[]> list = queryRunner.query(sql, new ArrayListHandler());

  for (Object[] objects : list) {
   System.out.println(Arrays.toString(objects));
  }
 }

 // ArrayHandler 将结果集 第一行数据 存入Object[]
 @Test
 public void demo1() throws SQLException {
  // 使用DBUtils
  QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
  String sql = "select * from account";

  // 数组每一个元素,第一行数据每一列
  Object[] values = queryRunner.query(sql, new ArrayHandler());
  System.out.println(Arrays.toString(values));
 }

--------------------------------------------------------------------------------------------------
客户信息增删改查系统

软件工程开发流程:1、瀑布模型 2、螺旋模型

RUP (Rational Unified Process,统一软件开发过程 ) 采用瀑布模型: 需求 --- 需求分析 --- 系统设计(概要、详细设计)---- 编码 --- 测试 --- 实施 --- 维护
* 瀑布模型 缺陷在编码结束之前,客户看不到最终软件产品 ,如果需求、设计出现明显错漏,导致软件后期无法维护,存在重大缺陷
* 瀑布模型对于 新型软件,需求不定软件 风险较大

敏捷开发理念:迭代开发模式 ,将系统功能分成若干批次 ,对每部分功能实施瀑布模型流程 ,系统随时看到开发结果,始终存在可用软件产品
* 增量开发 ,中途发现设计错误,很容易调整

1、需求 客户信息增删改查
2、系统设计
数据库设计 E-R图

创建数据库 create database customersystem;
* 每个软件都会为数据库创建单独用户并授权

创建用户:create user flower identified by 'flower';
授权:grant all on customersystem.* to flower;

创建数据表
create table customer (
   id varchar(40) primary key not null,
   name varchar(20) unique not null,
   gender varchar(10) not null,
   birthday date not null,
   cellphone varchar(20) not null,
   email varchar(40) unique not null,
   preference varchar(100),
   type varchar(40),
   description varchar(255)
);

----------------------------------------------------
启动navicat lite ---- 创建Connection(name随意写,填写用户名、密码)
双击打开连接
在连接上右键点击 new Database --- 创建数据库 customersystem
双击数据库 开发数据库
在数据库/Table右键 new Table ---- 创建数据表 customer

在工具上方点击manager users --- Add User 创建 flower用户
点击用户展开后 具体数据库 ---- select All 为用户flower 授予 customersystem 所有权限

----------------------------------------------------
系统功能设计
1) 技术选型 mysql + Servlet + JSP + EL +JSTL + BeanUtils + c3p0 + DBUtils
2) 搭建工程环境
创建customermanager 工程 ,将jar包复制 WEB-INF/lib
准备c3p0配置文件
3) 创建package 结构 (javaee三层结构)
cn.itcast.customer.web
cn.itcast.customer.service
cn.itcast.customer.dao
cn.itcast.customer.domain
cn.itcast.customer.utils

使用c3p0、DBUtils ---- 需要工具类
实体类 Customer

4) 发布客户管理系统 ----- 虚拟主机方式
配置tomcat/conf/server.xml 添加虚拟主机 www.customer.com  ---- 路径指向工程根目录
<Host name="www.customer.com"  appBase="D:\work\myclipse\work20120605\customermanager" ...>
修改本地hosts文件 添加域名解析  ---- 127.0.0.1   www.customer.com
将工程下发WebRoot 配置缺省虚拟目录 <Context path="" docBase="WebRoot" />

5) 设计 增加、查询、删除、修改 四个功能 --- UML Unified Modeling Language (UML)又称统一建模语言或标准建模语言
绘制UML工具 很多:Rantional Rose、Microsoft Visio、starUML 、jude(纯java开发)
* UML 做软件 建模(分析设计) : 用例图、类图、时序图


总结:
JDBC元数据API(框架开发基础) ------- 自定义JDBC框架(不要求掌握、理解框架编写过程) ------- Apache DBUtils
* DBUtils 增删改查 、事务处理

三层结构编写java项目
1、客户端:请求是否需要数据 (form / 链接) ---- 提交数据 form action 、 a href
2、web层:获得客户端提交数据,封装JavaBean --- 传递业务层 (BeanUtils)
3、业务层获得客户端数据后,编写程序业务逻辑,如果需要对数据库增删改查 --- 调用DAO
4、DAO 对表增删改查 (DBUtils/C3P0)
5、业务层处理数据结果返回web层 ---- web层根据结果,传递结果数据给JSP显示 ---- request.setAttribute request.getRequestDispatcher.forward

完成客户信息增加、查询

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    JDBC连接数据库DBUtils操作数据库两个jar包

    在IT行业中,数据库是存储和管理数据的核心工具,而Java编程语言通过JDBC(Java Database Connectivity)接口提供了与各种数据库进行交互的能力。本篇将详细讲解如何使用JDBC连接MySQL数据库,并结合Apache的DBUtils...

    jdbc连接池和dbutils

    jdbc连接池和dbutils-v2016.06.03.pdf

    JDBC及DBUtils

    它由SUN公司开发并定义在`java.sql`和`javax.sql`包中,允许开发者使用Java编写数据库应用程序,实现跨平台的数据访问。 在JDBC中,主要涉及以下几个关键组件: 1. **Driver接口**:驱动接口,是所有数据库驱动的...

    JDBC_DBUtils查询操作处理

    DBUtils是Apache组织提供的一款开源的Java数据库操作工具,它简化了JDBC的使用,提高了开发效率。下面将详细介绍这个主题中的相关知识点。 1. JDBC简介: JDBC是Java语言访问数据库的标准接口,它提供了与各种...

    JDBC学习(九)dbUtils原理代码实例

    JDBC学习(九)dbUtils原理代码实例,包含三个demo:正常C3P0数据库池对数据库的增删改查操作;自己实现dbutils对数据库实现增删改查操作;使用apache的工具类dbutils对数据库增删改查操作。

    JAVA-JDBC-DbUtils教程简单到精通!

    在提供的"JAVA-JDBC-DbUtils教程"中,你可能会学习到如何设置开发环境,创建数据库连接,编写SQL语句,以及如何使用DbUtils进行数据操作。教程中的源码会展示实际的编程示例,帮助你更好地理解和应用这些概念。笔记...

    JDBC连接池&DBUtils1

    JDBC 连接池 & DBUtils JDBC 连接池是 Java 中的一种机制,用于提高数据库连接的效率。传统的 JDBC 操作中,需要频繁地创建和销毁连接,这会消耗大量的时间和资源。使用连接池可以解决这个问题,连接池可以在程序...

    day04_JDBC&连接池&DBUtils.md

    day04_JDBC&连接池&DBUtils.md

    开发类库DButils

    DButils 是一个由 Apache Software Foundation 开发的 Java 类库,用于简化数据库操作。它作为 JDBC(Java Database Connectivity)的一个辅助工具,提供了更加简洁、健壮的API,减轻了开发人员处理数据库连接、执行...

    dbutils dbutils dbutils dbutils

    DBUtils 是一个非常重要的 Python 模块,专为数据库连接设计,它在 Python 的数据库应用开发中扮演着不可或缺的角色。这个模块主要目的是提供一个稳定、健壮的接口,用于管理和操作数据库连接,使得开发者能够更方便...

    JDBC连接使用的包与DBUtils工具包

    本文将深入探讨JDBC连接使用的包以及DBUtils工具包,这两个组件在处理数据库连接时起着关键作用。 首先,我们来了解`mysql-connector-java-5.1.37-bin.jar`这个文件。这是MySQL数据库的Java驱动程序,由MySQL公司...

    netbeans java web demo4 jsp页分页查询 --jdbc-DBUtils 案例

    【标题】"netbeans java web demo4 jsp页分页查询 --jdbc-DBUtils 案例"涉及的关键知识点主要包括Java Web开发、NetBeans IDE的使用、JSP(JavaServer Pages)、数据库连接(JDBC)以及DBUtils工具类。这个示例教程...

    commons-dbutils.jar.rar

    DBUtils适用于那些需要进行数据库操作的Java应用,如Web应用、数据处理工具或后台服务。它的简单性和鲁棒性使其成为中小规模项目中的理想选择,特别是对于那些不想使用完整ORM框架(如Hibernate或MyBatis)的开发者...

    扩展ApacheCommos的DbUtils

    DbUtils是基于JDBC的,但提供了一层封装,使得数据库操作更加简单和健壮,减少了资源泄露的风险。本篇讨论的是如何对这个库进行扩展,以满足特定项目需求或提高其功能。 **描述:** 这篇博文可能是作者分享了自己在...

    sql-server2005 的jdbc-odbc驱动和dbutils

    总的来说,理解并熟练运用SQL Server 2005的JDBC-ODBC驱动和DBUtils是Java开发人员进行数据库操作时的重要技能。通过这些工具,可以构建出稳定、高效的数据库应用程序,满足企业的各种需求。在实际项目中,还需要...

    jdbc工具类-DBUtils1.6版jar包-正式版下载

    Commons DbUtils作为一款轻量级的JDBC封装工具,在不影响性能的前提下极大地简化了数据库操作的复杂度,提升了开发效率。无论是对于初学者还是有经验的开发者来说,都是一个值得学习和使用的优秀工具。通过本文的...

    jdbc+数据库连接池+dbutils

    DbUtils是一个简化JDBC操作的工具类库,它提供了更简洁的方式来执行SQL语句,自动释放资源等功能。 ##### DbUtils使用示例 1. **导入依赖** - 添加DbUtils的依赖。 ```xml &lt;groupId&gt;org.apache.commons ...

    Apache Dbutils JDBC 框架demo代码

    commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司...

    DbUtils应用开发例子--DbUtilsExample.zip

    Apache Common DbUtils是操作数据库的组件,对传统操作数据库的类(JDBC)进行二次封装,可以把结果集转化成List。 DbUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。 应用实践小结: 一、...

    DBUtils用的包.rar

    这个库是对JDBC(Java Database Connectivity)API的一种轻量级封装,旨在提供高效、简单且可靠的数据库连接管理及数据处理。在Java开发中,DBUtils能帮助开发者避免编写大量的样板代码,使数据库操作更加便捷。 `...

Global site tag (gtag.js) - Google Analytics