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: JdbcTemplate

1.1 query

单个对象

  1. /**
  2. * 处理单个对象
  3. */
  4. @Test
  5. public void test_1() {
  6. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  7. String sql = "select * from student where id=1";
  8.  
  9. Student student = jdbcTemplate.query(sql, new ResultSetExtractor<Student>() {
  10. @Override
  11. public Student extractData(ResultSet res) throws SQLException, DataAccessException {
  12. Student student = null;
  13. while (res.next()) {
  14. int id = res.getInt("id");
  15. String name = res.getString("name");
  16. boolean gender = res.getBoolean("gender");
  17. Date birthday = res.getDate("birthday");
  18. student = new Student(id, name, gender, birthday);
  19. }
  20. return student;
  21. }
  22. });
  23. System.out.println(student);
  24. }
  25. @Test
  26. public void test_2() {
  27. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  28. String sql = "select * from student where id=1";
  29. // 这里演示RowCallbackHandler 上面也可以使用函数式写法 不能返回
  30. jdbcTemplate.query(sql, (res)-> {
  31. String name = res.getString("name");
  32. System.out.println(name);
  33. });
  34. }
  35. @Test
  36. public void test_3() {
  37. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  38. String sql = "select * from student where id=1";
  39. Student stu = jdbcTemplate.query(sql, (res)->{
  40. Student student = null;
  41. while (res.next()) {
  42. int id = res.getInt("id");
  43. String name = res.getString("name");
  44. boolean gender = res.getBoolean("gender");
  45. Date birthday = res.getDate("birthday");
  46. student = new Student(id, name, gender, birthday);
  47. }
  48. return student;
  49. });
  50. System.out.println(stu);
  51. }
  52. //聚集函数
  53. @Test
  54. public void test_4() {
  55. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  56. String sql = "select count(*) from student";
  57. Integer inx = jdbcTemplate.queryForObject(sql, Integer.class);
  58. System.out.println(inx);
  59. }
  60.  
  61. @Test
  62. public void test_5() {
  63. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  64. String sql = "select id from student";
  65. List<Integer> list = jdbcTemplate.queryForList(sql, Integer.class);
  66. }

List Map

  1. /**
  2. * 处理单个对象
  3. */
  4. @Test
  5. public void test_1() {
  6. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  7. String sql = "select * from student where id=1";
  8.  
  9. Student student = jdbcTemplate.query(sql, new ResultSetExtractor<Student>() {
  10. @Override
  11. public Student extractData(ResultSet res) throws SQLException, DataAccessException {
  12. Student student = null;
  13. while (res.next()) {
  14. int id = res.getInt("id");
  15. String name = res.getString("name");
  16. boolean gender = res.getBoolean("gender");
  17. Date birthday = res.getDate("birthday");
  18. student = new Student(id, name, gender, birthday);
  19. }
  20. return student;
  21. }
  22. });
  23. System.out.println(student);
  24. }
  25. @Test
  26. public void test_2() {
  27. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  28. String sql = "select * from student where id=1";
  29. // 这里演示RowCallbackHandler 上面也可以使用函数式写法 不能返回
  30. jdbcTemplate.query(sql, (res)-> {
  31. String name = res.getString("name");
  32. System.out.println(name);
  33. });
  34. }
  35. @Test
  36. public void test_3() {
  37. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  38. String sql = "select * from student where id=1";
  39. Student stu = jdbcTemplate.query(sql, (res)->{
  40. Student student = null;
  41. while (res.next()) {
  42. int id = res.getInt("id");
  43. String name = res.getString("name");
  44. boolean gender = res.getBoolean("gender");
  45. Date birthday = res.getDate("birthday");
  46. student = new Student(id, name, gender, birthday);
  47. }
  48. return student;
  49. });
  50. System.out.println(stu);
  51. }
  52. //聚集函数
  53. @Test
  54. public void test_4() {
  55. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  56. String sql = "select count(*) from student";
  57. Integer inx = jdbcTemplate.queryForObject(sql, Integer.class);
  58. System.out.println(inx);
  59. }
  60.  
  61. @Test
  62. public void test_5() {
  63. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  64. String sql = "select id from student";
  65. List<Integer> list = jdbcTemplate.queryForList(sql, Integer.class);
  66. }

1.2 upadte  

  1. @Test
  2. public int insertUser(Student stu) {
  3. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  4. String sql = "insert into student values(null,?,?,?)";
  5. return jdbcTemplate.update(sql, new Object[] { stu.getName(), stu.isGender(), stu.getBirthday() });
  6. }
  7.  
  8. @Test
  9. public int delete(int id) {
  10. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  11. String sql = "delete from student where id=?";
  12. return jdbcTemplate.update(sql, 1);
  13. }

2:NamedParameterJdbcTemplate

  使用与JdbcTemplate 最大的区别就是 使用命名符号来代表占位符? 使SQl 容易理解  但是 代码量增加了,取舍在于个人

  1. @Test
  2. public void findById() {
  3. NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(JDBCUtils.getDataSource());
  4. String sql="select * FROM student where name like (:regxp)";
  5. /*
  6. * jdbctemplate 用?站位
  7. * NamedParameterJdbcTemplate : 使用:xxx 站位 通过hashmap 写入参数
  8. * map:
  9. * String:参数名称
  10. * Object:参数值
  11. */
  12. HashMap<String, Object> paMap = new HashMap<>();
  13. paMap.put("regxp", "%");
  14. BeanPropertyRowMapper<Student> rowMapper = new BeanPropertyRowMapper<>(Student.class);
  15. List<Student> list = template.query(sql,paMap, rowMapper);
  16. System.out.println(list);
  17. }
  18.  
  19. @Test
  20. public void insert_Stu() {
  21. NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(JDBCUtils.getDataSource());
  22. String sql="insert into student(name,gender,birthday) values(:name,:gender,:birthday)";
  23. HashMap<String, Object> paramMap = new HashMap<>();
  24. paramMap.put("name", "如来佛祖");
  25. paramMap.put("gender", "1");
  26. paramMap.put("birthday", "2019-2-2");
  27. if(template.update(sql, paramMap)>0) {
  28. System.out.println("true");
  29. }
  30. }

Spring提供JdbcTemplate&NamedParameterJdbcTemplate的更多相关文章

  1. spring3: 对JDBC的支持 之 Spring提供的其它帮助 SimpleJdbcInsert/SimpleJdbcCall/SqlUpdate/JdbcTemplate 生成主键/批量处理

    7.4  Spring提供的其它帮助 7.4.1  SimpleJdbc方式 Spring JDBC抽象框架提供SimpleJdbcInsert和SimpleJdbcCall类,这两个类通过利用JDB ...

  2. 开涛spring3(7.4) - 对JDBC的支持 之 7.4 Spring提供的其它帮助

    7.4  Spring提供的其它帮助 7.4.1  SimpleJdbc方式 Spring JDBC抽象框架提供SimpleJdbcInsert和SimpleJdbcCall类,这两个类通过利用JDB ...

  3. spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)

    Spring提供的JDBC框架负责管理资源和异常处理,从而可以简化开发者的JDBC代码.开发者只需要编写写入和读取数据库相关的代码即可. 正如在之前的小节中论述过的,Spring将数据库访问过程中的模 ...

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

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

  5. spring使用jdbcTemplate和jdbcdaosupport和namedparameter

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

  6. spring和jdbctemplate

    1.spring与jdbc整合应用 a.增删改 -获取connection -获取statement -设置sql中?参数 -执行sql操作 -释放connection b.查询 -获取connect ...

  7. Spring之JDBCTemplate学习

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

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

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

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

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

随机推荐

  1. ORA-00904:"WM_CONCAT":标识符无效

    原创 Oracle 作者:Root__Liu 时间:2019-11-21 18:49:27  514  0 今天客户现场业务甩给我一个报错让处理,ora-00904:"WM_CONCAT&q ...

  2. 【tf.keras】tensorflow datasets,tfds

    一些最常用的数据集如 MNIST.Fashion MNIST.cifar10/100 在 tf.keras.datasets 中就能找到,但对于其它也常用的数据集如 SVHN.Caltech101,t ...

  3. BZOJ2127/LG1646 happiness 新建点最小割

    问题描述 BZOJ2127 LG1646 题解 和文理分科差不多 收益最大 -> 损失最小 -> 最小割 分别新建点表示互相关系就行了 \(\mathrm{Code}\) #include ...

  4. Django信号机制相关解释与示例

    Django 信号# django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发 ...

  5. chrome 插件备份

  6. python访问kafka

    操作系统 : CentOS7.3.1611_x64 Python 版本 : 3.6.8 kafka 版本 : 2.3.1 本文记录python访问kafka的简单使用,是入门教程,高阶读者请直接忽略. ...

  7. ETCD:TLS

    原文地址:TLS etcd支持用于客户端到服务器以及对等方(服务器到服务器/集群)通信的自动TLS以及通过客户端证书的身份验证. 要启动并运行,首先要获得一个成员的CA证书和签名密钥对. 建议为集群中 ...

  8. Netty服务端Channel注册Selector及绑定服务器端口

    当服务端Channel 创建并且初始化完成之后,会将其注册到 selector,通过语句config().group().register(channel)进行注册工作,该方法最终调用 Abstrac ...

  9. Python中使用cutecharts实现简单的手绘风格的图表

    场景 效果 cutecharts的Github: https://github.com/chenjiandongx/cutecharts 注: 博客: https://blog.csdn.net/ba ...

  10. error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

    这个报错一般是因为你图像的路径写错了,找不到图像而导致的. 解决问题的朋友麻烦点个推荐呗!嘿嘿