Spring中NamedParameterJdbcTemplate的用法实例(二)

一、简介

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

SqlParameterSource的两个主要实现MapSqlParameterSourceBeanPropertyParameterSource


Map参数源:采用键值对方式传参(参数别名可任意,如:m,:n)
  staticUserfindUser(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); 
	    }

猜你喜欢

转载自lehsyh.iteye.com/blog/1579950