jdbcTemplate和namedParameterJdbcTemplate的介绍

本文详细介绍了Spring中的jdbcTemplate和NamedParameterJdbcTemplate。jdbcTemplate提供了execute、update、query等方法用于执行SQL操作,如增删改查。 NamedParameterJdbcTemplate则通过具名参数的方式提高了SQL的可读性和维护性,支持全部jdbcTemplate方法并能获取新增主键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们开发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进⾏注⼊

 @Autowired
 private 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;
 }

1.查询单个对象queryForObject:

 @Test
 public 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:

 @Test
 public 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等函数返回唯⼀值:

 @Test
 public 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.增删改⽅法测试:
新增:

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

输出结果为1,去数据库查看也确实插⼊这条。
jdbcTemplate_2
修改:

 @Test
 public 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,并且确实数据已经修改
删除:

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

5.批量操作:

 @Test
 public 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⽅法,除此之外,我们来看看使⽤它的具名参数案例:

具名新增:

 @Test
 public 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);
 }

我们来看看结果
jdbcTemplate_3 这样我们就可以根据pojo类的属性值使⽤JDBC来操作数据库了。

获取新增的主键:
NamedParameterJdbcTemplate还新增了KeyHolder类,使⽤它我们可以获得主键,类似Mybatis中的useGeneratedKeys。

@Test
 public 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操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值