没有合适的资源?快使用搜索试试~ 我知道了~
Spring JDBCTemplate
需积分: 35 16 下载量 66 浏览量
2017-08-30
15:49:19
上传
评论
收藏 445KB DOC 举报
温馨提示
试读
27页
本篇文档主要介绍Spring JDBCTemplate知识。亦可作为Spring JDBCTemplate的API文档。文档中的内容,对于学习Spring JDBCTemplate有很大的帮助,也可帮助他人学习Spring Boot中的JDBCTemplate知识。
资源推荐
资源详情
资源评论
Spring JdbcTemplate
JdbcTemplate 的 API 明显地分割为几个部分:
1. Query
用于从数据库查询数据。该部分的 API 具有 queryForXXX 形式,或 query 方法。每个
方法均有 3-6 个重载版本,query()方法甚至有 16 个重载版本。具体来说,Query 部分
的 API 有:queryForInt, queryForList, queryForLong, queryForMap, queryForObject,
queryForRowSet 以及 query 方法。
queryForInt、queryForLong
queryForInt 和 queryForLong 这两个方法非常相似,只是它们的返回值上存在差
异。以 queryForLong 为例:
queryForLong
queryForLong
queryForLong
其中,sql 为需要执行的 SQL 语句,args 对应了 sql 中的参数,argTypes 则是对应 sql
中各个参数的类型。值得注意的是,这些方法要求数据库的返回值只能为一个 1 行 1 列的
long 型 数 据 ( 超 过 或 者 SQL 查 询 语 句 没 有 相 应 返 回 ) , 否 则 将 抛 出
IncorrectResultSizeDataAccessException 异常。
示例 1:查询 customer 表中的用户数
publiclong
returnthis !"#!#$%& '(
")
*
示例 2:查询 customer 表中名字含有 in 的用户数
publiclong+
returnthis !
"#!#$%& '(,-#'#
!./#0"
new"11"*)
*
在后台的数据库中,name 字段被声明为 VARCHAR(10)。因此,这条语句相当于:
returnthis !
"#!#$%& '(,-#'#!./#0"
new"11"*
newintVARCHAR*)
如果错误地指定了相应字段的类型,将可能导致异常。例如这里将 23'-3' 错误
地指定为 4.%#5#'将招致如下异常:
org.springframework.jdbc.UncategorizedSQLException6
78) 9 :!#; < :! #!#
$%& '( ,-#'# !./# 0) :! =>>>)
>) 4 4 :!
4% #;? 6"11");
4:!#;644:!
4% #;? 6"11"
java.sql.SQLException6 4 4 :!
4% #;? 6"11"
可以看到,由于无法将11转换为 .%#5#',程序出现了异常。
queryForObject
queryForObject 函数共有 6 个重载版本:
queryForObject@@
queryForObject@@@
queryForObject@ @ @
@
queryForObject@@@'A(@A(
queryForObject@@'A(@A(
queryForObject@'A(@A(
这 6 个 API 又 明 显 地 分 为 两 个 部 分 : 前 3 个 为 一 部 分 , 后 3 个 为 一 部 分 。 参 数
sql,args,argsType 的含义与前面介绍的一致。参数 requiredType 表明了相应函数的返
回值类型。对于该参数来说是实际上是有限制的,比如它不能被设定为自定义类型,例如
这里的 Customer 类。如果你需要将返回值设定为自定义类型,你需要使用后 3 个 API 来
完成。RowMapper 接口的功能就是将结果集中的某行转换为一个 Object。
与 queryForInt/queryForLong 一样,前 3 个 API 都被期望返回一个 1 行 1 列的数据,该
行数据就是结果数据(直接为结果),否则会抛出异常。因而,参数 requiredType 的值必须
是一个对应数据库中的表字段对应的 Java 类型。例如:MySQL 数据库中的 VARCHAR 类
型对应着 java.lang.String, BIGINT 对应着 java.lang.Long 等等。对于后 3 个 API,由于使
用的策略是将结果集中的某一行转换为一个 Object,这要求返回结果须为单一的一行(不限
列的数量),否则会抛出异常。
示例 1:获取 id 为 1 的用户的姓名
public%
returnthis
"#!# '(,-#'#B0"
new!valueOf=!*
newintINTEGER*
class)
*
如果在上面的程序中,将 id 的值从 1(数据库中存在对应记录)该为-1(数据库中不存在
相应的记录),那么程序将会抛出异常:
org.springframework.dao.IncorrectResultSizeDataAccessException
如果你不期望如此,可以使用后面要介绍的 queryForList 来解决这个问题。
示例 2:获取 id 为 1 的用户的性别
public55
returnCthis
"#!# '(,-#'#B="
CclassBB>05FEMALE65MALE)
*
由于数据库中 customer 表的 gender 列被创建为 tinyint(1) default '1',因此我们可以使用
Short 类来处理。当然,这里还可以用 Integer 来替代 Short:
return.this
"#!# '(,-#'#B="
.classBB>05FEMALE6
5MALE)
这也不会带来任何错误。甚至我们还可以使用 queryForInt/queryForLong 来实现:
returnthis .
"#!# '(,-#'#B="BB>0
5FEMALE
65MALE)
示例 3:获取 id 为 1 的用户对象
public
returnthis
"#!#C '(,-#'#
B0"
new!valueOf=!*
new'A(
public'A'int;throws:!#;
Bnew)DD构造对象
.."")
%"")
5C""BBshort>0
5FEMALE65MALE)
7C%"C")
return)
*)
*
RowMapper 很简单,不是吗?
注意:使用 queryForObject 方法的时候,需要特别注意。你可能期望对于你的查询,如果
数据库中没有对应的记录返回 null 就好。但是,JdbcTemplate 并非如此,它会抛出异常。
queryForList
方法 queryForList 一共有 6 个重载版本:
!queryForList@
!queryForList@@
!queryForList@@
!queryForList@@@
!queryForList@@@
! queryForList@ @ @
@
参数 sql, args, argTypes 的含义和前面的含义相同,elementType 是返回值的每一个元
素的类型。对于 elementType 的取值与前面的 requiredType 是相同的。如果不指定的话,
返回值将会被设定为一个 a list of maps,即返回值中的每个元素都是一个 map 对象 。该
map 中的 entry 的 key 为查询中的字段名,value 为该字段下的值。
示例 1:获取所有所有用户名
E,"C8"
public!FG%
returnthis !"#!# '("
class)
*
示例 2:获取所有男性的 ID,姓名和手机号
E,"C8"
public!F!(G.<
returnthis !
"#!#C '(,-#'#
B=")
*
可以看到 queryForList 方法并没有指定 elementType 参数,因此 Spring 默认地赋值给它为
ListOrderedMap,这就是前面提到的 map。如果将这个结果打印出来的话,其输出为:
B= B, H CB=IJK>=LMLII* B+ B, N
CB=IJK>=LMLIK*
根据当前数据库的内容,该 List 中包含两份数据,该输出证实了这一点。
示例 3:获取名字为 Lucky 的用户的手机号
E,"C8"
public!F!(G!8C
returnthis !
"#!#C '(,-#'#B0"
new"!8"*)
*
该段程序逻辑上并不复杂。但是有两点需要说明:
1). 当前数据库中并不存在名字为 Lucky 的用户,但是,与 queryForObject 不同的是,程
序并不会抛出异常。相反,程序返回的是一个 size 为 0 的 List。
2). 尽管在逻辑上,返回的 List 中的每一个元素都应该是一个 String 对象,换句话说,返回
的 List 应该是 List<String>。但是由于我们没有显示地指定 elementType 参数,Spring 会
按 照 默 认 的 情 况 进 行 处 理 , 即 视 返 回 值 为 a list of maps 。 从 而 , 返 回 值 为
List<ListOrderedMap>类型。
另一方面,Spring 似乎提供了”特别的支持”。对于示例 3 给定的例子,我们可以直接将返
回值的类型标记为 List<String>, Spring 也不会有丝毫的抱怨,照样给出期望的结果。例
如,我们获取名字为 Wang Jin 的用户的 id(从数据库中可以看到其值为 1):
E,"C8"
public!F!G,.
returnthis !"#!# '(,-#'#
B0"
new",H"*)
*
剩余26页未读,继续阅读
资源评论
_明月
- 粉丝: 8752
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功