NamedParameterJdbcTemplate常用方法总结

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

一、支持类
SqlParameterSource 简介
可以使用SqlParameterSource实现作为来实现为命名参数设值,默认实现有 :

  1. MapSqlParameterSource实现非常简单,只是封装了java.util.Map;
  2. BeanPropertySqlParameterSource封装了一个JavaBean对象,通过JavaBean对象属性来决定命名参数的值。
  3. EmptySqlParameterSource 一个空的SqlParameterSource ,常用来占位使用

RowMapper简介
这个接口为了实现sql查询结果和对象间的转换,可以自己实现,也可以使用系统实现,主要实现类有:

  1. SingleColumnRowMapper ,sql结果为一个单列的数据,如List ,
    List,String,Integer等
  2. BeanPropertyRowMapper, sql结果匹配到对象 List< XxxVO> , XxxVO

二、插入/修改/删除数据,使用updateXXX方法,使用Map作为参数

API:int update(String sql, Map<String, ?> paramMap)

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", UUID.randomUUID().toString());
paramMap.put("name", "小沈");
paramMap.put("age", 29);
paramMap.put("homeAddress", "安徽");
paramMap.put("birthday", new Date());
template.update( "insert into student(id,name,age,home_address,birthday) values (:id,:name,:age,:homeAddress,:birthday)",paramMap);

使用BeanPropertySqlParameterSource作为参数
API: int update(String sql, SqlParameterSource paramSource)

@Data
public class StudentDTO{
    private String id;
    private String name;
    private String homeAddress;
}

StudentDTO dto=new StudentDTO();//这个DTO为传入数据
dto.setId(UUID.randomUUID().toString());
dto.setName("小李");
dto.setHomeAddress("南京");
//------------------------------
template.update("insert into student(id,name,home_address) values (:id,:name,:homeAddress)",
new BeanPropertySqlParameterSource(dto));

使用MapSqlParameterSource 作为参数
API: int update(String sql, SqlParameterSource paramSource)

MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource()
        .addValue("id", UUID.randomUUID().toString())
        .addValue("name", "小王")
        .addValue("homeAddress", "美国");
template.update("insert into student(id,name,home_address) values    
(:id,:name,:homeAddress)",mapSqlParameterSource);

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", UUID.randomUUID().toString());
paramMap.put("name", "小明");
paramMap.put("homeAddress", "乐山");
//---------------
MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource(paramMap);

三、查询

1、返回单行单列数据

API: public < T > T queryForObject(String sql, Map<String, ?> paramMap, Class<T> requiredType)

API: public < T > T queryForObject(String sql, SqlParameterSource paramSource, Class<T> requiredType)

Integer count = template.queryForObject(
"select count(*) from student", new HashMap<>(), Integer.class);
String name = template.queryForObject( "select name from student where home_address  limit 1 ", EmptySqlParameterSource.INSTANCE, String.class); 

2、返回 (多行)单列 数据

API: public < T> List< T> queryForList(String sql, Map<String, ?> paramMap, Class< T > elementType)

API: public < T> List< T> queryForList(String sql, SqlParameterSource paramSource, Class< T> elementType)

List<String> namelist = template.queryForList("select name from student", new HashMap<>(), String.class);

3、返回单行数据

API: public < T> T queryForObject(String sql, Map< String, ?> paramMap, RowMapper< T>rowMapper)

API: public < T> T queryForObject(String sql, SqlParameterSource paramSource, RowMapper< T> rowMapper)

Student  stu = template.queryForObject(
"select * from student limit 1", new HashMap<>(), new BeanPropertyRowMapper<Student>(Student.class));
//BeanPropertyRowMapper会把下划线转化为驼峰属性
//结果对象可比实际返回字段多或者少

这两个API也可以使用SingleColumnRowMapper返回单行单列数据

String name = template.queryForObject(
"select name from student limit 1", EmptySqlParameterSource.INSTANCE, new SingleColumnRowMapper<>(String.class));

4、返回Map形式的单行数据

API: public Map< String, Object> queryForMap(String sql, Map< String, ?> paramMap)

API: public Map< String, Object> queryForMap(String sql, SqlParameterSource paramSource)

 Map< String, Object> studentMap = template.queryForMap("select * from student limit 1", new HashMap<>());

5、返回多行数据

API: public < T> List< T> query(String sql, Map< String, ?> paramMap, RowMapper< T> rowMapper)

API: public < T> List< T> query(String sql, SqlParameterSource paramSource, RowMapper< T> rowMapper)

API: public < T> List< T> query(String sql, RowMapper< T> rowMapper)

List< Student> studentList = template.query(
"select * from student",  
new BeanPropertyRowMapper<>(Student.class)
);        

6、返回多行数据(Map)

API: public List< Map< String, Object>> queryForList(String sql, Map< String, ?> paramMap)

API: public List< Map< String, Object>> queryForList(String sql, SqlParameterSource paramSource)

List<Map<String, Object>> mapList = template.queryForList(
"select * from student", new HashMap<>());

四、总结

  1. 开发中尽量使用NamedParameterJdbcTemplate代替JdbcTemplate,如果想使用JdbcTemplate,也可以通过NamedParameterJdbcTemplate#getJdbcOperations()获取
  2. 不建议使用查询结构为Map的API
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值