Spring JdbcTemplate使用

如果是个小项目,不想使用hibernate这些大块头,JdbcTemplate是个不错的选择.当然,DbUtils也不错.


先在spring配置文件中配置好datasource

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
destroy-method="close">
    <property name="driverClassName" 
                value="${dataSource.driverClassName}"/>
    <property name="url" value="${dataSource.url}"/>
    <property name="username" value="${dataSource.username}"/>
    <property name="password" value="${dataSource.password}"/>
</bean>

2. 在Dao中通过自动注入初始化JdbcTemplate 

private JdbcTemplate jdbcTemplate;
    @Autowired
    public void setDataSource(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
}

3. 使用jdbctemplate

public void add(User user) {
        jdbcTemplate.update("insert into tb_user(name, sex, age) value(?,?,?)",
                user.getName(), user.getSex(), user.getAge());
}
public User load(int id) {
    User user = jdbcTemplate.queryForObject("select id, name, sex, age from tb_user where id=?",
              new Object[]{id}, new UserMapper());
    return user;
}

 这里的UserMapper是一个手动映射,基于Spring的RowMapper,User为实体类型      

private static final class UserMapper implements RowMapper<User> {
        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            user.setSex(rs.getString("sex"));
            user.setAge(rs.getInt("age"));
            return user;
        }
    }

   返回值为int类型:       

   int countOfActorsNamedJoe = this.jdbcTemplate.queryForObject(
        "select count(*) from t_actor where first_name = ?", Integer.class, "Joe");

  在insert之后,如果想要在当前对象中,立刻得到主键id值,jdbctemplate就会比较麻烦 

  有两种方法: 

  1. 使用PreparedStatementCreator     

public void add(final User user) {
        KeyHolder keyHolder = new GeneratedKeyHolder();
        final String sql = "insert into tb_user(name, sex, age) value(?,?,?)";
        jdbcTemplate.update(
                new PreparedStatementCreator() {
                    public PreparedStatement createPreparedStatement(Connection connection)
                            throws SQLException {
                        PreparedStatement ps = connection.prepareStatement(sql, new String[] {"id"});
                        ps.setString(1, user.getName());
                        ps.setString(2, user.getSex());
                        ps.setInt(3, user.getAge());
                        return ps;
                    }
                },
                keyHolder);
        user.setId( keyHolder.getKey().intValue());
    }

2. 使用SimpleJdbcInsert 

private JdbcTemplate jdbcTemplate;
  private SimpleJdbcInsert insertActor;
    @Autowired
    public void setDataSource(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
        this.insertActor = new SimpleJdbcInsert(dataSource)
                .withTableName("tb_user")
                .usingGeneratedKeyColumns("id");
    }
  public void add2(User user){
        Map<String, Object> parameters = new HashMap<String, Object>(2);
        parameters.put("name", user.getName());
        parameters.put("sex", user.getSex());
        parameters.put("age", user.getAge());
        Number newId = insertActor.executeAndReturnKey(parameters);
        user.setId(newId.intValue());
    }

具体用哪一种,根据个人喜好

4. 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/application-context.xml") 
//加入这两种注解,就可以直接在测试中使用spring bean,而不用使用ClassPathResource来加载配置文件
public class UserDaoTest {
    @Autowired
    UserDao userDao;
    @Test
    public void testAdd() throws Exception {
            User user = new User("phnix", "m", 25);
            userDao.add(user);
    }
    @Test
    public void testLoad(){
        User user = userDao.load(1);
        System.out.println(user.getName());
    }
}



你可能感兴趣的:(spring,jdbc)