1、使用JdbcTemplate的execute()方法执行SQL语句

  1. jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");

2、如果是UPDATE或INSERT,可以用update()方法。

  1. jdbcTemplate.update("INSERT INTO USER VALUES('"
  2. + user.getId() + "', '"
  3. + user.getName() + "', '"
  4. + user.getSex() + "', '"
  5. + user.getAge() + "')");

3、带参数的更新

  1. jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});
  1. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});

4、使用JdbcTemplate进行查询时,使用queryForXXX()等方法

  1. int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");
  1. String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class);
  1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
  1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
  2. Iterator it = rows.iterator();
  3. while(it.hasNext()) {
  4. Map userMap = (Map) it.next();
  5. System.out.print(userMap.get("user_id") + "\t");
  6. System.out.print(userMap.get("name") + "\t");
  7. System.out.print(userMap.get("sex") + "\t");
  8. System.out.println(userMap.get("age") + "\t");
  9. }

JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。

    除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。

JDBC的PreparedStatement

  1. final String id = user.getId();
  2. final String name = user.getName();
  3. final String sex = user.getSex() + "";
  4. final int age = user.getAge();
  5. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",
  6. new PreparedStatementSetter() {
  7. public void setValues(PreparedStatement ps) throws SQLException {
  8. ps.setString(1, id);
  9. ps.setString(2, name);
  10. ps.setString(3, sex);
  11. ps.setInt(4, age);
  12. }
  13. });
  1. final User user = new User();
  2. jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",
  3. new Object[] {id},
  4. new RowCallbackHandler() {
  5. public void processRow(ResultSet rs) throws SQLException {
  6. user.setId(rs.getString("user_id"));
  7. user.setName(rs.getString("name"));
  8. user.setSex(rs.getString("sex").charAt(0));
  9. user.setAge(rs.getInt("age"));
  10. }
  11. });
  1. class UserRowMapper implements RowMapper {
  2. public Object mapRow(ResultSet rs, int index) throws SQLException {
  3. User user = new User();
  4. user.setId(rs.getString("user_id"));
  5. user.setName(rs.getString("name"));
  6. user.setSex(rs.getString("sex").charAt(0));
  7. user.setAge(rs.getInt("age"));
  8. return user;
  9. }
  10. }
  11. public List findAllByRowMapperResultReader() {
  12. String sql = "SELECT * FROM USER";
  13. return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));
  14. }

在getUser(id)里面使用UserRowMapper

  1. public User getUser(final String id) throws DataAccessException {
  2. String sql = "SELECT * FROM USER WHERE user_id=?";
  3. final Object[] params = new Object[] { id };
  4. List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));
  5. return (User) list.get(0);
  6. }

网上收集

org.springframework.jdbc.core.PreparedStatementCreator 返回预编译SQL   不能于Object[]一起用

  1. public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
  2. return con.prepareStatement(sql);
  3. }

1.增删改

org.springframework.jdbc.core.JdbcTemplate   类(必须指定数据源dataSource)

  1. template.update("insert into web_person values(?,?,?)",Object[]);

  1. template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ 匿名内部类 只能访问外部最终局部变量
  2. public void setValues(PreparedStatement ps) throws SQLException {
  3. ps.setInt(index++,3);
  4. });

org.springframework.jdbc.core.PreparedStatementSetter 接口 处理预编译SQL

  1. public void setValues(PreparedStatement ps) throws SQLException {
  2. ps.setInt(index++,3);
  3. }

2.查询JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler)

org.springframework.jdbc.core.RowMapper   记录映射接口  处理结果集

  1. public Object mapRow(ResultSet rs, int arg1) throws SQLException {   int表当前行数
  2. person.setId(rs.getInt("id"));
  3. }
  4. List template.query("select * from web_person where id=?",Object[],RowMapper);

org.springframework.jdbc.core.RowCallbackHandler  记录回调管理器接口 处理结果集

    1. template.query("select * from web_person where id=?",Object[],new RowCallbackHandler(){
    2. public void processRow(ResultSet rs) throws SQLException {
    3. person.setId(rs.getInt("id"));
    4. });

JdbcTemplate增删改查的更多相关文章

  1. Spring JdbcTemplate框架搭建及其增删改查使用指南

    Spring JdbcTemplate框架搭建及其增删改查使用指南 前言: 本文指在介绍spring框架中的JdbcTemplate类的使用方法,涉及基本的Spring反转控制的使用方法和JDBC的基 ...

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

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

  3. JdbcTemplate实现增删改查操作

    JdbcTemplate介绍 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架,Spring Boot Spring Data-JP ...

  4. SpringBoot2+Druid+JdbcTemplate+MySql实现增删改查

    1.配置pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  5. SpringMvc学习-增删改查

    本节主要介绍SpringMVC简单的增删改查功能. 1.查询 dao中的代码 public List<WeatherPojo> getAllWeather(){ String sql=&q ...

  6. 【java学习】spring mvc 公共dao的实现,定义基本的增删改查

    接口类: package com.blog.db.dao; import com.blog.util.Pagination; import java.util.List; public interfa ...

  7. springMVC实现增删改查

    首先需要准备好一张数据库表我这里用emp这张表:具体代码: /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.1.73-community ************* ...

  8. SpringMVC+SpringJdbc+SQLServer+EasyUI增删改查

    前言 前天用SpringJdbc连接了一把SQLServer,早上起来用SpringMVC+SpringJdbc+EasUI写了个增删改查的demo,主要是熟悉下SpringMVC相关知识点,如vie ...

  9. Rest架构下的增删改查

    首先还是要连接一下什么是Rest, REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP, ...

随机推荐

  1. POJ 3469 Dual Core CPU (最小割建模)

    题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ...

  2. dynamic_cast,const_cast,static_cast,reinterpret_cast 详解

    如果直接指针直接强转,将只能访问虚函数的内容,而不能访问特定类中的特定成员或方法!!!! 强制类型转换运算符:C++有四种强制类型转换符,分别是dynamic_cast,const_cast,stat ...

  3. HDU 5301 Buildings 建公寓(逻辑,水)

    题意:有一个包含n*m个格子的矩阵,其中有一个格子已经被染黑,现在要拿一些矩形来填充矩阵,不能填充到黑格子,但是每一个填充进去的矩形都必须至少有一条边紧贴在矩阵的边缘(4条边)的.用于填充的矩形其中最 ...

  4. Darwin Streaming Server 6.0.3安装、订制、插件或模块

    How to setup Darwin Streaming Server 6.0.3 on 32 or 64 bit Linux platforms, add custom functionality ...

  5. poj 3160 Father Christmas flymouse

    // 题目描述:从武汉大学ACM集训队退役后,flymouse 做起了志愿者,帮助集训队做一些琐碎的事情,比如打扫集训用的机房等等.当圣诞节来临时,flymouse打扮成圣诞老人给集训队员发放礼物.集 ...

  6. memcachedd基础

    系列文章导航: memcached完全剖析–1. memcached的基础 memcached全面剖析–2. 理解memcached的内存存储 memcached全面剖析–3. memcached的删 ...

  7. Android裁剪固定大小头像的功能

    转载自: http://www.eoeandroid.com/thread-497277-1-1.html 效果很好,特意转载过来记录一下,加深一下印象. 效果就是 :中间的方框不动,可以拖动图片,选 ...

  8. Android启动activity的4种模式(standard、singleTop、singleTask、singleINstance)

    在AndroidManifest.xml中配置activity时,android:launchMode属性会指定启动activity的模式,有四种: standard singleTop single ...

  9. 【转载】两个Web.config中连接字符串中特殊字符解决方案

    userid =  test password = aps'"; 那么连接字符串的写法为: Provider=SQLOLEDB.1;Password="aps'"&quo ...

  10. hdu 3518(后缀数组)

    题意:容易理解... 分析:这是我做的后缀数组第一题,做这个题只需要知道后缀数组中height数组代表的是什么就差不多会做了,height[i]表示排名第i的后缀与排名第i-1的后缀的最长公共前缀,然 ...