JavaWeb 之 16.DBUtils 使用jdbc案例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013987258/article/details/83536631

    
## 元数据、DBUtils和编写案例 ##


**ThreadLocal事务的操作**
    
    1.目的:传递conn对象
        * 可以通过参数的方式传递
        * 通过ThreadLocal类把conn绑定到ThreadLocal中。
    
**元数据**
    
    1.SUN提供的一些规范,接口。
    2.元数据:可以获取数据库的基本的信息,表,字段的信息,参数的信息。
    3.作用:编写一些框架。
    4.元数据的分类
        * 数据库元数据
        * 参数元数据
        * 结果集元数据    
        
**数据库元数据**
    
    1.DataBaseMetaData  -- 数据库元数据
    2.谁创建数据库元数据?
        * 由Connection对象创建的
        DatabaseMetaData metaData = conn.getMetaData();
    
    3.数据库元数据获取的内容?
        * 获取url
        * 获取username
        * 获取驱动的名称
        * 获取主键
    4.方法
        * getURL() 获取此 DBMS 的 URL。
        * getUserName() 获取此数据库的已知的用户名称
        * getDriverName() 获取此 JDBC 驱动程序的名称
        * getPrimaryKeys(null, null, 表名) 获取对给定表的主键列的描述
        
    
**参数元数据(ParameterMetaData)**
    
    1.作用:获取SQL语句中?的个数和类型(类型获取的不准确)
    2.PreparedStatement可以获取参数元数据
        * ParameterMetaData metaData  = stmt.getParameterMetaData();
    3.方法
        * getParameterCount()   -- 获取参数的个数(获取?的个数)
        
        
**结果集元数据(ResultSetMetaData)**
    
    1.作用:获取结果集中的列的信息
    2.由ResultSet创建
        * ResultSetMetaData metaData = rs.getMetaData();
    3.方法
        * getColumnCount() 返回resultset对象的列数
        * getColumnName(int column) 获得指定列的名称
        * getColumnTypeName(int column)获得指定列的类型 


**抽取通用的方法**
 

**DBUtils工具类(框架)**
    
    1.commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
    
    2.导入jar包。commons-dbutils-1.4.jar
    
    3.核心的类    QueryRunner类 -- 做增删改查的操作
        * 方法
            * QueryRunner()
            * QueryRunner(DataSource ds) 

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

            *  <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) 
            *  <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) 
            
        * 组合
            * 没有事务
            * QueryRunner(DataSource ds)     -- 传入连接池(获取连接)
            * int update(String sql, Object... params) 
            * <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) 
            注意:DBUtils在创建QueryRunner时传入dataSource对象每次在执行完之后都会自动关闭Connection连接对象
            
            * 和事务相关的(conn向下传递)
            * QueryRunner()
            * int update(Connection conn, String sql, Object... params) 
            * <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) 
            
    4.ResultSetHandler接口,可以用户自己来实现,重写方法。9个实现类。
    5.DbUtils类
        * 和事务相关的方法
        *  static void     rollbackAndClose(Connection conn) 
        *  static void     rollback(Connection conn) 
        *  static void     commitAndClose(Connection conn)     


**QueryRunner类**    

    1.update(String sql,Object... obj)
    2.query(String sql ,ResultSetHandler reh,Object... ojb)

**ResultsetHandler的实现类**
    
    1.BeanHandler              -- 把一条记录封装到JavaBean对象中
        例:QueryRunner runner = new QueryRunner(MyJdbcUtil2.getDataSource());
            Account ac = runner.query("select * from t_account where id = ?", new BeanHandler<Account>(Account.class), 2);
            System.out.println(ac);
        结果为:Account [id=2, username=美美, money=1000.0]
        
    2.BeanListHandler            -- 把一条记录封装到JavaBean对象中,把多个JavaBean放入List集合中。
        最终把这些JavaBean存放到List集合中
        例:List<Account> list = runner.query("select * from t_account", new BeanListHandler<Account>(Account.class));
            for (Account account : list) {
                System.out.println(account);
            }
        结果为:Account [id=1, username=聪聪, money=18000.0]
                Account [id=2, username=美美, money=1000.0]
                Account [id=3, username=小凤, money=10000.0]
                Account [id=4, username=赵刘, money=10000.0]
                Account [id=5, username=天启, money=10000.0]
        
    3.ArrayHandler                -- 把一条记录封装到数组中
        例:Object [] obj = runner.query("select * from t_account where id = ?", new ArrayHandler(),2);
            System.out.println(Arrays.toString(obj));
        结果为:[2, 美美, 1000.0]
        
    4.ArrayListHandler          -- 把一条记录封装到数组中,把数组存放在集合中
        例:List<Object []> list = runner.query("select * from t_account", new ArrayListHandler());
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
        结果为:[1, 聪聪, 18000.0]
                [2, 美美, 1000.0]
                [3, 小凤, 10000.0]
                [4, 赵刘, 10000.0]
                [5, 天启, 10000.0]
        
    5.MapHandler                -- 一条记录封装到Map集合
        例:Map<String, Object> map = runner.query("select * from t_account where id = ?", new MapHandler(),2);
            System.out.println(map);
        结果为:{id=2, username=美美, money=1000.0}
        
    6.MapListHandler            -- 一条记录封装到Map集合,把Map集合存放到集合中
        例:List<Map<String, Object>> list = runner.query("select * from t_account", new MapListHandler());
            System.out.println(list);
        结果为:
            [
                {id=1, username=聪聪, money=18000.0}, 
                {id=2, username=美美, money=1000.0}, 
                {id=3, username=小凤, money=10000.0}, 
                {id=4, username=赵刘, money=10000.0}, 
                {id=5, username=天启, money=10000.0}
            ]
    
    7.ScalarHandler            -- 封装count(*) 单行单列数据
        例:long obj = (Long) runner.query("select count(*) from t_account", new ScalarHandler());
            System.out.println(obj);
        结果为:5

    8.ColumnListHandler        -- 查询是一列数据,把一列数据封装到集合中。
        例:List<Object> list = runner.query("select username,money from t_account", new ColumnListHandler("money"));
            for (Object object : list) {
                System.out.println(object);
            }
        结果为:
            18000.0
            1000.0
            10000.0
            10000.0
            10000.0
        
    9.KeyedHandler            -- 把一条记录封装到一个map集合,把该map集合又存放在另一个map集合中。
        例:Map<Object, Map<String, Object>> map = runner.query("select * from t_account", new KeyedHandler("username"));
            System.out.println(map);
        结果为:
          { 
              赵刘={id=4, username=赵刘, money=10000.0}, 
              天启={id=5, username=天启, money=10000.0}, 
              小凤={id=3, username=小凤, money=10000.0}, 
              聪聪={id=1, username=聪聪, money=18000.0}, 
              美美={id=2, username=美美, money=1000.0}
          }
    
    * 重点    BeanHandler     BeanListHandler        ScalarHandler
        
        
**客户管理案例**
    
    1.目的:总结JDBC,和Servlet JSP结合到一起。
    2.开发中的一些小技巧。
    3.客户管理平台功能
        * 添加客户
        * 查询所有的客户的信息
        * 修改客户信息
        * 删除客户信息
        * 按条件查询
        * 分页查询数据
        
    4.准备环境
    5.Servlet + JSP +JavaBean + JDBC 
    6.数据库
        create database day19 character set 'utf8' collate 'utf8_general_ci';
        use day19;
        create table t_customer(
            id varchar(40) primary key,
            username varchar(20),
            gender varchar(10),
            birthday varchar(20),
            cellphone varchar(20),
            email varchar(40),
            love varchar(100),
            type varchar(40)
        );    
        
    7.导入jar包。
        * MySLQ驱动包
        * BeanUtils包
        * JSTL标签库
        * DBUtils
        * c3p0
        
    8.创建包结构
        * cn.itcast.action
        * cn.itcast.service
        * cn.itcast.dao
        * cn.itcast.vo
        * cn.itcast.utils

    9.把工具类和配置文件复制过来
        

**添加客户的功能**
    
    1.form表单 -- 校验
    2.字段的名称和javaBean的属性和表单中name属性的值都是相同的。
    

猜你喜欢

转载自blog.csdn.net/u013987258/article/details/83536631