如果是个小项目,不想使用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()); }
@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()); } }