原文地址:https://www.iteye.com/blog/itommy-2354746
Spring JDBC包提供了JdbcTemplate和它的兩個兄弟SimpleJdbcTemplate和NamedParameterJdbcTemplate。
NamedParameterJdbcTemplate類是基於JdbcTemplate類,並對它進行了封裝從而支持命名參數特性。
NamedParameterJdbcTemplate主要提供以下三類方法:execute方法、query及queryForXXX方法、update及batchUpdate方法。
命名參數設值有兩種方式:java.util.Map和SqlParameterSource:
1)Map:使用Map鍵數據來對於命名參數,而Map值數據用於設值;
2)SqlParameterSource:可以使用SqlParameterSource實現作為來實現為命名參數設值,默認有MapSqlParameterSource和BeanPropertySqlParameterSource實現;MapSqlParameterSource實現非常簡單,只是封裝了java.util.Map;而BeanPropertySqlParameterSource封裝了一個JavaBean對象,通過JavaBean對象屬性來決定命名參數的值。
其中有兩個比較實用的兩個類,分別是BeanPropertySqlParameterSource、BeanPropertyRowMapper。
BeanPropertySqlParameterSource:可以把實例轉化成SqlParameterSource
例,new BeanPropertySqlParameterSource(new User);
BeanPropertyRowMapper:可以把返回的每一行轉化成對應的對象
例,new BeanPropertyRowMapper<>(CustomSearchVo.class);
項目中的示例:
@Service("repeatContactsService")
@Transactional
public class RepeatContactsService {
private static final Logger LOG = LoggerFactory.getLogger(RepeatContactsService.class);
@Resource
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public int getRepeatContactsCountByPhone(String userid, String phone){
String sql= "SELECT count(1) FROM tab_user WHERE userid != :userid AND number = :phone";
Map parmas = ImmutableMap.of("userid",userid,"phone",phone);
Integer count = null;
try {
count = namedParameterJdbcTemplate.queryForObject(sql, parmas, Integer.class);
} catch (DataAccessException e) {
LOG.error("獲取值時拋錯:", e);
}
return count;
}
public List<RepeatContactsDetailVo> getAllRepeatContacts(String userid) {
DateTime before = DateTime.now();
Set<String> phoneSet = new HashSet<>();
String sql = "SELECT contacts_phone FROM tab_contacts WHERE userid=:userid";
Map param = ImmutableMap.of("userid", userid);
List<String> phoneList = null;
try {
phoneList = namedParameterJdbcTemplate.queryForList(sql , param, String.class);
} catch (DataAccessException e) {
LOG.error("獲取用戶的通訊錄和運營商時拋錯:", e);
}
//生成需要返回的結果
Map params = ImmutableMap.of("phones", phoneSet, "userid", userid);
String sql = "SELECT a.name,a.phone,MAX(a.type),b.name userName,b.phone userPhone,b.idcard userIdcard FROM tab_contacts a where call_number in (:phones) AND userid != :userid GROUP BY a.userid,a.phone";
List<RepeatContactsDetailVo> contactsList = new ArrayList<>();
try {
contactsList = namedParameterJdbcTemplate.
query(sql, params, new BeanPropertyRowMapper<>(RepeatContactsDetailVo.class));
} catch (DataAccessException e) {
LOG.error("獲取時拋錯:", e);
}
return contactsList ;
}
}
推薦看講NamedParameterJdbcTemplate:
http://www.voidcn.com/blog/victor_cindy1/article/p-6153531.html
講解JdbcTemplate接口比較好的
https://my.oschina.net/u/218421/blog/38598
