/* * Copyright 2009-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License i distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.paoding.rose.jade.dataaccess; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapperResultSetExtractor; import org.springframework.jdbc.core.SqlParameterValue; import org.springframework.jdbc.core.SqlTypeValue; import org.springframework.jdbc.core.StatementCreatorUtils; import org.springframework.jdbc.support.KeyHolder; /** * * @author 王志亮 [qieqie.wang@gmail.com] * @author 廖涵 [in355hz@gmail.com] */ public class DataAccessImpl implements DataAccess { private final JdbcTemplate jdbcTemplate; public DataAccessImpl(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } // ------------------------------------------------ public DataSource getDataSource() { return this.jdbcTemplate.getDataSource(); } @Override public <T> List<T> select(String sql, Object[] args, RowMapper<T> rowMapper) { PreparedStatementCreator csc = getPreparedStatementCreator(sql, args, false); return jdbcTemplate.query(csc, new RowMapperResultSetExtractor<T>(rowMapper)); } @Override public int update(String sql, Object[] args, KeyHolder generatedKeyHolder) { boolean returnKeys = generatedKeyHolder != null; PreparedStatementCreator psc = getPreparedStatementCreator(sql, args, returnKeys); if (generatedKeyHolder == null) { return jdbcTemplate.update(psc); } else { return jdbcTemplate.update(psc, generatedKeyHolder); } } @Override public int[] batchUpdate(String sql, List<Object[]> batchArgs) { return jdbcTemplate.batchUpdate(sql, batchArgs); } private PreparedStatementCreator getPreparedStatementCreator(// final String sql, final Object[] args, final boolean returnKeys) { PreparedStatementCreator creator = new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection con) throws SQLException { PreparedStatement ps = con.prepareStatement(sql); if (returnKeys) { ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); } else { ps = con.prepareStatement(sql); } if (args != null) { for (int i = 0; i < args.length; i++) { Object arg = args[i]; if (arg instanceof SqlParameterValue) { SqlParameterValue paramValue = (SqlParameterValue) arg; StatementCreatorUtils.setParameterValue(ps, i + 1, paramValue, paramValue.getValue()); } else { StatementCreatorUtils.setParameterValue(ps, i + 1, SqlTypeValue.TYPE_UNKNOWN, arg); } } } return ps; } }; return creator; } }