详解jdbcTemplate和namedParameterJdbcTemplate
我们开发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相关推荐
- JdbcTemplate详解 - 2
JdbcTemplate详解 - 2 http://tianya23.blog.51cto.com/1081650/275292 1.由于之前JdbcTemplate的程序需要编写一堆的RowMapp ...
- Spring JdbcTemplate方法详解
2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...
- Spring JDBC详解
<Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...
- Spring+SpringMVC+Mybatis SSM框架详解
一.JDBC编程 1.JDBC 简介 JDBC其实就是 Java 官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接. 程序运行的时候,数据都是在内存中的.当程序终止的时候,通 ...
- getinstance方法详解_二、设计模式总览及工厂模式详解
二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...
- spring框架使用Quartz执行定时任务实例详解
版权声明:本文为博主原创文章,如需转载,请标明出处. https://blog.csdn.net/alan_liuyue/article/details/80382324 Quartz简介 1.Qua ...
- Spring Boot 2.x基础教程:默认数据源Hikari的配置详解
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...
- Java编程配置思路详解
Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...
- Spring事务管理(详解+实例)
写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: ...
最新文章
- LearnOpenCV学习——平均脸faceAverage.py
- 半导体基础知识(4):无源,有源和机电组件
- 70-433 Microsoft SQL Server 2008, Database Development 考试感言
- LeetCode Minimum Depth of Binary Tree
- LeetCode 90子集Ⅱ91解码方法
- MySQL FORMAT函数示例
- Qt智能指针--QSharedPointer
- 为您的Blogger博客设计一个美丽的新主题
- java流与文件——读写二进制数据(DataOutput + DataInput)
- openquery 如果执行存储过程_ORA-01502--记一次数据库索引失效导致执行存储过程出错...
- candence pcb走线等长_Allegro的通用等长规则设置方法
- Mysql 默认约束 now_MYSQL中怎样设列的默认值为Now()的介绍
- spring.net 对象创建 几种情况
- 如何“ grep”连续流?
- Centos7 ifconfig这个命令没找到的解决方法
- 如何解决PS软件工作区不能吸附到工具栏?
- 【优化求解】基于matlab遗传算法结合粒子群算法求解单目标优化问题【含Matlab源码 1659期】
- 金橙子打标卡labview打标开发没头绪?c#封装成dll后labview调用真香!
- linux bzip2 命令,Linux bzip2 命令的使用
- 人工智能成热门 苹果谷歌等科技公司竞相涌入改变神经科学研究
热门文章
- Linux-定时任务(Crontab)基本用法
- 剑指offer面试题[24]-二插搜索树的后序遍历序列
- sonarqube汉化
- 21天jenkins打卡Day2-安装Jenkins
- tracepro应用实例详解_十大行业气动设备 120个典型气动系统应用实例
- 电脑c盘怎么清理_电脑C盘内存不足?三分钟教你彻底清理C盘空间,瞬间多出10个G...
- PAT甲级1022 map、set的使用
- python利器能下载库吗_python利器
- android webdav 播放器,Android WebDAV
- 基于深度学习和支持向量机的4种苜蓿叶部病害图像识别