在JDBC用法中,SQL参数是用占位符?表示,并且受到位置的限制,定位参数的问题在于,一旦参数的位置发生变化,必须改变
参数的绑定,在Spring JDBC中,绑定SQL参数的另一种选择是使用具名参数,SQL具名参数是按照名称绑定,而不是位置绑定,
具名参数只在SImpleJdbcTemplate和NamedParameterJdbcTemplate中得到支持.
实现方法
public class JdbcUserDao extends SimpleJdbcDaoSupport implements UserDao{
public void insert(User user){
String sql="insert into user values (:username,:password)";
Map<String,Object> pramters = new Map<String,Object>();
pramters.put("username",user.getUsername());
pramters.put("password",user.getPassword());
this.getSimpleJdbcTemplate().update(sql,pramters);
}
}
也可以提供一个SQL参数源,它将为具体参数提供SQL参数值,SQLParamterSource接口有俩个实现,其实的基本实现就是MapSqlParamterSource,它将Map包装起来作为参数源。
public class JdbcUserDao extends SimpleJdbcDaoSupport implements UserDao{
public void insert(User user){
String sql = "insert into user values(:username,:password)";
Map<String,Object> paramters = new Map<String,Object>();
paramters.put("username",user.getUsername());
paramters.put("password",user.getPassword());
SqlParamterSource source= new MapSqlParamterSource(paramters);
this.getSimpleJdbcTemplate().update(sql,source);
}
}
SqlParamterSource的另一个实现是BeanPropertySqlParamterSource,它将普通的java对象包装起来作为SQL参数源,对于每个具名参数,会用同名的属性作为参数值
public class JdbcUserDao extends SimpleJdbcDaoSupport implements UserDao{
public void insert(User user){
String sql ="insert into user values(:username,:password)";
SqlParamterSource parameterSource = new BeanPropertySqlParamterSource(user);
this.getSimpleJdbcTempalte().update(sql,paramterSource);
}
}
具名参数也可以用在批量更新中,可以给参数值提供一个Map数组或SqlParamterSource数组,
public class JdbcUserDao extends SimpleJdbcDaoSupport implements UserDao{
public void insertBetch(List<User> user){
String sql = "insert into user values(:username,:password)";
List<SqlParamterSource> paramters = new ArrayList<SqlParamterSource()>();
for(User u:user){
paramters.add(new BeanPropertySqlParamterSource(u));
}
this.getSimpleJdbcTemplate().batchUpdate(sql,paramters.toArray(new SqlParamterSource[0]));
}
}