Spring NamedParameterjdbc详解和如何获得主键自增值

本文介绍了Spring的NamedParameterJdbcTemplate在处理命名参数时的两种设值方式——Map和SqlParameterSource,并详细讲解了如何在插入数据并实现主键自增后获取自增的主键值。示例代码展示了具体操作过程。

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

NamedParameterJdbcTemplate类是基于JdbcTemplate类,并对它进行了封装从而支持命名参数特性。
NamedParameterJdbcTemplate主要提供以下三类方法:execute方法、query及queryForXXX方法、update及batchUpdate方法。

首先让我们看个例子吧:

@Test  
public void testNamedParameterJdbcTemplate1() {  
NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;  
//namedParameterJdbcTemplate =  
//    new NamedParameterJdbcTemplate(dataSource);  
namedParameterJdbcTemplate =  
new NamedParameterJdbcTemplate(jdbcTemplate);  
    String insertSql = "insert into test(name) values(:name)";  
    String selectSql = "select * from test where name=:name";  
    String deleteSql = "delete from test where name=:name";  
    Map<String, Object> paramMap = new HashMap<String, Object>();  
    paramMap.put("name", "name5");  
    namedParameterJdbcTemplate.update(insertSql, paramMap);  
    final List<Integer> result = new ArrayList<Integer>();  
namedParameterJdbcTemplate.query(selectSql, paramMap,  
new RowCallbackHandler() {  
        @Override  
        public void processRow(ResultSet rs) throws SQLException {  
            result.add(rs.getInt("id"));  
        }  
    });  
Assert.assertEquals(1, result.size());  
SqlParameterSource paramSource = new MapSqlParameterSource(paramMap);  
namedParameterJdbcTemplate.update(deleteSql, paramSource);  
}  

接下来让我们分析一下代码吧:
1)NamedParameterJdbcTemplate初始化:可以使用DataSource或JdbcTemplate 对象作为构造器参数初始化;
2)insert into test(name) values(:name):其中“:name”就是命名参数;
3) update(insertSql, paramMap):其中paramMap是一个Map类型,包含键为“name”,值为“name5”的键值对,
   也就是为命名参数设值的数据;
4)query(selectSql, paramMap, new RowCallbackHandler()……):类似于JdbcTemplate中介绍的,
   唯一不同是需要传入paramMap来为命名参数设值;
5)update(deleteSql, paramSource):类似于“update(insertSql, paramMap)”,但使用SqlParameterSource参数来为命名参数设值,
   此处使用MapSqlParameterSource实现,其就是简单封装java.util.Map。


NamedParameterJdbcTemplate类为命名参数设值有两种方式:java.util.Map和SqlParameterSource:
1)java.util.Map:使用Map键数据来对于命名参数,而Map值数据用于设值;
2)SqlParameterSource:可以使用SqlParameterSource实现作为来实现为命名参数设值,
   默认有MapSqlParameterSource和BeanPropertySqlParameterSource实现;MapSqlParameterSource实现非常简单,只是封装了java.util.Map;
   而BeanPropertySqlParameterSource封装了一个JavaBean对象,通过JavaBean对象属性来决定命名参数的值。


package cn.javass.spring.chapter7;  
public class UserModel {  
    private int id;  
    private String myName;     
    //省略getter和setter       
}  

@Test  
public void testNamedParameterJdbcTemplate2() {  
    NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;  
    namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);  
    UserModel model = new UserModel();  
    model.setMyName("name5");  
    String insertSql = "insert into test(name) values(:myName)";  
    SqlParameterSource paramSource = new BeanPropertySqlParameterSource(model);  
    namedParameterJdbcTemplate.update(insertSql, paramSource);  
}  

可以看出BeanPropertySqlParameterSource使用能减少很多工作量,但命名参数必须和JavaBean属性名称相对应才可以。

上面是看转载别人的博客,下面我来补充一点,我创建的表中实现了主键自增
但是如何获得自增后的主键值呢,不能直接通过user.getId();
之前我利用JdbcTemplate获得了自增的主键值,自己摸索了一下后,发现NamedParameterJdbcTemplate采用类似的方法


下面列举下我实现的代码:
向表中插入数据的Sql语句:

private final String INSERT_SQL="insert into td(user_name,password)values(:user_name,:password)";
执行sql语句和获得主键自增值:

@Override
	public KeyHolder save(UserModel user) {
		KeyHolder keyHolder=new GeneratedKeyHolder();
		/**
		 * SqlParameterSource:可以使用SqlParameterSource实现作为来实现为命名参数设值,
		 * 默认有MapSqlParameterSource和BeanPropertySqlParameterSource实现;
		 * MapSqlParameterSource实现非常简单,只是封装了java.util.Map;
		 * 而BeanPropertySqlParameterSource封装了一个JavaBean对象,通过JavaBean对象属性来决定命名参数的值。
		 */
		SqlParameterSource paramSource=new BeanPropertySqlParameterSource(user);
		/**
		 * 设置如何获取自增主键值,注意下面的参数,下面的比较重要
		 */
		getNamedParameterJdbcTemplate().update(INSERT_SQL, paramSource,keyHolder,new String[]{"id"});
		return keyHolder;
	}


通过KeyHolder.getKey().intVal便可以获得自增的主键值

今天被虐惨了,唉,得静下心来追赶了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值