JdbcTemplate的增删改查
在使用SpringMVC进行开发的时候,对于增删改查是否总担心没有用对呢?以下就我的学习进行一个尽量简明的总结,让初学者能尽快上手。
1、更改数据(update)
jdbcTemplate.update(sql,params);
举例:
String sql = "insert into t_user(username,password) values(?,?)";
Object[] params =new Object[]{user.getname(),user.getpassword()};
jdbcTemplate.update(sql,params);
int update(String sql,Object[] args,int[] argTypes);
上面的方法jdbcTemplate要自动判断参数类型,而这种方法可以自己规定参数类型,保证类型安全。
举例:
String sql = "insert into t(username,password) values(?,?)";
Object[] params = new Object[]{user.getuserName(),user.getPassword()};
jdbcTemplate.update(sql,params,int[]{Type.VARCHAR,Type.VARCHAR});
- 用一个回调方法给占位符赋值的(多此一举,事实上和第一个方法效果一样。显得代码臃肿,不推荐):
int update(String sql,PreparedStatementSetter pss);int update(String sql,PreparedStatementSetter pss);
例如:
String sql = "insert into t(username,password) values(?,?)";
jdbcTemplate.update(sql,new PreparedStatementSetter(){
public void setValues(PreparedStatement ps) throws SQLException{
ps.setString(1,user.getuserName());
ps.setString(2,user.getPassword());
}
})
- 批量更改数据:
public int[] batchUpdate(String[] sql);
2、查询数据
查询数据分为查询多行数据和单行查询,先讲多行查询,多行查询思路有两种,一种是用RowCallbackHandler回调接口处理结果集,另一种是用RowMapper<T>处理结果集,前者举例:
String sql = "select * from t_user where user_id between ? and ? ";
final List users = new ArryList();
jdbcTemplate.query(sql,Object[]{begin_id,end_id},new RowCallbackHandler(){
User user = new User();
public void processRow(ResultSet rs) throws SQLException{
User user = new User();
user.setuserName(rs.getString("username"));
user.setPassword(rs.getString("password"));
users.add(user);
}
}
)
return users;
同样的例子用RowMapper<T>方法:
String sql = "select * from t_user where user_id between ? and ? ";
jdbcTemplate.query(sql,Object[]{begin_id,end_id},new RowMapper<User>(){
public User mapRow(ResultSet rs,int index){
User user = new User();
user.setuserName(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}
})
对比之下,RowMapper更加程式化,写法简单一些。因为mapRow的返回结果只能是List类型,而RowCallbackHandler接口的方法processRow不需要返回值,可以取出即对数据操作,然后即丢弃数据。(比方说不进行users.add(user);而是立即发送邮件)JDBC驱动程序在批量取数据库数据的时候实际上是分批的,比如oracle的JDBC驱动默认是10条10条的取。而RowMapper方法会10条10条全取出来(比方说有100万条)放在List里面,这会占用JVM大量的内存。所以数据量大的时候用RowCallbackHandler接口比较好,数据量不大的时候可以用RowMapper。
然后说查询单值数据。
jdbcTemplate为单值查询提供了3组方法!分别用于获取Int类型、long类型和Object类型的单值。
int类型的单行查询接口:
int queryForInt(String sql);
int queryForInt(String sql,Object...args);
int queryForInt(String sql,Object...args,int[] argTypes);
long同理,以上Int换成long就行,long型对应mysql里的bigint或者numeric(x,y)。
Object类型:
<T>T queryForObject(String sql,Class<T> requiredType)
<T>T queryForObject(String sql,Object[] args,Class<T> requiredType)
<T>T queryForObject(String sql,Object[] args,int[] argTypes,Class<T> requiredType)
<T>T queryForObject(String sql,Object[] args,int[] argTypes,RowMapper<T> rowMapper)
<T>T queryForObject(String sql,Object[] args,RowMapper<T> rowMapper)
<T>T queryForObject(String sql,RowMapper<T> rowMapper)
Class<T> requiredType是返回的类型,比如说Integer.class,用此参数则结果集仅能拥有一行一列!返回一行多列的,用RowMapper.
比如
//比如看一个人年龄和拥有财富的占比
String sql = "select user_age,user_money from t_user where user_id = ? ";
jdbcTemplate.query(sql,new Object[]{id},new RowMapper<Double> (
public Double mapRow(ResultSet rs,int index) throws SQLException{
int user_age = rs.getInt("user_age");
int user_money = rs.getInt("user_money");
return new Double ((Double)user_age /user_money);
}
))
前面讲到,RowMapper返回List对象,但是这样写的话,而在单行查询中,返回的只能是一个只包含一个元素的List了,所以说RowMapper更加适用于多行查询!
就总结这么多啦。
本文详细介绍了在SpringMVC开发中如何使用JdbcTemplate进行数据的增删改查操作,包括单行和多行查询的区别,以及在不同场景下如何选择合适的方法。通过示例代码展示了JdbcTemplate的各种API用法,强调了在大数据量查询时使用RowCallbackHandler接口的优势。
268

被折叠的 条评论
为什么被折叠?



