转载:http://1358440610-qq-com.iteye.com/blog/1826816

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

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

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

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

queryForInt :查询出一个整数值

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. EhCache注解 (转载)

    其实EhCache使用的就是Spring Cache的注解. 1.1 @Cacheable @Cacheable可以标记在一个方法上,也可以标记在一个类上.当标记在一个方法上时表示该方法是支持缓存的, ...

  2. Linux下多网卡绑定bond及模式介绍

    [介绍] 网卡bond一般主要用于网络吞吐量很大,以及对于网络稳定性要求较高的场景. 主要是通过将多个物理网卡绑定到一个逻辑网卡上,实现了本地网卡的冗余,带宽扩容以及负载均衡. Linux下一共有七种 ...

  3. Confluence迁移

    本次操作系统版本Centos7.3,Confluence版本5.9.9. 一.数据迁移 1.在旧Confluence上打包 “confluence和confluence-data”整个目录,默认安装的 ...

  4. 整理一下Apache与Tomcat的关系

    如果有对Apache与Tomcat认识比较的同学就要拿起小板凳听一下 关系一 Apache是web服务器,Tomcat是应用服务器,也就是java服务器,因为Apache只能支持静态网页,所以Apac ...

  5. MySQL metalock的一些技巧(写大于读的案例,以及获得锁的顺序)

    前言:元数据锁不是锁定数据,而是锁定描述数据的元数据信息.就像很多装修工人(工作线程)在室内(对象上)装修(操作),不能有其他工人(线程)把屋子拆了(表删除了). MySQL 为了数据一致性使用元数据 ...

  6. Python之Pandas库学习(二):数据读写

    1. I/O API工具 读取函数 写入函数 read_csv to_csv read_excel to_excel read_hdf to_hdf read_sql to_sql read_json ...

  7. Codeforces 758C:Unfair Poll(思维+模拟)

    http://codeforces.com/problemset/problem/758/C 题意:教室里有n列m排,老师上课点名从第一列第一排开始往后点,直到点到第一列第m排,就从第二列第一排开始点 ...

  8. django基础知识之后台管理Admin站点:

    Admin站点 通过使用startproject创建的项目模版中,默认Admin被启用 1.创建管理员的用户名和密码 python manage.py createsuperuser 然后按提示填写用 ...

  9. struts2入门Demo

    一.引入必要的jar包,所需jar包如下: 二.配置web.xml.主要目的是拦截请求 <?xml version="1.0" encoding="UTF-8&qu ...

  10. Maxon Cinema 4D Studio R20.026 中文破解版下载

    Maxon Cinema 4D Studio,是 Maxon 公司开发的一款专业三维工具包,如果你需要一个得力助手,轻松快速创建令人称赞的 3D 图形作品,那么这是你的最佳选择. 为何使用Cinema ...