package org.springside.examples.showcase.common.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Arrays; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.sql.DataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionTemplate; import org.springside.examples.showcase.common.entity.User; import org.springside.modules.utils.VelocityUtils; import com.google.common.collect.Maps; /** * User对象的Jdbc Dao, 演示Spring JdbcTemplate的使用. * * @author calvin */ @Component public class UserJdbcDao { private static final String QUERY_USER_BY_ID = "select id, name, login_name from SS_USER where id=?"; private static final String QUERY_USER_BY_IDS = "select id, name, login_name from SS_USER where id in(:ids)"; private static final String QUERY_USER = "select id, name, login_name from SS_USER order by id"; private static final String QUERY_USER_BY_LOGINNAME = "select id,name,login_name from SS_USER where login_name=:login_name"; private static final String INSERT_USER = "insert into SS_USER(id, login_name, name) values(:id, :loginName, :name)"; private static Logger logger = LoggerFactory.getLogger(UserJdbcDao.class); private SimpleJdbcTemplate jdbcTemplate; private TransactionTemplate transactionTemplate; private String searchUserSql; private UserMapper userMapper = new UserMapper(); private class UserMapper implements RowMapper<User> { public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getString("id")); user.setName(rs.getString("name")); user.setLoginName(rs.getString("login_name")); return user; } } @Resource public void setDataSource(DataSource dataSource) { jdbcTemplate = new SimpleJdbcTemplate(dataSource); } @Resource public void setDefaultTransactionManager(PlatformTransactionManager defaultTransactionManager) { transactionTemplate = new TransactionTemplate(defaultTransactionManager); } public void setSearchUserSql(String searchUserSql) { this.searchUserSql = searchUserSql; } /** * 查询单个对象. */ public User queryObject(String id) { return jdbcTemplate.queryForObject(QUERY_USER_BY_ID, userMapper, id); } /** * 查询对象列表. */ public List<User> queryObjectList() { return jdbcTemplate.query(QUERY_USER, userMapper); } /** * 查询单个结果Map. */ public Map<String, Object> queryMap(Long id) { return jdbcTemplate.queryForMap(QUERY_USER_BY_ID, id); } /** * 查询结果Map列表. */ public List<Map<String, Object>> queryMapList() { return jdbcTemplate.queryForList(QUERY_USER); } /** * 使用Map形式的命名参数. */ public User queryByNamedParameter(String loginName) { Map<String, Object> map = Maps.newHashMap(); map.put("login_name", loginName); return jdbcTemplate.queryForObject(QUERY_USER_BY_LOGINNAME, userMapper, map); } /** * 使用Map形式的命名参数. */ public List<User> queryByNamedParameterWithInClause(Long... ids) { Map<String, Object> map = Maps.newHashMap(); map.put("ids", Arrays.asList(ids)); return jdbcTemplate.query(QUERY_USER_BY_IDS, userMapper, map); } /** * 使用Bean形式的命名参数, Bean的属性名称应与命名参数一致. */ public void createObject(User user) { //使用BeanPropertySqlParameterSource将User的属性映射为命名参数. BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(user); jdbcTemplate.update(INSERT_USER, source); } /** * 批量创建/更新对象,使用Bean形式的命名参数. */ public void batchCreateObject(List<User> userList) { int i = 0; BeanPropertySqlParameterSource[] sourceArray = new BeanPropertySqlParameterSource[userList.size()]; for (User user : userList) { sourceArray[i++] = new BeanPropertySqlParameterSource(user); } jdbcTemplate.batchUpdate(INSERT_USER, sourceArray); } /** * 使用freemarker创建动态SQL. */ public List<User> searchUserByFreemarkerSqlTemplate(Map<String, ?> conditions) { String sql = VelocityUtils.render(searchUserSql, conditions); logger.info(sql); return jdbcTemplate.query(sql, userMapper, conditions); } /** * 使用TransactionTemplate编程控制事务,一般在Manager/Service层 * 无返回值的情形. */ public void createUserInTransaction(User user) { final BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(user); transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override public void doInTransactionWithoutResult(TransactionStatus status) { jdbcTemplate.update(INSERT_USER, source); } }); } /** * 使用TransactionTemplate编程控制事务,一般在Manager/Service层 * 有返回值的情形,并捕获异常进行处理不再抛出的情形. */ public boolean createUserInTransaction2(User user) { final BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(user); return transactionTemplate.execute(new TransactionCallback<Boolean>() { public Boolean doInTransaction(TransactionStatus status) { try { jdbcTemplate.update(INSERT_USER, source); return true; } catch (Exception e) { logger.error(e.getMessage(), e); status.setRollbackOnly(); return false; } } }); } }