
正文
Spring提供JdbcTemplate&NamedParameterJdbcTemplate
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
JdbcTemplate主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
JdbcTemplate类支持的回调类:
预编译语句及存储过程创建回调:用于根据JdbcTemplate提供的连接创建相应的语句;
PreparedStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的PreparedStatement;
CallableStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的CallableStatement;
预编译语句设值回调:用于给预编译语句相应参数设值;
PreparedStatementSetter:通过回调获取JdbcTemplate提供的PreparedStatement,由用户来对相应的预编译语句相应参数设值;
BatchPreparedStatementSetter:;类似于PreparedStatementSetter,但用于批处理,需要指定批处理大小;
自定义功能回调:提供给用户一个扩展点,用户可以在指定类型的扩展点执行任何数量需要的操作;
ConnectionCallback:通过回调获取JdbcTemplate提供的Connection,用户可在该Connection执行任何数量的操作;
StatementCallback:通过回调获取JdbcTemplate提供的Statement,用户可以在该Statement执行任何数量的操作;
PreparedStatementCallback:通过回调获取JdbcTemplate提供的PreparedStatement,用户可以在该PreparedStatement执行任何数量的操作;
CallableStatementCallback:通过回调获取JdbcTemplate提供的CallableStatement,用户可以在该CallableStatement执行任何数量的操作;
结果集处理回调:通过回调处理ResultSet或将ResultSet转换为需要的形式;
RowMapper:用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型。
RowCallbackHandler:用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可。
ResultSetExtractor:用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集;
1: JdbcTemplate1.1 query
单个对象
/**
* 处理单个对象
*/
@Test
public void test_1() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select * from student where id=1"; Student student = jdbcTemplate.query(sql, new ResultSetExtractor<Student>() {
@Override
public Student extractData(ResultSet res) throws SQLException, DataAccessException {
Student student = null;
while (res.next()) {
int id = res.getInt("id");
String name = res.getString("name");
boolean gender = res.getBoolean("gender");
Date birthday = res.getDate("birthday");
student = new Student(id, name, gender, birthday);
}
return student;
}
});
System.out.println(student);
}
@Test
public void test_2() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select * from student where id=1";
// 这里演示RowCallbackHandler 上面也可以使用函数式写法 不能返回
jdbcTemplate.query(sql, (res)-> {
String name = res.getString("name");
System.out.println(name);
});
}
@Test
public void test_3() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select * from student where id=1";
Student stu = jdbcTemplate.query(sql, (res)->{
Student student = null;
while (res.next()) {
int id = res.getInt("id");
String name = res.getString("name");
boolean gender = res.getBoolean("gender");
Date birthday = res.getDate("birthday");
student = new Student(id, name, gender, birthday);
}
return student;
});
System.out.println(stu);
}
//聚集函数
@Test
public void test_4() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select count(*) from student";
Integer inx = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(inx);
} @Test
public void test_5() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select id from student";
List<Integer> list = jdbcTemplate.queryForList(sql, Integer.class);
}
List Map
/**
* 处理单个对象
*/
@Test
public void test_1() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select * from student where id=1"; Student student = jdbcTemplate.query(sql, new ResultSetExtractor<Student>() {
@Override
public Student extractData(ResultSet res) throws SQLException, DataAccessException {
Student student = null;
while (res.next()) {
int id = res.getInt("id");
String name = res.getString("name");
boolean gender = res.getBoolean("gender");
Date birthday = res.getDate("birthday");
student = new Student(id, name, gender, birthday);
}
return student;
}
});
System.out.println(student);
}
@Test
public void test_2() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select * from student where id=1";
// 这里演示RowCallbackHandler 上面也可以使用函数式写法 不能返回
jdbcTemplate.query(sql, (res)-> {
String name = res.getString("name");
System.out.println(name);
});
}
@Test
public void test_3() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select * from student where id=1";
Student stu = jdbcTemplate.query(sql, (res)->{
Student student = null;
while (res.next()) {
int id = res.getInt("id");
String name = res.getString("name");
boolean gender = res.getBoolean("gender");
Date birthday = res.getDate("birthday");
student = new Student(id, name, gender, birthday);
}
return student;
});
System.out.println(stu);
}
//聚集函数
@Test
public void test_4() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select count(*) from student";
Integer inx = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(inx);
} @Test
public void test_5() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select id from student";
List<Integer> list = jdbcTemplate.queryForList(sql, Integer.class);
}
1.2 upadte
@Test
public int insertUser(Student stu) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "insert into student values(null,?,?,?)";
return jdbcTemplate.update(sql, new Object[] { stu.getName(), stu.isGender(), stu.getBirthday() });
} @Test
public int delete(int id) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "delete from student where id=?";
return jdbcTemplate.update(sql, 1);
}
2:NamedParameterJdbcTemplate
使用与JdbcTemplate 最大的区别就是 使用命名符号来代表占位符? 使SQl 容易理解 但是 代码量增加了,取舍在于个人
@Test
public void findById() {
NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(JDBCUtils.getDataSource());
String sql="select * FROM student where name like (:regxp)";
/*
* jdbctemplate 用?站位
* NamedParameterJdbcTemplate : 使用:xxx 站位 通过hashmap 写入参数
* map:
* String:参数名称
* Object:参数值
*/
HashMap<String, Object> paMap = new HashMap<>();
paMap.put("regxp", "%");
BeanPropertyRowMapper<Student> rowMapper = new BeanPropertyRowMapper<>(Student.class);
List<Student> list = template.query(sql,paMap, rowMapper);
System.out.println(list);
} @Test
public void insert_Stu() {
NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(JDBCUtils.getDataSource());
String sql="insert into student(name,gender,birthday) values(:name,:gender,:birthday)";
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("name", "如来佛祖");
paramMap.put("gender", "1");
paramMap.put("birthday", "2019-2-2");
if(template.update(sql, paramMap)>0) {
System.out.println("true");
}
}

Spring提供JdbcTemplate&NamedParameterJdbcTemplate的更多相关文章- spring3: 对JDBC的支持 之 Spring提供的其它帮助 SimpleJdbcInsert/SimpleJdbcCall/SqlUpdate/JdbcTemplate 生成主键/批量处理
7.4 Spring提供的其它帮助 7.4.1 SimpleJdbc方式 Spring JDBC抽象框架提供SimpleJdbcInsert和SimpleJdbcCall类,这两个类通过利用JDB ...
- 开涛spring3(7.4) - 对JDBC的支持 之 7.4 Spring提供的其它帮助
7.4 Spring提供的其它帮助 7.4.1 SimpleJdbc方式 Spring JDBC抽象框架提供SimpleJdbcInsert和SimpleJdbcCall类,这两个类通过利用JDB ...
- spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)
Spring提供的JDBC框架负责管理资源和异常处理,从而可以简化开发者的JDBC代码.开发者只需要编写写入和读取数据库相关的代码即可. 正如在之前的小节中论述过的,Spring将数据库访问过程中的模 ...
- Spring利用JDBCTemplate实现批量插入和返回id
1.先介绍一下java.sql.Connection接口提供的三个在执行插入语句后可取的自动生成的主键的方法: //第一个是 PreparedStatement prepareStatement(St ...
- spring使用jdbcTemplate和jdbcdaosupport和namedparameter
jdbcTemplate: 首先连接数据库 <!-- 导入外部文件 --> <context:property-placeholder location="classpat ...
- spring和jdbctemplate
1.spring与jdbc整合应用 a.增删改 -获取connection -获取statement -设置sql中?参数 -执行sql操作 -释放connection b.查询 -获取connect ...
- Spring之JDBCTemplate学习
一.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...
- spring+spring mvc+JdbcTemplate 入门小例子
大家使用这个入门时候 最好能够去 搜一下 spring mvc 的 原理,我放一张图到这里,自己琢磨下,后面去学习就容易了 给个链接 (网上一把,千万不能懒) https://www.cnblo ...
- spring 学习(四): spring 的 jdbcTemplate 操作
spring 学习(四): spring 的 jdbcTemplate 操作 spring 针对 javaee 的每一层,都提供了相应的解决技术,jdbcTemplate 的主要操作在 dao 层. ...
随机推荐- PHP中::、-&;gt;、self、$this操作符的区别
在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者 ...
- Oracle软件开发分析
软件开发的步骤可大致分为: 1.需求分析 2.系统设计 3.编码实现 4.系统测试 5.运行维护 student class 多对一 sno name age gender cid id c ...
- java 对象类型的转换
import com.java.charpt05.NewStr; class Quadrangle{ public static void draw(Quadrangle q) { ...
- 1045 整数礼物 c语言
描述 Na 给准备送给ZZ两个整数,a, b,他还计算了这两个整数的平均值c,碰巧c也是整数. 但是Na 突然把b给弄丢了,你要帮助Na通过a, c计算出来b的值. 输入 输入为一行,两个用空格隔开的 ...
- HeadFirst设计模式之命令模式
一. 1.因为是操作经常变化,所以封装操作为command对象.You can do that by introducing “command objects” into your design. A ...
- php composer 安装
- JavaScript 随机数相关算法
// Math.ceil() 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入 // Math.floor() 返回小于等于数字参数的最大整数,对数字进行下舍入 // Math.round ...
- day30 网络编程 之进程,线程,协程
进程点进去 线程点进去 协程点进去 什么是进程 进程(有时称为重量级进程)是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.同一个程序执行两次,属于是两个不 ...
- git自己用得着的命令
-----------随笔记记,给自己备份------------ 1.查看分支 查看当前分支:git branch 查看远程所有分支:git branch -r/git branch -a 2.切换 ...
- Java入门第二季第2章封装
什么是 Java 中的内部类 问:什么是内部类呢? 答:内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. 问:那为什么要将一个类定义在另一个类里 ...
7.4 Spring提供的其它帮助 7.4.1 SimpleJdbc方式 Spring JDBC抽象框架提供SimpleJdbcInsert和SimpleJdbcCall类,这两个类通过利用JDB ...
7.4 Spring提供的其它帮助 7.4.1 SimpleJdbc方式 Spring JDBC抽象框架提供SimpleJdbcInsert和SimpleJdbcCall类,这两个类通过利用JDB ...
Spring提供的JDBC框架负责管理资源和异常处理,从而可以简化开发者的JDBC代码.开发者只需要编写写入和读取数据库相关的代码即可. 正如在之前的小节中论述过的,Spring将数据库访问过程中的模 ...
1.先介绍一下java.sql.Connection接口提供的三个在执行插入语句后可取的自动生成的主键的方法: //第一个是 PreparedStatement prepareStatement(St ...
jdbcTemplate: 首先连接数据库 <!-- 导入外部文件 --> <context:property-placeholder location="classpat ...
1.spring与jdbc整合应用 a.增删改 -获取connection -获取statement -设置sql中?参数 -执行sql操作 -释放connection b.查询 -获取connect ...
一.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...
大家使用这个入门时候 最好能够去 搜一下 spring mvc 的 原理,我放一张图到这里,自己琢磨下,后面去学习就容易了 给个链接 (网上一把,千万不能懒) https://www.cnblo ...
spring 学习(四): spring 的 jdbcTemplate 操作 spring 针对 javaee 的每一层,都提供了相应的解决技术,jdbcTemplate 的主要操作在 dao 层. ...
- PHP中::、-&;gt;、self、$this操作符的区别
在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者 ...
- Oracle软件开发分析
软件开发的步骤可大致分为: 1.需求分析 2.系统设计 3.编码实现 4.系统测试 5.运行维护 student class 多对一 sno name age gender cid id c ...
- java 对象类型的转换
import com.java.charpt05.NewStr; class Quadrangle{ public static void draw(Quadrangle q) { ...
- 1045 整数礼物 c语言
描述 Na 给准备送给ZZ两个整数,a, b,他还计算了这两个整数的平均值c,碰巧c也是整数. 但是Na 突然把b给弄丢了,你要帮助Na通过a, c计算出来b的值. 输入 输入为一行,两个用空格隔开的 ...
- HeadFirst设计模式之命令模式
一. 1.因为是操作经常变化,所以封装操作为command对象.You can do that by introducing “command objects” into your design. A ...
- php composer 安装
- JavaScript 随机数相关算法
// Math.ceil() 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入 // Math.floor() 返回小于等于数字参数的最大整数,对数字进行下舍入 // Math.round ...
- day30 网络编程 之进程,线程,协程
进程点进去 线程点进去 协程点进去 什么是进程 进程(有时称为重量级进程)是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.同一个程序执行两次,属于是两个不 ...
- git自己用得着的命令
-----------随笔记记,给自己备份------------ 1.查看分支 查看当前分支:git branch 查看远程所有分支:git branch -r/git branch -a 2.切换 ...
- Java入门第二季第2章封装
什么是 Java 中的内部类 问:什么是内部类呢? 答:内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. 问:那为什么要将一个类定义在另一个类里 ...






