NamedParameterJdbcTemplate

来源:互联网 发布:淘宝旧版本5.0下载 编辑:程序博客网 时间:2024/06/06 14:04

NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干,NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。NamedParameterJdbcTemplate提供了命名参数,用:x代替了?

SqlParameterSource的两个主要实现MapSqlParameterSourceBeanPropertyParameterSource


Map参数源:采用键值对方式传参(参数alias.html' target='_blank'>别名可任意,如:m,:n)
  static UserfindUser(Useruser){
     NamedParameterJdbcTemplate named=new NamedParameterJdbcTemplate(dataSource);
   String sql="select id,name,money,birthday from user where money>:m and id<:n";
   Map map=new HashMap();
   map.put("m",user.getMoney());
   map.put("n",user.getId());
   Object u=named.queryForObject(sql,map,new BeanPropertyRowMapper(User.class));//这个方法当查询对象多于一个或为null时会抛异常
   return(User)u;
  }

Bean属性参数源使用方法(参数别名要与bean类的属性对应,如:money,:id)(通过&号也可以命名别名,不建议使用)
  staticUserfindUser(Useruser){
   NamedParameterJdbcTemplate named=new NamedParameterJdbcTemplate(dataSource);
   String sql="selectid,name,money,birthday from user where money>:money and id<:id";
   SqlParameterSource ps=new BeanPropertySqlParameterSource(user);
   Object u=named.queryForObject(sql,ps,new BeanPropertyRowMapper(User.class));//这个方法当查询对象多于一个或为null时会抛异常
   return(User)u;
  } //保存数据获得主键

//保存数据获得主键
  
* public int update(String sql,SqlParameterSource paramSource,KeyHolder generatedKeyHolder)

static void addUser(Useruser)
  {
  NameParameterJdbcTemplate named=new NameParameterJdbcTemplate(dataSource);
  String sql="insert into user(name,birthday,money)values(:name,:birthday,:money");
  SqlParameterSource ps=new BeanPropertySqlParameterSource(user);
  KeyHolder keyHolder=new GeneratedKeyHolder();
  named.update(sql,ps,keyHolder);
  int id=keyHolder.getKey().intValue();
user.setId(id);//如果不是整型的主键呢,使用Map map=keyHolder.getKeys();
}

二、配置

UserDaoImpl :

public class UserDaoImpl implements UserDao { private NamedParameterJdbcTemplate namedParameterJdbcTemplate; public void setDataSource(DataSource dataSource) { this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); } //其它方法暂时忽略……}

spring配置:

<bean id="userDao" class="com.hxzy.account.namedParameterJdbcTemplate.UserDaoImpl"> <property name="dataSource" ref="dataSource"/></bean>

三、使用

NamedParameterJdbcTemplate传参数可以用map或者SqlParameterSource

map的好处是:x,x的值可以自由取,但是所有参数的值都必须要放到map中去,其中的key为:后面的名称,value是你传的值。

SqlParameterSource的好处是不用一个个的赋值,但是:x中的x的值必须和对象的属性名称一样

@Override
public void save(User user) { String sql="insert into tb_test1 values(:username,:password,:sex)"; //:后面的名称必须和stu属性名称一样 
SqlParameterSource ps=new BeanPropertySqlParameterSource(user); KeyHolder keyholder=new GeneratedKeyHolder(); namedParameterJdbcTemplate.update(sql, ps,keyholder); //加上KeyHolder这个参数可以得到添加后主键的值 int m=keyholder.getKey().intValue(); system.out.println(m); //Map map=keyholder.getKeys();//这样可以得到联合主键的值 //keyholder.getKeyList();//这样可以得到一些主主键值,若一次添加好几条记录 }@Override
public void update(User user) { String sql="update tb_test1 set username=:username,sex=:sex,password=:password where id=:id"; SqlParameterSource ps=new BeanPropertySqlParameterSource(user); namedParameterJdbcTemplate.update(sql, ps); } @Override
public void delete(User user) {String sql="delete tb_test1 where id=:id"; Map map=new HashMap(); map.put("id", user.getId()); namedParameterJdbcTemplate.update(sql, map);
 }
//BeanPropertyRowMapper就是将查询结果和User进行映射的类,将查询出的每条记录都映射为User实例//namedParameterJdbcTemplate调用封装的jdbcTemplate进行操作
public List queryAllUser() { 
String sql="select id,username,password,sex from tb_test1"; List list=namedParameterJdbcTemplate.getJdbcOperations().query(sql,new BeanPropertyRowMapper(User.class)); return list; } public List getAllUsers(User user) { String sql="select id,username,password,sex from tb_test1 where username=:username"; SqlParameterSource ps=new BeanPropertySqlParameterSource(user); //将user实例和sql中的:xx进行对应
return namedParameterJdbcTemplate.query(sql, ps, new BeanPropertyRowMapper(User.class)); } public Stu getOneUser(User user) { String sql="select id,username,password,sex from tb_test1 where id=:id"; SqlParameterSource ps=new BeanPropertySqlParameterSource(user); return (User)namedParameterJdbcTemplate.queryForObject(sql, ps, new BeanPropertyRowMapper(User.class)); } public String getUserName(User user) { String sql="select username from tb_test1 where username=:username"; SqlParameterSource ps=new BeanPropertySqlParameterSource(user);return (String)namedParameterJdbcTemplate.queryForObject(sql, ps, String.class); }


0 0