java jdbctemplate_Spring JdbcTemplate之使用详解

最近在项目中使用到了 Spring 的 JdbcTemplate, 中间遇到了好多坑, 所以花一些时间对 JdbcTemplate 的使用做了一个总结, 方便以后自己的查看。文章中贴出来的API都是经过测试的, 可以放心大胆的拿去用。

概述

JdbcTemplate主要提供4种方法:

call()方法: 用于执行存储过程、存储函数

execute()方法: 可以执行任何SQL语句, 一般用于DDL语句

update()和batchUpdate()方法: 分别对应单个更新、批量更新的语句执行

query()和queryForXXX()方法: 用于单查、列表查询

前两种使用的一般较少, 本次主要介绍后两种方法的使用。

单个更新

@Testpublic voidinsert() {

String sql= "insert into pass_user (name,age,gender,birthday,create_time,update_time) values (?,?,?,?,?,?)";

jdbcTemplate.update(sql,"张三丰", 18, "male", Instant.now().toEpochMilli(), Instant.now().toEpochMilli(), Instant.now().toEpochMilli());

}

JdbcTemplate的大部分方法都和上面类似, 参数列表的最右边经常是一个可变参。

批量更新

@Testpublic voidbatchInsert() {

String sql= "insert into pass_user (name,age,gender,birthday,create_time,update_time) values (?,?,?,?,?,?)";

List args = new ArrayList<>();for (int i = 0; i < 5; i++) {

args.add(new Object[]{"张三丰", 18, "male", Instant.now().toEpochMilli(), Instant.now().toEpochMilli(), Instant.now().toEpochMilli()});

}

jdbcTemplate.batchUpdate(sql, args);

}

获取count、sum等聚合函数返回的唯一值

/*** 只能接受String,Integer这种单列类型的实体,否则汇报异常*/@Testpublic voidqueryForCount1() {

String sql= "select count(1) from pass_user where id > ?";

Integer count= jdbcTemplate.queryForObject(sql, Integer.class, 300000);

LOGGER.info("[" + Thread.currentThread().getStackTrace()[1].getMethodName() + "] {}", count);

}

在JdbcTemplate中 queryForObject() 方法的文档说明中, 指定了该方法只能接受单个记录的某一列值, 否则报 IncorrectResultSizeDataAccessException 异常。

4cc35951ca3c65d38ee4017594074d1e.png

获取单个记录的某一列值

/*** 只能接受String,Integer这种单列类型的实体,否则汇报异常*/@Testpublic voidqueryForObject1() {

String sql= "select NAME from pass_user where id = ?";

String name= jdbcTemplate.queryForObject(sql, String.class, 30);//查询结果空集时会报EmptyResultDataAccessException异常

LOGGER.info("[" + Thread.currentThread().getStackTrace()[1].getMethodName() + "] {}", name);

}

另外 queryForObject() 方法在查询结果集为空集也就是null值时, 会报 EmptyResultDataAccessException 异常。

获取单个记录的所有列值

通过RowMapper映射, 我们可以通过 queryForObject() 方法获取单个记录的所有列值, 映射方法有两种。

如下, PassUser实体类不用实现RowMapper接口, 但是实体类的属性名必须和表中的列名符合驼峰命名匹配,能一一对应起来, 如果两者不一致,则需要在sql语句中给对应的列取一个别名。

36fcb6e8bd07e7f065fb727452bd835d.png

cd469664830e22aa6fa69dde4904c372.png

public classPassUser {privateLong id;privateString name;privateInteger age;privateString gender;privateLong birthday;privateLong createTime;privateLong updateTime;publicLong getId() {returnid;

}public voidsetId(Long id) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicInteger getAge() {returnage;

}public voidsetAge(Integer age) {this.age =age;

}publicString getGender() {returngender;

}public voidsetGender(String gender) {this.gender =gender;

}publicLong getBirthday() {returnbirthday;

}public voidsetBirthday(Long birthday) {this.birthday =birthday;

}publicLong getCreateTime() {returncreateTime;

}public voidsetCreateTime(Long createTime) {this.createTime =createTime;

}publicLong getUpdateTime() {returnupdateTime;

}public voidsetUpdateTime(Long updateTime) {this.updateTime =updateTime;

}

@OverridepublicString toString() {return "PassUser{" +

"id=" + id +

", name='" + name + ''' +

", age=" + age +

", gender='" + gender + ''' +

", birthday=" + birthday +

", createTime=" + createTime +

", updateTime=" + updateTime +

'}';

}

}

PassUser实体类

/*** 可以自动进行驼峰匹配*/@Testpublic voidqueryForObject2() {

String sql= "select * from pass_user where id = ?";

RowMapper rowMapper = new BeanPropertyRowMapper<>(PassUser.class);

PassUser passUser= jdbcTemplate.queryForObject(sql, rowMapper, 180);//查询结果空集时会报EmptyResultDataAccessException异常

LOGGER.info("[" + Thread.currentThread().getStackTrace()[1].getMethodName() + "] {}", passUser);

}

第二种方式需要实体类实现RowMapper接口,覆写 mapRow() 方法

36fcb6e8bd07e7f065fb727452bd835d.png

cd469664830e22aa6fa69dde4904c372.png

public class UserEntity implements RowMapper{privateLong id;privateString name;privateInteger age;privateString gender;privateLong birthday;privateLong createTime;privateLong updateTime;publicLong getId() {returnid;

}public voidsetId(Long id) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicInteger getAge() {returnage;

}public voidsetAge(Integer age) {this.age =age;

}publicString getGender() {returngender;

}public voidsetGender(String gender) {this.gender =gender;

}publicLong getBirthday() {returnbirthday;

}public voidsetBirthday(Long birthday) {this.birthday =birthday;

}publicLong getCreateTime() {returncreateTime;

}public voidsetCreateTime(Long createTime) {this.createTime =createTime;

}publicLong getUpdateTime() {returnupdateTime;

}public voidsetUpdateTime(Long updateTime) {this.updateTime =updateTime;

}

@OverridepublicString toString() {return "UserEntity{" +

"id=" + id +

", name='" + name + ''' +

", age=" + age +

", gender='" + gender + ''' +

", birthday=" + birthday +

", createTime=" + createTime +

", updateTime=" + updateTime +

'}';

}

@Overridepublic UserEntity mapRow(ResultSet rs, int rowNum) throwsSQLException {

UserEntity userEntity= newUserEntity();

userEntity.setName(rs.getString("name"));

userEntity.setAge(rs.getInt("age"));

userEntity.setGender(rs.getString("gender"));

userEntity.setBirthday(rs.getLong("birthday"));

userEntity.setCreateTime(rs.getLong("create_time"));

userEntity.setUpdateTime(rs.getLong("update_time"));returnuserEntity;

}

}

实现RowMapper接口

/*** 实体类需要实现接口,覆写方法*/@Testpublic voidqueryForObject3() {

String sql= "select * from pass_user where id = ?";

UserEntity userEntity= jdbcTemplate.queryForObject(sql, new UserEntity(), 180);//查询结果空集时会报EmptyResultDataAccessException异常

LOGGER.info("[" + Thread.currentThread().getStackTrace()[1].getMethodName() + "] {}", userEntity);

}

获取多个记录的某一列值

/*** 实体类需要实现接口,覆写方法*/@Testpublic voidqueryForList1() {

String sql= "select name from pass_user where id < ?";

List names = jdbcTemplate.queryForList(sql, String.class, 50);//只能查询单列属性值集合

LOGGER.info("[" + Thread.currentThread().getStackTrace()[1].getMethodName() + "] {}", names);

}

获取多个记录的所有列值

/*** 实体类需要实现接口,覆写方法*/@Testpublic voidqueryForList2() {

String sql= "select * from pass_user where id < ?";

List userEntityList = jdbcTemplate.query(sql, new UserEntity(), 0);

LOGGER.info("[" + Thread.currentThread().getStackTrace()[1].getMethodName() + "] {}", userEntityList);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值