一、首先配置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、

  1. public class UserServiceImpl implements UserService {
  2. private JdbcTemplate jdbcTemplate;
  3. public JdbcTemplate getJdbcTemplate() {
  4. return jdbcTemplate;
  5. }
  6. //注入方法1
  7. public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  8. this.jdbcTemplate = jdbcTemplate;
  9. }
  10. //其它方法这里省略……
  11. }

spring配置文件为:

  1. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  2. <property name = "dataSource" ref="dataSource">
  3. </bean>
  4. <bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">
  5. <property name="jdbcTemplate" ref="jdbcTemplate"/>
  6. </bean>

方法2、

  1. public class UserServiceImpl implements UserService {
  2. private JdbcTemplate jdbcTemplate;
  3. //注入方法2
  4. public void setDataSource(DataSource dataSource) {
  5. this.jdbcTemplate = new JdbcTemplate(dataSource);
  6. }
  7. //其它方法省略……
  8. }

spring配置文件为:

  1. <bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">
  2. <property name="dataSource" ref="dataSource"/>
  3. </bean>

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

  1. public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
  2. @Override
  3. public void save(User user) {
  4. String sql = null;
  5. this.getJdbcTemplate().update(sql);
  6. }
  7. //其它方法省略……
  8. }

spring配置文件:

  1. <bean id="userDao" class="com.hxzy.account.jdbcTemplate.UserDaoImpl">
  2. <property name="dataSource" ref="dataSource"/>
  3. </bean>

二、常用方法使用

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

domain User:

  1. public class User {
  2. private int id;
  3. private String username;
  4. private String password;
  5. private String sex;
  6. //setter和getter方法省略……
  7. }

UserServiceImpl :

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

    1. /**
    2. * 创建表
    3. */
    4. public void create(String tableName){ //tb_test1
    5. jdbcTemplate.execute("create table "+tableName +" (id integer,user_name varchar2(40),password varchar2(40))");
    6. }
    7. //jdbcTemplate.update适合于insert 、update和delete操作;
    8. /**
    9. * 第一个参数为执行sql
    10. * 第二个参数为参数数据
    11. */
    12. public void save3(User user) {
    13. Assert.isNull(user, "user is not null");
    14. jdbcTemplate.update("insert into tb_test1(name,password) values(?,?)",
    15. new Object[]{user.getUsername(),user.getPassword()});
    16. }
    17. /**
    18. * 第一个参数为执行sql
    19. * 第二个参数为参数数据
    20. * 第三个参数为参数类型
    21. */
    22. @Override
    23. public void save(User user) {
    24. Assert.isNull(user, "user is not null");
    25. jdbcTemplate.update(
    26. "insert into tb_test1(name,password) values(?,?)",
    27. new Object[]{user.getUsername(),user.getPassword()},
    28. new int[]{java.sql.Types.VARCHAR,java.sql.Types.VARCHAR}
    29. );
    30. }
    31. //避免sql注入
    32. public void save2(final User user) {
    33. Assert.isNull(user, "user is not null");
    34. jdbcTemplate.update("insert into tb_test1(name,password) values(?,?)",
    35. new PreparedStatementSetter(){
    36. @Override
    37. public void setValues(PreparedStatement ps) throws SQLException {
    38. ps.setString(1, user.getUsername());
    39. ps.setString(2, user.getPassword());
    40. }
    41. });
    42. }
    43. public void save4(User user) {
    44. Assert.isNull(user, "user is not null");
    45. jdbcTemplate.update("insert into tb_test1(name,password) values(?,?)",
    46. new Object[]{user.getUsername(),user.getPassword()});
    47. }
    48. //返回插入的主键
    49. public List save5(final User user) {
    50. KeyHolder keyHolder = new GeneratedKeyHolder();
    51. jdbcTemplate.update(new PreparedStatementCreator() {
    52. @Override
    53. public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
    54. PreparedStatement ps = connection.prepareStatement("insert into tb_test1(name,password) values(?,?)", new String[] {"id"});
    55. ps.setString(1, user.getUsername());
    56. ps.setString(2, user.getPassword());
    57. return ps;
    58. }
    59. },
    60. keyHolder);
    61. return keyHolder.getKeyList();
    62. }
    63. @Override
    64. public void update(final User user) {
    65. jdbcTemplate.update(
    66. "update tb_test1 set name=?,password=? where id = ?",
    67. new PreparedStatementSetter(){
    68. @Override
    69. public void setValues(PreparedStatement ps) throws SQLException {
    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. public void delete(User user) {
    79. Assert.isNull(user, "user is not null");
    80. jdbcTemplate.update(
    81. "delete from tb_test1 where id = ?",
    82. new Object[]{user.getId()},
    83. new int[]{java.sql.Types.INTEGER});
    84. }
    85. @Deprecated //因为没有查询条件,所以用处不大
    86. public int queryForInt1(){
    87. return jdbcTemplate.queryForInt("select count(0) from tb_test1");
    88. }
    89. public int queryForInt2(User user){
    90. return jdbcTemplate.queryForInt("select count(0) from tb_test1 where username = ?" ,
    91. new Object[]{user.getUsername()});
    92. }
    93. //最全的参数3个
    94. public int queryForInt3(User user){
    95. return jdbcTemplate.queryForInt("select count(0) from tb_test1 where username = ?" ,
    96. new Object[]{user.getUsername()},
    97. new int[]{java.sql.Types.VARCHAR});
    98. }
    99. //可以返回是一个基本类型的值
    100. @Deprecated  //因为没有查询条件,所以用处不大
    101. public String queryForObject1(User user) {
    102. return (String) jdbcTemplate.queryForObject("select username from tb_test1 where id = 100",
    103. String.class);
    104. }
    105. //可以返回值是一个对象
    106. @Deprecated //因为没有查询条件,所以用处不大
    107. public User queryForObject2(User user) {
    108. return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100", User.class); //class是结果数据的java类型
    109. }
    110. @Deprecated //因为没有查询条件,所以用处不大
    111. public User queryForObject3(User user) {
    112. return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100",
    113. new RowMapper(){
    114. @Override
    115. public Object mapRow(ResultSet rs, int rowNum)throws SQLException {
    116. User user  = new User();
    117. user.setId(rs.getInt("id"));
    118. user.setUsername(rs.getString("username"));
    119. user.setPassword(rs.getString("password"));
    120. return user;
    121. }
    122. }
    123. );
    124. }
    125. public User queryForObject4(User user) {
    126. return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = ?",
    127. new Object[]{user.getId()},
    128. User.class); //class是结果数据的java类型  实际上这里是做反射,将查询的结果和User进行对应复制
    129. }
    130. public User queryForObject5(User user) {
    131. return (User) jdbcTemplate.queryForObject(
    132. "select * from tb_test1 where id = ?",
    133. new Object[]{user.getId()},
    134. new RowMapper(){
    135. @Override
    136. public Object mapRow(ResultSet rs,int rowNum)throws SQLException {
    137. User user  = new User();
    138. user.setId(rs.getInt("id"));
    139. user.setUsername(rs.getString("username"));
    140. user.setPassword(rs.getString("password"));
    141. return user;
    142. }
    143. }); //class是结果数据的java类型
    144. }
    145. @Override
    146. public User queryForObject(User user) {
    147. //方法有返回值
    148. return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = ?",
    149. new Object[]{user.getId()},
    150. new int[]{java.sql.Types.INTEGER},
    151. new RowMapper() {
    152. @Override
    153. public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    154. User user  = new User();
    155. user.setId(rs.getInt("id"));
    156. user.setUsername(rs.getString("username"));
    157. user.setPassword(rs.getString("password"));
    158. return user;
    159. }
    160. }
    161. );
    162. }
    163. @SuppressWarnings("unchecked")
    164. public List<User> queryForList1(User user) {
    165. return (List<User>) jdbcTemplate.queryForList("select * from tb_test1 where username = ?",
    166. new Object[]{user.getUsername()},
    167. User.class);
    168. }
    169. @SuppressWarnings("unchecked")
    170. public List<String> queryForList2(User user) {
    171. return (List<String>) jdbcTemplate.queryForList("select username from tb_test1 where sex = ?",
    172. new Object[]{user.getSex()},
    173. String.class);
    174. }
    175. @SuppressWarnings("unchecked")
    176. //最全的参数查询
    177. public List<User> queryForList3(User user) {
    178. return (List<User>) jdbcTemplate.queryForList("select * from tb_test1 where username = ?",
    179. new Object[]{user.getUsername()},
    180. new int[]{java.sql.Types.VARCHAR},
    181. User.class);
    182. }
    183. //通过RowCallbackHandler对Select语句得到的每行记录进行解析,并为其创建一个User数据对象。实现了手动的OR映射。
    184. public User queryUserById4(String id){
    185. final User user  = new User();
    186. //该方法返回值为void
    187. this.jdbcTemplate.query("select * from tb_test1 where id = ?",
    188. new Object[] { id },
    189. new RowCallbackHandler() {
    190. @Override
    191. public void processRow(ResultSet rs) throws SQLException {
    192. User user  = new User();
    193. user.setId(rs.getInt("id"));
    194. user.setUsername(rs.getString("username"));
    195. user.setPassword(rs.getString("password"));
    196. }
    197. });
    198. return user;
    199. }
    200. @SuppressWarnings("unchecked")
    201. @Override
    202. public List<User> list(User user) {
    203. return jdbcTemplate.query("select * from tb_test1 where username like '%?%'",
    204. new Object[]{user.getUsername()},
    205. new int[]{java.sql.Types.VARCHAR},
    206. new RowMapper(){
    207. @Override
    208. public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    209. User user  = new User();
    210. user.setId(rs.getInt("id"));
    211. user.setUsername(rs.getString("username"));
    212. user.setPassword(rs.getString("password"));
    213. return user;
    214. }
    215. });
    216. }
    217. //批量操作    适合于增、删、改操作
    218. public int[] batchUpdate(final List users) {
    219. int[] updateCounts = jdbcTemplate.batchUpdate(
    220. "update tb_test1 set username = ?, password = ? where id = ?",
    221. new BatchPreparedStatementSetter() {
    222. @Override
    223. public void setValues(PreparedStatement ps, int i) throws SQLException {
    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. public int getBatchSize() {
    230. return users.size();
    231. }
    232. }
    233. );
    234. return updateCounts;
    235. }
    236. //调用存储过程
    237. public void callProcedure(int id){
    238. this.jdbcTemplate.update("call SUPPORT.REFRESH_USERS_SUMMARY(?)", new Object[]{Long.valueOf(id)});
    239. }

spring的JdbcTemplate的更多相关文章

  1. Spring利用JDBCTemplate实现批量插入和返回id

    1.先介绍一下java.sql.Connection接口提供的三个在执行插入语句后可取的自动生成的主键的方法: //第一个是 PreparedStatement prepareStatement(St ...

  2. Spring 中jdbcTemplate 实现执行多条sql语句

    说一下Spring框架中使用jdbcTemplate实现多条sql语句的执行: 很多情况下我们需要处理一件事情的时候需要对多个表执行多个sql语句,比如淘宝下单时,我们确认付款时要对自己银行账户的表里 ...

  3. spring使用jdbcTemplate和jdbcdaosupport和namedparameter

    jdbcTemplate: 首先连接数据库 <!-- 导入外部文件 --> <context:property-placeholder location="classpat ...

  4. Spring之JDBCTemplate学习

    一.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...

  5. spring+spring mvc+JdbcTemplate 入门小例子

    大家使用这个入门时候 最好能够去 搜一下 spring mvc 的 原理,我放一张图到这里,自己琢磨下,后面去学习就容易了 给个链接 (网上一把,千万不能懒)    https://www.cnblo ...

  6. spring 学习(四): spring 的 jdbcTemplate 操作

    spring 学习(四): spring 的 jdbcTemplate 操作 spring 针对 javaee 的每一层,都提供了相应的解决技术,jdbcTemplate 的主要操作在 dao 层. ...

  7. Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法

    以User为操作对象 package com.swift.jdbc; public class User { private Long user_id; private String user_cod ...

  8. spring学习(四)spring的jdbcTemplate(增删改查封装)

    Spring的jdbcTemplate操作 1.Spring框架一站式框架 (1)针对javaee三层,每一层都有解决技术 (2)到dao 层,使用 jdbcTemplate 2.Spring对不同的 ...

  9. Spring:JdbcTemplate使用指南

    Spring:JdbcTemplate使用指南 Spring:JdbcTemplate使用指南 前言: 本文指在介绍Spring框架中的JdbcTemplate类的使用方法,涉及基本的Spring反转 ...

  10. Spring中JdbcTemplate的基础用法

    Spring中JdbcTemplate的基础用法 1.在DAO中使用JdbcTemplate 一般都是在DAO类中使用JdbcTimplate,在XML配置文件中配置好后,可以在DAO中注入即可. 在 ...

随机推荐

  1. Ubuntu终端命令行缩短显示路径

    平时我们使用linux终端命令行的时候,常常会被一个问题困扰,那就是文件路径过长, 有时候甚至超过了一行,这样看起来非常别扭,其实只要两步就可以解决这个问题: 1,修改.bashrc文件(用户根目录下 ...

  2. js和java中URI的编码和解码

    js中对文字进行编码主要有三个函数:escape,encodeURI,encodeURIComponent: 对应解码为:unescape,decodeURI,decodeURIComponent 这 ...

  3. 取得Linux系统的各种统计信息

    本文基于Linux 2.6.x内核 一.取得CPU信息(相关文件/proc/stat) 在一个系统中的/proct/stat文件内容如下 $ cat /proc/stat cpu 1039426 17 ...

  4. 《黑白团团队》第七次作业:团队项目设计完善&编码

    项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 任务1:团队软件项目设计完善 Github仓库上传<软件设计方案说明书 ...

  5. 【XSY2384】【GDOI2017】微信

    致去年的我:这是道广义SAM模板题啊…… 题意: Description Input Output HINT $1\leq N\leq 20$,$1\leq Q\leq 10^5$,字符串总长$\le ...

  6. https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflection

    https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflectio ...

  7. C#中的string驻留池

    刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: String s1 = "He ...

  8. 使用 python 读写中文json

    读写中文json )   输出中文的json. 通过使用 ensure_ascii=False,输出原有的语言文字.indent參数是缩进数量. 更改写文件格式 将上一步导出的 string 直接写文 ...

  9. 串口通讯 ADC0804 数码管

    #include<reg52.h> #include<stdio.h> #include<intrins.h> #define uchar unsigned cha ...

  10. 【手势交互】6. 微动VID

    中国 天津 http://www.sharpnow.com/ 微动VID是天津锋时互动科技有限公司开发的中国Leap Motion. 它能够识别并跟踪用户手部的姿态.包含:指尖和掌心的三维空间位置:手 ...