我们开发DAO层时用的最多的就是ORM框架(Mybatis,hibernate)了。在有些特殊的情况下,ORM框架的搭建略显笨重,这时最好的选择就是Spring中的jdbcTemplate了。本文对jdbcTemplate进行详解,并且会对具名参数namedParameterJdbcTemplate进行讲解。


jdbcTemplate讲解

jdbcTemplate提供的主要方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
  • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
  • query方法及queryForXXX方法:用于执行查询相关语句;
  • call方法:用于执行存储过程、函数相关语句。

jdbcTemplate环境搭建:

1 在spring配置文件中加上jdbcTemplate的bean:

    <!--注入jdbcTemplate--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>

注意:在这之前我们需要先配置好数据库数据源dateSource。
2.在使用jdbcTemplate类中使用@Autowired进行注入

    @Autowiredprivate JdbcTemplate jdbcTemplate;

jdbcTemplate方法测试:

我们准备一个数据库

准备数据库对应的实体pojo,实体的名称都要对应数据库的字段名称:

public class User {private Long id;private String username;private String password;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

1.查询单个对象queryForObject:

    @Testpublic void testQuery(){String sql = "select id,username,password from user where id=?";BeanPropertyRowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);User user = jdbcTemplate.queryForObject(sql, rowMapper,1);System.out.println(user);}

输出结果: User{id=1, username='123', password='123'}
2.查询多个对象query:

    @Testpublic void testMutiQuery(){String sql = "select id,username,password from user";BeanPropertyRowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);List<User> users = jdbcTemplate.query(sql, rowMapper);for (User user : users) {System.out.println(user);}}

输出结果:
User{id=1, username='123', password='123'}
User{id=2, username='1234', password='1234'}
3.查询count、avg、sum等函数返回唯一值:

    @Testpublic void testCountQuery(){String sql = "select count(*) from user";BeanPropertyRowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);Integer result = jdbcTemplate.queryForObject(sql, Integer.class);System.out.println(result);}

输出结果:2
4.增删改方法测试:
新增:

    @Testpublic void testCreate(){String sql = "insert into user (username,password) values (?,?)";int create = jdbcTemplate.update(sql, new Object[]{255, 255});System.out.println(create);}

输出结果为1,去数据库查看也确实插入这条。

修改:

    @Testpublic void testUpdate(){String sql = "update user set username=? , password=? where id=?";int update = jdbcTemplate.update(sql, new Object[]{256, 256,3});System.out.println(update);}

输出结果为1,并且确实数据已经修改
删除:

    @Testpublic void testDelete(){String sql = "delete from user where id=?";int delete = jdbcTemplate.update(sql, new Object[]{3});System.out.println(delete);}

5.批量操作:

    @Testpublic void testBatch(){List<Object[]> batchArgs=new ArrayList<Object[]>();batchArgs.add(new Object[]{777,888});batchArgs.add(new Object[]{666,888});batchArgs.add(new Object[]{555,888});String sql = "insert into user (username,password) values (?,?)";jdbcTemplate.batchUpdate(sql, batchArgs);}

以上方法基本满足了日常我们多DAO层进行的操作,不过当你进行CRUD操作时如果传入的参数不确定,这时候你可能会想起ORM框架的便利。没关系!Spring也为我们提供了这样的操作NamedParameterJdbcTemplate。

NamedParameterJdbcTemplate讲解

在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定.
在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter).
那么什么是具名参数?
具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
具名参数只在 NamedParameterJdbcTemplate 中得到支持。NamedParameterJdbcTemplate可以使用全部jdbcTemplate方法,除此之外,我们来看看使用它的具名参数案例:
具名新增:

    @Testpublic void testNamedParameter(){String sql = "insert into user (username,password) values (:username,:password)";User u = new User();u.setUsername("555");SqlParameterSource sqlParameterSource=new BeanPropertySqlParameterSource(u);namedParameterJdbcTemplate.update(sql,sqlParameterSource);}

我们来看看结果

这样我们就可以根据pojo类的属性值使用JDBC来操作数据库了。
获取新增的主键:
NamedParameterJdbcTemplate还新增了KeyHolder类,使用它我们可以获得主键,类似Mybatis中的useGeneratedKeys。

   @Testpublic void testKeyHolder(){String sql = "insert into user (username,password) values (:username,:password)";User u = new User();u.setUsername("555");SqlParameterSource sqlParameterSource=new BeanPropertySqlParameterSource(u);KeyHolder keyHolder = new GeneratedKeyHolder();namedParameterJdbcTemplate.update(sql, sqlParameterSource, keyHolder);int k = keyHolder.getKey().intValue();System.out.println(k);}

输出结果就是新增的主键。

参考资料

  • Spring JdbcTemplate详解
  • Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数
  • 使用Spring的NamedParameterJdbcTemplate完成DAO操作

本文作者: catalinaLi
本文链接: http://catalinali.top/2017/us...
版权声明: 原创文章,有问题请评论中留言。非商业转载请注明作者及出处。

详解jdbcTemplate和namedParameterJdbcTemplate相关推荐

  1. JdbcTemplate详解 - 2

    JdbcTemplate详解 - 2 http://tianya23.blog.51cto.com/1081650/275292 1.由于之前JdbcTemplate的程序需要编写一堆的RowMapp ...

  2. Spring JdbcTemplate方法详解

    2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...

  3. Spring JDBC详解

    <Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...

  4. Spring+SpringMVC+Mybatis SSM框架详解

    一.JDBC编程 1.JDBC 简介 JDBC其实就是 Java 官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接. 程序运行的时候,数据都是在内存中的.当程序终止的时候,通 ...

  5. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  6. spring框架使用Quartz执行定时任务实例详解

    版权声明:本文为博主原创文章,如需转载,请标明出处. https://blog.csdn.net/alan_liuyue/article/details/80382324 Quartz简介 1.Qua ...

  7. Spring Boot 2.x基础教程:默认数据源Hikari的配置详解

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  8. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  9. Spring事务管理(详解+实例)

    写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: ...

最新文章

  1. LearnOpenCV学习——平均脸faceAverage.py
  2. 半导体基础知识(4):无源,有源和机电组件
  3. 70-433 Microsoft SQL Server 2008, Database Development 考试感言
  4. LeetCode Minimum Depth of Binary Tree
  5. LeetCode 90子集Ⅱ91解码方法
  6. MySQL FORMAT函数示例
  7. Qt智能指针--QSharedPointer
  8. 为您的Blogger博客设计一个美丽的新主题
  9. java流与文件——读写二进制数据(DataOutput + DataInput)
  10. openquery 如果执行存储过程_ORA-01502--记一次数据库索引失效导致执行存储过程出错...
  11. candence pcb走线等长_Allegro的通用等长规则设置方法
  12. Mysql 默认约束 now_MYSQL中怎样设列的默认值为Now()的介绍
  13. spring.net 对象创建 几种情况
  14. 如何“ grep”连续流?
  15. Centos7 ifconfig这个命令没找到的解决方法
  16. 如何解决PS软件工作区不能吸附到工具栏?
  17. 【优化求解】基于matlab遗传算法结合粒子群算法求解单目标优化问题【含Matlab源码 1659期】
  18. 金橙子打标卡labview打标开发没头绪?c#封装成dll后labview调用真香!
  19. linux bzip2 命令,Linux bzip2 命令的使用
  20. 人工智能成热门 苹果谷歌等科技公司竞相涌入改变神经科学研究

热门文章

  1. Linux-定时任务(Crontab)基本用法
  2. 剑指offer面试题[24]-二插搜索树的后序遍历序列
  3. sonarqube汉化
  4. 21天jenkins打卡Day2-安装Jenkins
  5. tracepro应用实例详解_十大行业气动设备 120个典型气动系统应用实例
  6. 电脑c盘怎么清理_电脑C盘内存不足?三分钟教你彻底清理C盘空间,瞬间多出10个G...
  7. PAT甲级1022 map、set的使用
  8. python利器能下载库吗_python利器
  9. android webdav 播放器,Android WebDAV
  10. 基于深度学习和支持向量机的4种苜蓿叶部病害图像识别