day17_jdbc
jdbc的元数据---databasemetada
2.jdbc的元数据---ParameterMetadata
3.jdbc的元数据---ResultSetMetadata
把这些元数据的信息封装到JavaBean里面去,会用到反射的代码
写框架用的就是反射的代码
4.引出写jdbc的小框架
查询(这些代码没有真正实现)
增删改
5.反射的代码简单回顾
Javabean
TestPerson.java(反射、消耗性能)
6.自定义小框架的实现_完成增删改(一)
DBAssist.java(增删改方法)
最后把release() 方法放进来
SomeDao.java
7.查询时引入需要自定义接口
JdbcUtils.java
DBAssist.java(查询方法)
ResultSetHandler.java
由于不确定返回是一个还是多个,所以接口方法返回Object
8.实现返回查询多个值的接口的代码实现
Bean 封装
list 有多个,并且放到list里面
handler 处理器
someDao.java(查询多个)
publicList getAll(){
List<Account> list = (List<Account>) dbassist.query("select * from account", null, new BeanListHandler(Account.class));
for (Account account : list) {
System.out.println(account);
}
returnnull;
}
Beanlisthandler.java(ResultSetHandler的实现类)
/*
* 用于返回满足多个的处理器的封装的实现类 ,当调用者需要查询多个值的时候, 就可以使用这个实现类 ,这个实现类帮助去完成封装的操作
*
* 规定 :
你需要将 数据封装到哪个javabean上你得告诉我, 目标javabean的字段的名称以及类型需要与数据库中的表的字段的名称和类型保持一致
*
*/
Account.java
9.完成封装单个&将框架导出一个jar包
someDao.java
@Test
publicvoid getOne(){
Account acount =(Account) dbassist.query("select * from account where name=?", new Object[]{"玲玲"}, new BeanHandler(Account.class));
System.out.println(acount);
}
BeanHandler.java
反射:
http://blog.csdn.net/liujiahan629629/article/details/18013523
获取属性获得的只是哪一个"ID"属性,设置IDF.set(bean,"value")不用指明给谁设置属性
反射机制可以打破封装性,所以传递的.class字节码是Javabean对象的字节码
反射的用处::
用反射可以写出通用的代码
10.apache的dbutils框架的介绍
可变长参数对象放在声明的最后
自定义的框架:
封装了jdbc 的代码
核心的类 : DBAssist类,
提供了update, query 方法用于完成 CRUD的操作
Update: 增删改
Query: 查询
查询的时候, 有 返回单个值, 还有返回多个值, 定义了接口, 写了接口的默认的实现类
BeanListHandler ---- 封装多个 的 结果集处理器
BeanHandler ------- 封装单个的 结果集处理器
apache—DBUtils框架
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
实现原理 与咱们早上的自定义的框架原理是类似的.
-
QueryRunner:
构造函数:
更新的方法:
查询的方法:
-
如果 你要做 CRUD操作, 不需要自己去管理事务, 那么就用
如果你做CRUD的操作, 但是你需要自己手动的去管理事务 , 那么就用
查询操作:
针对不同的情况, 拿到结果集如何去处理也是不一样的.
Dbutils框架中 就同样的写好一个 接口, 然后针对这个接口 将常规的一些操作 需要做的事, 都写好的默认的实现类, 实际开发过程中,
你 有相应的需求时, 只需要去找对应的实现类 就可以了.
11个 实现类, 有两个 是抽象的 .
工具类 DbUtils的使用:
操作 数据库的时候, 通常需要去释放资源, 释放资源的时候, 还或多或少 会有一些异常.,
那么这个时候, 推荐使用dbtuils框架中的 工具类 , 提供了 一些列的 默默无闻的关闭释放资源的方法
例如:
11.dbutils中处理器的使用
加了泛型就不用强制类型转换,类型已经确定
最常用的是BeanHandler,BeanListHandler,ColumnListHandler,ScalarHandler
QueryRunnerTest.java
QueryRunnerTest2.java
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:
把结果集中的每一行数据都转成一个数组,再存放到List中。
ColumnListHandler:将结果集中某一列的数据存放到List中
KeyedHandler(name):
将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key。
上面写错了, key和key也是不一样的, 第一个key表示区别大的map的key,第二个key 是区分小的map的 key
MapHandler:
将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:
将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ScalarHandler:
用于做单值查询的情况.
12.jdbc的综合练习功能介绍
入门级的增删改查的系统 , 提供如下的功能:
客户信息管理系统
-
客户信息的添加
-
客户信息的查询
-
客户信息的删除 ---- 单个的删除, 批量的删除
-
客户信息的修改 ---
-
模糊查询 ---- select * from users where name like '%何%';
-
分页查询 ----
13.一般开发项目的流程介绍
需求分析:
小组的人员都会参加, 美工也会 画 相应的效果图出来 .
数据库建模分析:
E-R实体关系图 .
Coding 过程:
具体的功能实现
测试相关的工作:
PM实时跟踪项目进展
FAE(现场应用工程师) 去现场解决bug
管理层:PM, 技术总监, CTO.
技术层,:FAE
14.建库建表语句
还是要去建库建表
id 的类型最好是varchar类型,避免合并id时重复产生问题
create database customer_system;
use customer_system;
create table customers(
id varchar(100) primary key,
name varchar(30),
gender varchar(10),
birthday date,
email varchar(20),
cellphonevarchar(20),
preference varchar(100),
type varchar(20),
description varchar(255)
);
create user erqiu identified by 'qiuqiu';
grant all on customer_system.* to erqiu;
15.环境的搭建(核心)***
组织包结构, 导入必要的包, 建好相应的javabean ,工具类 ,
-
组织包结构:
-
导包:
Beanutils(2个jar) + mysql驱动(1 个jar) + c3p0(1个jar, 1 个配置文件) +dbutils(1 个jar )
-
建好相应的javabean:
有什么样的表, 就有什么样 javabean ..
-
工具类:
16.mysqlFront图形化工具的使用
17.客户信息的添加流程分析
18.客户信息的添加
1.建表语句(创建数据库、基本表、用户、给用户分配权限)
2.配置C3P0连接池
3.addcustomer.jsp
4. AddCustomerServlet.java
对于CheckBox那样的多个数据(爱好),BeanUtils无法封装。
需要自己在BeanUtils封装 后 ,在自己处理
CustomerService.java
CustomerDao.java
UUID
注意:写到这里是有问题的
虽然有独一无二的ID,但是在提交完成提示success的页面用F5刷新页面可以反复的提交
19.防表单重复刷新添加数据代码实现
addcustomer.jsp
AddCustomerServlet.java
request和response解决乱码
20.表单刷新原理
必须要解决.
著名的令牌机制 --- token