Spring中jdbcTemplate的用法实例(一)

一、首先配置JdbcTemplate;

要使用Jdbctemplate 对象来完成jdbc 操作。通常情况下,有三种种方式得到JdbcTemplate 对象。
第一种方式:我们可以在自己定义的DAO 实现类中注入一个DataSource 引用来完 成JdbcTemplate 的实例化。也就是它是从外部“注入” DataSource 到DAO 中,然后 自己实例化JdbcTemplate,然后将DataSource 设置到JdbcTemplate 对象中。
第二种方式: 在 Spring 的 IoC 容器中配置一个 JdbcTemplate 的 bean,将 DataSource 注入进来,然后再把JdbcTemplate 注入到自定义DAO 中。
第三种方式: Spring 提供了 org.springframework.jdbc.core.support.JdbcDaoSupport 类 , 这 个 类 中 定 义 了 JdbcTemplate 属性,也定义了DataSource 属性,当设置DataSource 属性的时候,会创 建jdbcTemplate 的实例,所以我们自己编写的DAO 只需要继承JdbcDaoSupport 类, 然后注入DataSource 即可。提倡采用第三种方法。虽然下面的用法中采用了前两种方法

配置方法有3种:

1、

Java代码 收藏代码
  1. publicclassUserServiceImplimplementsUserService{
  2. privateJdbcTemplatejdbcTemplate;
  3. publicJdbcTemplategetJdbcTemplate(){
  4. returnjdbcTemplate;
  5. }
  6. //注入方法1
  7. publicvoidsetJdbcTemplate(JdbcTemplatejdbcTemplate){
  8. this.jdbcTemplate=jdbcTemplate;
  9. }
  10. //其它方法这里省略……
  11. }

spring配置文件为:

Xml代码 收藏代码
  1. <beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
  2. <propertyname="dataSource"ref="dataSource">
  3. </bean>
  4. <beanid="userService"class="com.hxzy.account.jdbcTemplate.UserServiceImpl">
  5. <propertyname="jdbcTemplate"ref="jdbcTemplate"/>
  6. </bean>

方法2、

Java代码 收藏代码
  1. publicclassUserServiceImplimplementsUserService{
  2. privateJdbcTemplatejdbcTemplate;
  3. //注入方法2
  4. publicvoidsetDataSource(DataSourcedataSource){
  5. this.jdbcTemplate=newJdbcTemplate(dataSource);
  6. }
  7. //其它方法省略……
  8. }

spring配置文件为:

Xml代码 收藏代码
  1. <beanid="userService"class="com.hxzy.account.jdbcTemplate.UserServiceImpl">
  2. <propertyname="dataSource"ref="dataSource"/>
  3. </bean>

方法3:继承JdbcDaoSupport,其内部有个JdbcTemplate ,需要注入DataSource 属性来实例化。

Java代码 收藏代码
  1. publicclassUserDaoImplextendsJdbcDaoSupportimplementsUserDao{
  2. @Override
  3. publicvoidsave(Useruser){
  4. Stringsql=null;
  5. this.getJdbcTemplate().update(sql);
  6. }
  7. //其它方法省略……
  8. }

spring配置文件:

Xml代码 收藏代码
  1. <beanid="userDao"class="com.hxzy.account.jdbcTemplate.UserDaoImpl">
  2. <propertyname="dataSource"ref="dataSource"/>
  3. </bean>

二、常用方法使用

【注意:】jdbcTemplate 中的sql均是用“?”做占位符的

domain User:

Java代码 收藏代码
  1. publicclassUser{
  2. privateintid;
  3. privateStringusername;
  4. privateStringpassword;
  5. privateStringsex;
  6. //setter和getter方法省略……
  7. }

UserServiceImpl :

如果采用第三种方式,则下面的用法中将方法中的 jdbcTemplate 换成 this.getJdbcTemplate()即可。

Java代码 收藏代码
  1. /**
  2. *创建表
  3. */
  4. publicvoidcreate(StringtableName){//tb_test1
  5. jdbcTemplate.execute("createtable"+tableName+"(idinteger,user_namevarchar2(40),passwordvarchar2(40))");
  6. }
  7. //jdbcTemplate.update适合于insert、update和delete操作;
  8. /**
  9. *第一个参数为执行sql
  10. *第二个参数为参数数据
  11. */
  12. publicvoidsave3(Useruser){
  13. Assert.isNull(user,"userisnotnull");
  14. jdbcTemplate.update("insertintotb_test1(name,password)values(?,?)",
  15. newObject[]{user.getUsername(),user.getPassword()});
  16. }
  17. /**
  18. *第一个参数为执行sql
  19. *第二个参数为参数数据
  20. *第三个参数为参数类型
  21. */
  22. @Override
  23. publicvoidsave(Useruser){
  24. Assert.isNull(user,"userisnotnull");
  25. jdbcTemplate.update(
  26. "insertintotb_test1(name,password)values(?,?)",
  27. newObject[]{user.getUsername(),user.getPassword()},
  28. newint[]{java.sql.Types.VARCHAR,java.sql.Types.VARCHAR}
  29. );
  30. }
  31. //避免sql注入
  32. publicvoidsave2(finalUseruser){
  33. Assert.isNull(user,"userisnotnull");
  34. jdbcTemplate.update("insertintotb_test1(name,password)values(?,?)",
  35. newPreparedStatementSetter(){
  36. @Override
  37. publicvoidsetValues(PreparedStatementps)throwsSQLException{
  38. ps.setString(1,user.getUsername());
  39. ps.setString(2,user.getPassword());
  40. }
  41. });
  42. }
  43. publicvoidsave4(Useruser){
  44. Assert.isNull(user,"userisnotnull");
  45. jdbcTemplate.update("insertintotb_test1(name,password)values(?,?)",
  46. newObject[]{user.getUsername(),user.getPassword()});
  47. }
  48. //返回插入的主键
  49. publicListsave5(finalUseruser){
  50. KeyHolderkeyHolder=newGeneratedKeyHolder();
  51. jdbcTemplate.update(newPreparedStatementCreator(){
  52. @Override
  53. publicPreparedStatementcreatePreparedStatement(Connectionconnection)throwsSQLException{
  54. PreparedStatementps=connection.prepareStatement("insertintotb_test1(name,password)values(?,?)",newString[]{"id"});
  55. ps.setString(1,user.getUsername());
  56. ps.setString(2,user.getPassword());
  57. returnps;
  58. }
  59. },
  60. keyHolder);
  61. returnkeyHolder.getKeyList();
  62. }
  63. @Override
  64. publicvoidupdate(finalUseruser){
  65. jdbcTemplate.update(
  66. "updatetb_test1setname=?,password=?whereid=?",
  67. newPreparedStatementSetter(){
  68. @Override
  69. publicvoidsetValues(PreparedStatementps)throwsSQLException{
  70. ps.setString(1,user.getUsername());
  71. ps.setString(2,user.getPassword());
  72. ps.setInt(3,user.getId());
  73. }
  74. }
  75. );
  76. }
  77. @Override
  78. publicvoiddelete(Useruser){
  79. Assert.isNull(user,"userisnotnull");
  80. jdbcTemplate.update(
  81. "deletefromtb_test1whereid=?",
  82. newObject[]{user.getId()},
  83. newint[]{java.sql.Types.INTEGER});
  84. }
  85. @Deprecated//因为没有查询条件,所以用处不大
  86. publicintqueryForInt1(){
  87. returnjdbcTemplate.queryForInt("selectcount(0)fromtb_test1");
  88. }
  89. publicintqueryForInt2(Useruser){
  90. returnjdbcTemplate.queryForInt("selectcount(0)fromtb_test1whereusername=?",
  91. newObject[]{user.getUsername()});
  92. }
  93. //最全的参数3个
  94. publicintqueryForInt3(Useruser){
  95. returnjdbcTemplate.queryForInt("selectcount(0)fromtb_test1whereusername=?",
  96. newObject[]{user.getUsername()},
  97. newint[]{java.sql.Types.VARCHAR});
  98. }
  99. //可以返回是一个基本类型的值
  100. @Deprecated//因为没有查询条件,所以用处不大
  101. publicStringqueryForObject1(Useruser){
  102. return(String)jdbcTemplate.queryForObject("selectusernamefromtb_test1whereid=100",
  103. String.class);
  104. }
  105. //可以返回值是一个对象
  106. @Deprecated//因为没有查询条件,所以用处不大
  107. publicUserqueryForObject2(Useruser){
  108. return(User)jdbcTemplate.queryForObject("select*fromtb_test1whereid=100",User.class);//class是结果数据的java类型
  109. }
  110. @Deprecated//因为没有查询条件,所以用处不大
  111. publicUserqueryForObject3(Useruser){
  112. return(User)jdbcTemplate.queryForObject("select*fromtb_test1whereid=100",
  113. newRowMapper(){
  114. @Override
  115. publicObjectmapRow(ResultSetrs,introwNum)throwsSQLException{
  116. Useruser=newUser();
  117. user.setId(rs.getInt("id"));
  118. user.setUsername(rs.getString("username"));
  119. user.setPassword(rs.getString("password"));
  120. returnuser;
  121. }
  122. }
  123. );
  124. }
  125. publicUserqueryForObject4(Useruser){
  126. return(User)jdbcTemplate.queryForObject("select*fromtb_test1whereid=?",
  127. newObject[]{user.getId()},
  128. User.class);//class是结果数据的java类型实际上这里是做反射,将查询的结果和User进行对应复制
  129. }
  130. publicUserqueryForObject5(Useruser){
  131. return(User)jdbcTemplate.queryForObject(
  132. "select*fromtb_test1whereid=?",
  133. newObject[]{user.getId()},
  134. newRowMapper(){
  135. @Override
  136. publicObjectmapRow(ResultSetrs,introwNum)throwsSQLException{
  137. Useruser=newUser();
  138. user.setId(rs.getInt("id"));
  139. user.setUsername(rs.getString("username"));
  140. user.setPassword(rs.getString("password"));
  141. returnuser;
  142. }
  143. });//class是结果数据的java类型
  144. }
  145. @Override
  146. publicUserqueryForObject(Useruser){
  147. //方法有返回值
  148. return(User)jdbcTemplate.queryForObject("select*fromtb_test1whereid=?",
  149. newObject[]{user.getId()},
  150. newint[]{java.sql.Types.INTEGER},
  151. newRowMapper(){
  152. @Override
  153. publicObjectmapRow(ResultSetrs,introwNum)throwsSQLException{
  154. Useruser=newUser();
  155. user.setId(rs.getInt("id"));
  156. user.setUsername(rs.getString("username"));
  157. user.setPassword(rs.getString("password"));
  158. returnuser;
  159. }
  160. }
  161. );
  162. }
  163. @SuppressWarnings("unchecked")
  164. publicList<User>queryForList1(Useruser){
  165. return(List<User>)jdbcTemplate.queryForList("select*fromtb_test1whereusername=?",
  166. newObject[]{user.getUsername()},
  167. User.class);
  168. }
  169. @SuppressWarnings("unchecked")
  170. publicList<String>queryForList2(Useruser){
  171. return(List<String>)jdbcTemplate.queryForList("selectusernamefromtb_test1wheresex=?",
  172. newObject[]{user.getSex()},
  173. String.class);
  174. }
  175. @SuppressWarnings("unchecked")
  176. //最全的参数查询
  177. publicList<User>queryForList3(Useruser){
  178. return(List<User>)jdbcTemplate.queryForList("select*fromtb_test1whereusername=?",
  179. newObject[]{user.getUsername()},
  180. newint[]{java.sql.Types.VARCHAR},
  181. User.class);
  182. }
  183. //通过RowCallbackHandler对Select语句得到的每行记录进行解析,并为其创建一个User数据对象。实现了手动的OR映射。
  184. publicUserqueryUserById4(Stringid){
  185. finalUseruser=newUser();
  186. //该方法返回值为void
  187. this.jdbcTemplate.query("select*fromtb_test1whereid=?",
  188. newObject[]{id},
  189. newRowCallbackHandler(){
  190. @Override
  191. publicvoidprocessRow(ResultSetrs)throwsSQLException{
  192. Useruser=newUser();
  193. user.setId(rs.getInt("id"));
  194. user.setUsername(rs.getString("username"));
  195. user.setPassword(rs.getString("password"));
  196. }
  197. });
  198. returnuser;
  199. }
  200. @SuppressWarnings("unchecked")
  201. @Override
  202. publicList<User>list(Useruser){
  203. returnjdbcTemplate.query("select*fromtb_test1whereusernamelike'%?%'",
  204. newObject[]{user.getUsername()},
  205. newint[]{java.sql.Types.VARCHAR},
  206. newRowMapper(){
  207. @Override
  208. publicObjectmapRow(ResultSetrs,introwNum)throwsSQLException{
  209. Useruser=newUser();
  210. user.setId(rs.getInt("id"));
  211. user.setUsername(rs.getString("username"));
  212. user.setPassword(rs.getString("password"));
  213. returnuser;
  214. }
  215. });
  216. }
  217. //批量操作适合于增、删、改操作
  218. publicint[]batchUpdate(finalListusers){
  219. int[]updateCounts=jdbcTemplate.batchUpdate(
  220. "updatetb_test1setusername=?,password=?whereid=?",
  221. newBatchPreparedStatementSetter(){
  222. @Override
  223. publicvoidsetValues(PreparedStatementps,inti)throwsSQLException{
  224. ps.setString(1,((User)users.get(i)).getUsername());
  225. ps.setString(2,((User)users.get(i)).getPassword());
  226. ps.setLong(3,((User)users.get(i)).getId());
  227. }
  228. @Override
  229. publicintgetBatchSize(){
  230. returnusers.size();
  231. }
  232. }
  233. );
  234. returnupdateCounts;
  235. }
  236. //调用存储过程
  237. publicvoidcallProcedure(intid){
  238. this.jdbcTemplate.update("callSUPPORT.REFRESH_USERS_SUMMARY(?)",newObject[]{Long.valueOf(id)});
  239. }

其中,batchUpdate适合于批量增、删、改操作;

update(…):使用于增、删、改操作;

execute():执行一个独立的sql语句,包括ddl语句;

queryForInt :查询出一个整数值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值