DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。
在使用DBUtils之前,应该注意一些问题:
1、DBUtils是JDBC的简单封装,可以和JDBC混合使用。
2、DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次Bean的getter与setter方法的名字与结果集的列名一一对应,而不要求JavaBean的私有成员与表结果集列名一一对应。
3、DBUtils可以将结果集封装为各种类型,主要有:Bean/List<Bean>,Map/List<Map>/Map<Map>,数组/List<数组>,列/List<列>,这些类型。
对于Map<Map>的类型使用KeyedHandler作为结果集处理器,内层的Map是“列名-值"对,外层的Map是“主键-内层Map的引用”,但此处的主键不一定就是数据库的主键,可以随意指定,比如:
1
2
3
4
5
|
ResultSetHandler
h
=
new
KeyedHandler
(
"id"
)
;
Map
found
=
(
Map
)
queryRunner
.
query
(
"select id, name, age from person"
,
h
)
;
Map
jane
=
(
Map
)
found
.
get
(
new
Long
(
1
)
)
;
// jane's id is 1
String
janesName
=
(
String
)
jane
.
get
(
"name"
)
;
Integer
janesAge
=
(
Integer
)
jane
.
get
(
"age"
)
;
|
4、DBUtils执行插入操作的时候,无法返回自增主键,这是一个很严重的问题,当然不能怪DBUtils,可以通过变通的方法来实现,比如在MySQL中,执行完了一个插入SQL后,接着执行SELECT LAST_INSERT_ID()语句,就可以获取到自增主键。
5、DBUtils的性能和JDBC性能是一样,测试过程中没发现性能损失,拥有了很高性能的同时,而不失JDBC的灵活性。
6、对于JavaBean的成员类型定义,有一条原则那就是:尽可能使用包装类型,而不要使用基本类型。如果数据库中的值为null,那么将会报错.
常用:
1
2
3
4
5
6
7
8
9
|
ArrayHandler
//把结果集中的第一行数据转成对象数组。
ArrayListHandler
//把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler
//将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler
//将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler
//将结果集中某一列的数据存放到List中。
KeyedHandler
//将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key把每个Map再存放到一个Map里。
MapHandler
//将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler
//将结果集中的每一行数据都封装到一个Map里,然后再存放到List。
ScalarHandler
//将结果集中某一条记录的其中某一列的数据存成Object。
|
增删改案例:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
@Test
public
void
add
(
)
{
Connection
conn
=
null
;
try
{
//获取连接
conn
=
JdbcUtils
.
getConnection
(
)
;
/**1 创建QueryRunner对象
* * 该对象执行sql语句
*/
//QueryRunner query=new QueryRunner(JdbcUtils.getDataSource());
QueryRunner
query
=
new
QueryRunner
(
)
;
//2 组织sql语句
String
sql
=
"insert into emp(id,name,email) values(?,?,?)"
;
//3 设置sql语句需要的参数
Object
[
]
params
=
{
7
,
"yxkong"
,
"fishingsky@qq.com"
}
;
//4 执行
query
.
update
(
conn
,
sql
,
params
)
;
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
/**关闭资源
* DbUtils.close(conn);
* 该方法关闭连接 抛出异常
* DbUtils.closeQuietly(conn);
* 捕获了异常
*/
DbUtils
.
closeQuietly
(
conn
)
;
}
}
@Test
public
void
update
(
)
{
Connection
conn
=
null
;
try
{
//获取连接
conn
=
JdbcUtils
.
getConnection
(
)
;
/**1 创建QueryRunner对象
* * 该对象执行sql语句
*/
//QueryRunner query=new QueryRunner(JdbcUtils.getDataSource());
QueryRunner
query
=
new
QueryRunner
(
)
;
//2 组织sql语句
String
sql
=
"update emp set name=?,email=? where id=?"
;
//3 设置sql语句需要的参数
Object
[
]
params
=
{
"鱼翔空"
,
"zhaozhengkfu@163.com"
,
5
}
;
//4 执行insert update delete
query
.
update
(
conn
,
sql
,
params
)
;
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
/**关闭资源
* DbUtils.close(conn);
* * 该方法关闭连接 抛出异常
* DbUtils.closeQuietly(conn);
* * 捕获了异常
*/
DbUtils
.
closeQuietly
(
conn
)
;
}
}
@Test
public
void
delete
(
)
{
Connection
conn
=
null
;
try
{
conn
=
JdbcUtils
.
getConnection
(
)
;
QueryRunner
query
=
new
QueryRunner
(
)
;
String
sql
=
"delete from emp where id=?"
;
Object
[
]
params
=
{
1
}
;
query
.
update
(
conn
,
sql
,
params
)
;
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
DbUtils
.
closeQuietly
(
conn
)
;
}
}
|
查询案例
一)查询所有的结果通过ResultSetHandler转成bean的集合
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
@Test
public
void
findAllObject1
(
)
{
Connection
conn
=
null
;
try
{
conn
=
JdbcUtils
.
getConnection
(
)
;
QueryRunner
query
=
new
QueryRunner
(
)
;
String
sql
=
"select id,name,email from emp"
;
/** query方法执行对数据库的select操作
* * query(conn, sql, new MyResultSetHandler())
* * 从上面的测试得到结果如下:
* * query方法的返回值就是ResultSetHandler接口实现类的handle(ResultSet rs)方法的返回值
*/
Object
obj
=
query
.
query
(
conn
,
sql
,
new
MyResultSetHandler
(
)
)
;
List
<Emp>
list
=
(
List
<Emp>
)
obj
;
for
(
Emp
emp
:
list
)
{
System
.
out
.
println
(
emp
.
getId1
(
)
+
" "
+
emp
.
getName
(
)
+
" "
+
emp
.
getEmail
(
)
)
;
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
DbUtils
.
closeQuietly
(
conn
)
;
}
}
@Test
public
void
findAllObject2
(
)
{
Connection
conn
=
null
;
try
{
conn
=
JdbcUtils
.
getConnection
(
)
;
QueryRunner
query
=
new
QueryRunner
(
)
;
String
sql
=
"select id,name,email from emp"
;
Object
obj
=
query
.
query
(
conn
,
sql
,
new
ResultSetHandler
(
)
{
@Override
public
Object
handle
(
ResultSet
rs
)
throws
SQLException
{
List
<Emp>
list
=
new
ArrayList
<Emp>
(
)
;
while
(
rs
.
next
(
)
)
{
Emp
emp
=
new
Emp
(
)
;
emp
.
setId1
(
rs
.
getInt
(
1
)
)
;
emp
.
setName
(
rs
.
getString
(
2
)
)
;
emp
.
setEmail
(
rs
.
getString
(
3
)
)
;
list
.
add
(
emp
)
;
}
return
list
;
}
}
)
;
List
<Emp>
list
=
(
List
<Emp>
)
obj
;
for
(
Emp
emp
:
list
)
{
System
.
out
.
println
(
emp
.
getId1
(
)
+
" "
+
emp
.
getName
(
)
+
" "
+
emp
.
getEmail
(
)
)
;
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
DbUtils
.
closeQuietly
(
conn
)
;
}
}
@Test
public
void
findAllObject3
(
)
{
//内部类
ResultSetHandler
resultSetHandler
=
new
ResultSetHandler
(
)
{
@Override
public
Object
handle
(
ResultSet
rs
)
throws
SQLException
{
List
<Emp>
list
=
new
ArrayList
<Emp>
(
)
;
while
(
rs
.
next
(
)
)
{
Emp
emp
=
new
Emp
(
)
;
emp
.
setId1
(
rs
.
getInt
(
1
)
)
;
emp
.
setName
(
rs
.
getString
(
2
)
)
;
emp
.
setEmail
(
rs
.
getString
(
3
)
)
;
list
.
add
(
emp
)
;
}
return
list
;
}
}
;
Connection
conn
=
null
;
try
{
conn
=
JdbcUtils
.
getConnection
(
)
;
QueryRunner
query
=
new
QueryRunner
(
)
;
String
sql
=
"select id,name,email from emp"
;
Object
obj
=
query
.
query
(
conn
,
sql
,
resultSetHandler
)
;
List
<Emp>
list
=
(
List
<Emp>
)
obj
;
for
(
Emp
emp
:
list
)
{
System
.
out
.
println
(
emp
.
getId1
(
)
+
" "
+
emp
.
getName
(
)
+
" "
+
emp
.
getEmail
(
)
)
;
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
DbUtils
.
closeQuietly
(
conn
)
;
}
}
|
MyResultSetHandler.java类内容
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
MyResultSetHandler
implements
ResultSetHandler
{
public
Object
handle
(
ResultSet
rs
)
throws
SQLException
{
List
<Emp>
list
=
new
ArrayList
<Emp>
(
)
;
while
(
rs
.
next
(
)
)
{
Emp
emp
=
new
Emp
(
)
;
emp
.
setId1
(
rs
.
getInt
(
1
)
)
;
emp
.
setName
(
rs
.
getString
(
2
)
)
;
emp
.
setEmail
(
rs
.
getString
(
3
)
)
;
list
.
add
(
emp
)
;
}
return
list
;
}
}
|
二)通过BeanListHandler自动转成集合
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
|
@Test
public
void
findAllObjectByBeanListHandler
(
)
{
Connection
conn
=
null
;
try
{
conn
=
JdbcUtils
.
getConnection
(
)
;
QueryRunner
query
=
new
QueryRunner
(
)
;
String
sql
=
"select id id1,name,email from emp"
;
/** BeanListHandler(Class claxx)
* * 实现了ResultSetHandler接口
* * 该类完成把表中的数据放置到javaBean,把javaBean放置到List中
* * new BeanListHandler(Emp.class);
* * 该类构造方法的参数Emp.class,表示要把表中的记录封装到哪个javaBean中
* * 要求:
* * 使用 BeanListHandler类时,javaBean中的属性必须和表中的字段名要一致,不区分大小写
* * 底层代码在查找是,就是通过表中的字段和javaBean的属性的名称一致对应
*/
Object
obj
=
query
.
query
(
conn
,
sql
,
new
BeanListHandler
(
Emp
.
class
)
)
;
List
<Emp>
list
=
(
List
<Emp>
)
obj
;
for
(
Emp
emp
:
list
)
{
System
.
out
.
println
(
emp
.
getId1
(
)
+
" "
+
emp
.
getName
(
)
+
" "
+
emp
.
getEmail
(
)
)
;
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
DbUtils
.
closeQuietly
(
conn
)
;
}
}
|
三)通过BeanHandler查询一个对象,并自动封装到bean中
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
|
@Test
public
void
findObjectByBeanHandler
(
)
{
Connection
conn
=
null
;
try
{
conn
=
JdbcUtils
.
getConnection
(
)
;
QueryRunner
query
=
new
QueryRunner
(
)
;
String
sql
=
"select id id1,name,email from emp where id=1"
;
/**
* BeanHandler(Class claxx)
* * 实现了ResultSetHandler接口
* * 该类完成把表中的数据放置到结果集中第一行记录放置到javaBean,
* * new BeanHandler(Emp.class);
* * 该类构造方法的参数Emp.class,表示要把表中的记录封装到哪个javaBean中
* * 要求:
* * 使用 BeanHandler类时,javaBean中的属性必须和表中的字段名要一致,不区分大小写
* * 底层代码在查找是,就是通过表中的字段和javaBean的属性的名称一致对应
*/
Object
obj
=
query
.
query
(
conn
,
sql
,
new
BeanHandler
(
Emp
.
class
)
)
;
Emp
emp
=
(
Emp
)
obj
;
if
(
emp
!=
null
)
{
System
.
out
.
println
(
emp
.
getId1
(
)
+
" "
+
emp
.
getName
(
)
+
" "
+
emp
.
getEmail
(
)
)
;
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
DbUtils
.
closeQuietly
(
conn
)
;
}
}
|
四)带条件的查询
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
|
@Test
public
void
findAllObjectByBeanListHandlerCondition
(
)
{
Connection
conn
=
null
;
try
{
conn
=
JdbcUtils
.
getConnection
(
)
;
QueryRunner
query
=
new
QueryRunner
(
)
;
String
sql
=
"select id id1,name,email from emp where name like ? and email like ? "
;
//设置?需要的值
Object
[
]
params
=
{
"%yxk%"
,
"%163%"
}
;
/**
* BeanListHandler(Class claxx)
* * 实现了ResultSetHandler接口
* * 该类完成把表中的数据放置到javaBean,把javaBean放置到List中
* * new BeanListHandler(Emp.class);
* * 该类构造方法的参数Emp.class,表示要把表中的记录封装到哪个javaBean中
*
* * 要求:
* * 使用 BeanListHandler类时,javaBean中的属性必须和表中的字段名要一致,不区分大小写
* * 底层代码在查找是,就是通过表中的字段和javaBean的属性的名称一致对应
*/
Object
obj
=
query
.
query
(
conn
,
sql
,
new
BeanListHandler
(
Emp
.
class
)
,
params
)
;
List
<Emp>
list
=
(
List
<Emp>
)
obj
;
for
(
Emp
emp
:
list
)
{
System
.
out
.
println
(
emp
.
getId1
(
)
+
" "
+
emp
.
getName
(
)
+
" "
+
emp
.
getEmail
(
)
)
;
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
DbUtils
.
closeQuietly
(
conn
)
;
}
}
|
五) 统计查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
@Test
public
void
findCount
(
)
{
Connection
conn
=
null
;
try
{
conn
=
JdbcUtils
.
getConnection
(
)
;
QueryRunner
query
=
new
QueryRunner
(
)
;
String
sql
=
"SELECT COUNT(1) FROM emp "
;
/**
* ScalarHandler:
* * 获取单行结果表中指定列的值,放置到一个对象中
* new ScalarHandler(columnIndex) 参数时列的索引
*/
Object
obj
=
query
.
query
(
conn
,
sql
,
new
ScalarHandler
(
0
)
)
;
System
.
out
.
println
(
"总数 "
+
obj
)
;
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
DbUtils
.
closeQuietly
(
conn
)
;
}
}
|
六)单值查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@Test
public
void
findObject
(
)
{
Connection
conn
=
null
;
try
{
conn
=
JdbcUtils
.
getConnection
(
)
;
QueryRunner
query
=
new
QueryRunner
(
)
;
String
sql
=
"SELECT id id1,NAME,email FROM emp where id=1"
;
/* ScalarHandler:
* * 获取单行结果表中指定列的值,放置到一个对象中
* new ScalarHandler(columnIndex) 参数时列的索引
*/
Object
obj
=
query
.
query
(
conn
,
sql
,
new
ScalarHandler
(
2
)
)
;
System
.
out
.
println
(
"obj "
+
obj
)
;
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
(
)
;
}
finally
{
DbUtils
.
closeQuietly
(
conn
)
;
}
}
|
转载请注明:我要编程 » DButils使用详解