JDBC之使用Spring提供的NamedParameterJdbcTemplate

时间:2021-11-01 02:33:26
Spring的NamedParameterJdbcTemplate:
①NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干; NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。
②public Object queryForObject(String sql, Map paramMap, RowMapper rowMapper)
③public Object queryForObject(String sql, SqlParameterSource paramSource, RowMapper rowMapper)
SqlParameterSource的两个主要实现MapSqlParameterSource
和BeanPropertySqlParameterSource

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


1、编写NamedParameterJdbcTemplateCases

package cn.itcast.jdbc.spring;

import java.util.HashMap;
import java.util.Map;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import cn.itcast.jdbc.JdbcUtils;
import cn.itcast.jdbc.domain.User;

/**
* 测试Spring中的NamedParameterJdbcTemplate
*/
public class NamedParameterJdbcTemplateCases {

//创建一个命名参数的实例
static NamedParameterJdbcTemplate named = new
NamedParameterJdbcTemplate(JdbcUtils.getDataSource());

/**
* 添加用户
* @param user
*/
static void addUser(User user) {
//注意SQL参数的写法
String sql = "insert into user(name, birthday, money) "
+ "values(:name,:birthday,:money)";
//使用这种方式要注意SQL语句参数名:name必须符合JavaBean的setter和getter
//规则,例如:name对应的set方法setName,否则会抛异常
SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
//专门用户保存key
KeyHolder keyHolder = new GeneratedKeyHolder();
named.update(sql, ps, keyHolder);
//获取单列主键
int id = keyHolder.getKey().intValue();
user.setId(id);

//获取多列主键,复合主键
Map map = keyHolder.getKeys();
System.out.println(map);
}

/**
* 注意SQL参数的写法,参数可以任意命名
* @param user
* @return
*/
static User findUser(User user) {
//注意参数的写法
String sql = "select id, name, money, birthday from user "
+ "where money > :m and id < :id";
//根据名字设置对应的变量名
Map params = new HashMap();
params.put("m", user.getMoney());
params.put("id", user.getId());
//该方法用于返回单个对象,如果有多个会报错
Object u = named.queryForObject(sql, params, new BeanPropertyRowMapper(
User.class));
return (User) u;
}

/**
*
* @param user
* @return
*/
static User findUser1(User user) {
String sql = "select id, name, money, birthday "
+ "from user where money > :money and id < :id";
//接收一个Java类作为参数
SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
Object u = named.queryForObject(sql, ps,
new BeanPropertyRowMapper(User.class));
return (User) u;
}
}
2、编写TestNamedParameterJdbcTemplateCases测试类进行测试
package cn.itcast.jdbc.spring;

import java.util.Date;

import org.junit.Test;

import cn.itcast.jdbc.domain.User;

public class TestNamedParameterJdbcTemplateCases {

/**
* 测试添加用户
*/
@Test
public void testAddUser() {
User user = new User();
user.setBirthday(new Date());
user.setMoney(13f);
user.setName("kaka");
NamedParameterJdbcTemplateCases.addUser(user);
}

/**
* 测试查询用户
*/
@Test
public void testFindUser() {
User user = new User();
user.setMoney(200f);
user.setId(3);
NamedParameterJdbcTemplateCases.findUser(user);
}

/**
* 测试查询用户
*/
@Test
public void testFindUser1() {
User user = new User();
user.setMoney(200f);
user.setId(3);
NamedParameterJdbcTemplateCases.findUser1(user);
}

}