spring-jdbc jar中的 JdbcTemplate 的注意点和常用使用方法
1、使用JdbcTemplate.queryForObject 的注意点
1、queryForObject其实支持的是标量子查询,只能传入一个基本类型的包装类的class,并返回一个基本类型对应包装类型的对象.
2、如果要实现使用queryForObject获得自定义的类的对象,需要使用和方法query相似的重载方法queryForObject(sql,Object[],int[],RowMapper),通过RowMapper填充自定义的类,通过Object[]和int[]设定sql语句的参数参数和参数类型.
3、这样还会存在一些问题,就是如果sql语句查询出0条或者多条数据的话,queryForObject会抛出EmptyResultDataAccessException或IncorrectResultSetColumnCountException:的异常,而如果干脆使用方法query,或者queryForList则可以在编码中处理掉这种问题而无需try-catch
结论: 查询单个对象干脆直接使用: queryForList
1、JdbcTemplate 常用的使用方法
备注: maven 基于
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
查询:
1、查询 带查询参数 并返回基本类型 (单个返回不要使用 queryForObject)
/**
* 查询 重复id 号
*/
public List<Long> selectRepeatId(Long id,String dataFrom) {
String sql = "SELECT TOP 1 ID FROM competition_price_store_history WHERE data_from = ? AND ID = ?";
// 一定要用数组
Object[] params = new Object[] { dataFrom, id};
return jdbcTemplate.queryForList(sql,params,Long.class);
}
1.1 查询 不带查询参数 并返回基本类型 (单个返回不要使用 queryForObject)
public List<String> qryEventList() {
String sql = "SELECT distinct [eventID] FROM [dbo].[was_schedule] where eventID is not null";
return jdbcTemplate.queryForList(sql, String.class);
}
2、查询 带查询参数 并返回自定义类型
使用这个方法:
@Override
public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException {
return query(sql, new RowMapperResultSetExtractor<T>(rowMapper));
}
例如: (如果参数 不想拼接可以使用 query())
public List<CompPriceStore> qryCompPriceReport(String date,String storeNbr) {
String sql = " SELECT * FROM CompPriceStore s left join (select club,item_nbr,max(event_expiration_date) event_expiration_date from [dbo].[was_schedule] where '"+date+"' <=event_expiration_date group by club,item_nbr) h "+
" on (s.store_nbr=h.club or h.club='All Club') and s.item_nbr=h.item_nbr "+
" where h.item_nbr is null";
if(!storeNbr.isEmpty()) {
sql = sql + " and (s.store_nbr='" + storeNbr + "' or s.store_nbr='All Club')";
}
return jdbcTemplate.query(sql, new RowMapper<CompPriceStore>() {
@Override
public CompPriceStore mapRow(ResultSet rs, int rowNum) throws SQLException {
CompPriceStore compPrice = new CompPriceStore();
bindCompPriceStore(rs, compPrice);
return compPrice;
}
});
}
//queryForMap(String sql) ==> Map<String, Object>
Map<String, Object> score_map = template.queryForMap("select * from t_score where id=1");
System.out.println(score_map);//{id=1, sid=20181515114, chinese=54, math=54, english=96}
//queryForMap(String sql,Object... args);
Map<String, Object> score_map2 = template.queryForMap("select * from t_score where id=?", 1);
System.out.println(score_map2);//{id=1, sid=20181515114, chinese=54, math=54, english=96}
//queryForMap(String sql ,Object[] args,int[] argTypes) ==> Map<String, Object>
Object[] args = new Object[]{1};
int[] argsType = new int[]{Types.INTEGER};
Map<String, Object> score_map3 = template.queryForMap("select * from t_score where id=?", args, argsType);
System.out.println(score_map3);//{id=1, sid=20181515114, chinese=54, math=54, english=96}
3.1 queryForList
//queryForList(String sql,Object... args) ==> List<Map<String, Object>>
List<Map<String, Object>> maps = template.queryForList("select * from t_score where english>=?", 80);
for (Map<String, Object> m : maps) System.out.println(m);
//输出
{id=1, sid=20181515114, chinese=54, math=54, english=96}
{id=2, sid=20181515101, chinese=55, math=80, english=99}
{id=7, sid=20181515103, chinese=50, math=20, english=88}
3.2 queryForRowSet
//queryForRowSet(String sql); ==> SqlRowSet == ResultSet
SqlRowSet sqlRowSet = template.queryForRowSet("select * from t_score");
//sqlRowSet == ResultSet
if(sqlRowSet.isFirst())sqlRowSet.previous();
while (sqlRowSet.next()){
System.out.println("id:"+sqlRowSet.getInt(1));
//todo
}
// 使用方式同上
template.queryForRowSet(String sql, Object...args);
template.queryForRowSet(String sql,Object[] args,int[] argTypes);
插入:
1、单个对象:插入 并且可以获取 自增id
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
public int insertDataToBatch(BatchDO batchDO) {
// 这个 注入会报错
NamedParameterJdbcTemplate nameJdbc = new NamedParameterJdbcTemplate(jdbcTemplate);
KeyHolder holder = new GeneratedKeyHolder();
String sql = "INSERT INTO [dbo].[batch]([send_mail_status],[create_time],[operation_user],[type]) VALUES(:sendMailStatus,getdate(),:operationUser,:type)";
SqlParameterSource parameters = new MapSqlParameterSource()
.addValue("sendMailStatus", batchDO.getSendMailStatus())
.addValue("operationUser", batchDO.getOperationUser())
.addValue("type", batchDO.getType());
nameJdbc.update(sql,parameters,holder);
batchDO.setId(holder.getKey().intValue());
// 获取id
return batchDO.getId();
}
1.2、单个对象: 插入数据
public void addCurrSchedule(String eventID, int club, int itemNbr, BigDecimal itemPrice,
Date effectiveDate, Date swfEffectiveDate,Date eventEffectiveDate, String lastOpuser) {
String sql = "INSERT INTO was_schedule(eventID,club,item_nbr,item_price,effective_date,swf_effective_date,event_expiration_date,last_opuser,ctime) VALUES(?,?,?,?,?,?,?,?,getdate())";
jdbcTemplate.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException, DataAccessException {
ps.setString(1, eventID);
ps.setInt(2, club);
ps.setInt(3, itemNbr);
ps.setBigDecimal(4, itemPrice);
// 预警字段
ps.setDate(5, new java.sql.Date(effectiveDate.getTime()));
// 生效字段
ps.setDate(6, new java.sql.Date(swfEffectiveDate.getTime()));
// 结束字段
ps.setDate(7, new java.sql.Date(eventEffectiveDate.getTime()));
ps.setString(8, lastOpuser);
}
});
}
1.3、批量 :List<Map<String, Object>> list 插入数据
1.4、批量: List<对象> list 插入数据
public void addBatchCurrSchedule(List<WasSchedule> list, String lastOpUser) {
String sql = "INSERT INTO was_schedule_upload(eventID,club,item_nbr,item_price,effective_date,swf_effective_date,event_expiration_date,last_opuser,ctime) VALUES(?,?,?,?,?,?,?,?,getdate())";
BatchPreparedStatementSetter batchPreparedStatementSetter = new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int index) throws SQLException {
WasSchedule wasSchedule = list.get(index);
ps.setString(1, wasSchedule.getEventID());
ps.setString(2, wasSchedule.getClub());
ps.setInt(3, wasSchedule.getItem_nbr());
ps.setBigDecimal(4, wasSchedule.getItem_price());
ps.setDate(5, new java.sql.Date(wasSchedule.getEffective_date().getTime()));
ps.setDate(6, new java.sql.Date(wasSchedule.getSwf_effective_date().getTime()));
ps.setDate(7, new java.sql.Date(wasSchedule.getEvent_expiration_date().getTime()));
ps.setString(8, lastOpUser);
}
@Override
public int getBatchSize() {
return list.size();
}
};
jdbcTemplate.batchUpdate(sql, batchPreparedStatementSetter);
}
更新:
2、JdbcTemplate 常用的使用方法 参考博客
本文地址:https://blog.csdn.net/dingding_java/article/details/109444181
上一篇: 能不新鲜吗