其实本质上,这个DAButil和我所想的几乎是差不多的就是只不过考虑的更复杂而已,这个主要将这个分为了修改和查找两个部分,他就是利用数据的元数据,可以获取到数据替换参的个数,而元数据作为底层的更接触到数据的本质所以,对数据的类型并不会做特殊的要求所以,才会产生这样的结果。
这个方法仅仅用于增删改主要原因查找和增删改执行的两个方法是不同的所以不得不采用两个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55public void update(String sql, Object[] args) {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = ds.getConnection();
stmt = conn.prepareStatement(sql);
ParameterMetaData pmd = stmt.getParameterMetaData();
// 拿到占位符个数
int count = pmd.getParameterCount();
// 替换占位符
if (count > 0) {
// 说明有占位符
if (args == null) {
// throw new
// IllegalArgumentException("sorry, the parameter is wrong..");
throw new IllegalArgumentException(
"对不起, 你传的参数 有问题, 不要瞎 搞 ...");
}
if (count != args.length) {
throw new IllegalArgumentException(
"对不起, 你传的参数个数 与 占位符 个数 不匹配 , 不要瞎 搞 ...");
}
// for 循环去 替换占位符
for (int i = 0; i < args.length; i++) {
stmt.setObject(i + 1, args[i]);
}
}
stmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
// 自定义异常 , 一般都是 自定义 异常去继承 RuntimeException
throw new MyRuntimeException(e);
} finally {
// 释放资源
release(null, stmt, conn);
}
}
- 查询的方法
- 对于查询和增删改的原理差不多,
- 首先获取数据的占位符的个数,我们
- 只不过需要指定返回结果的类型,在这个类型中我们需要传递一个接口的实现类
- 最后返回接口的结果
1 | public Object query(String sql, Object[] args,ResultSetHandler rsh){ |
实现类的接口:规定了传递的结果:
接口也会是对于他的结果的格式一个规定,参数的类型以及返回的结果
1 | import java.sql.ResultSet; |
接口的实现类:
1 | package com.itheima.dbassist.handler; |
- 返回的是一个结果集
1 | package com.itheima.dbassist.handler; |
- 总结:通过dbutile的简单的框架,我感觉mybatis的原理是与他类似的,主要他的配置文件config获取加载后的xml文件,获取初始化的信息,之后通过obeject factory 进行创建在查询 数据所需要的实体类对象以及中间的对象,refect通过反射调用实体类对象进行对象的赋值,在这个过程中,我认为需要对类型的转化,数据库的jdbc的类型转换到java的类型所以他设计了一个typehander的类型处理器来解决这个问题,当然这个框架也会设计数据库的事务处理,以及数据检索操作的优化问题,其中包括对于缓存机制的设置,也就是同时操作一条数据以后对查询的内容不会频繁的操作数据库。