Java tutorial
/* * Copyright 2012 Eng Kam Hon (kamhon@gmail.com) * * 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 is 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.kamhon.ieagle.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List; import net.kamhon.ieagle.datagrid.DatagridModel; import net.kamhon.ieagle.jdbc.SingleRowMapper; import net.kamhon.ieagle.util.CollectionUtil; import net.kamhon.ieagle.util.DaoUtil; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Required; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.support.JdbcDaoSupport; /** * <p> * This is a wrapper class for {@link JdbcDaoSupport} in Spring JDBC. There are a variable {@link JdbcDao} is extends * {@link JdbcDaoSupport}. So, indirectly this class will manipulate database with {@link JdbcTemplate}. * </p> * <p> * Basically, the function is mimic the function in {@link JdbcTemplate}, like * {@link #queryForInt(String, int[], Object...)}, this mimic from * {@link JdbcTemplate#queryForInt(String, Object[], int[])}, but the parameters re-arrange for conveniency * </p> * * @author kamhon * */ public class AbstractJdbcDao { public static final String FILTER_PARAMS = BasicDao.FILTER_PARAMS; private JdbcDao jdbcDao; private String fromSchema; private String toSchema; public String replace(String sql) { if (StringUtils.isNotBlank(fromSchema) && StringUtils.isNotBlank(toSchema)) { sql = StringUtils.replace(sql, fromSchema, toSchema); } return sql; } public String performDateOperation(String fieldName, String operator, Date... dates) { return jdbcDao.performDateOperation(fieldName, operator, dates); } @Required @Autowired public void setJdbcDao(JdbcDao jdbcDao) { this.jdbcDao = jdbcDao; } /** * Enhance the {@link #query(String, RowMapper, Object...)} which this return 1 object only. * * @param sql * @param rowMapper * @param params * @return * @see #query(String, RowMapper, Object...) */ public <T> T queryForSingleRow(String sql, SingleRowMapper<T> rowMapper, Object... params) { List<T> result = new ArrayList<T>(); result = (List<T>) jdbcDao.query(sql, rowMapper, params); if (CollectionUtil.isNotEmpty(result)) return result.get(0); else return null; } /** * Enhance the {@link #query(String, RowMapper)} which this return 1 object only. * * @param sql * @param rowMapper * @return * @see #query(String, RowMapper) */ public <T> T queryForSingleRow(String sql, SingleRowMapper<T> rowMapper) { List<T> result = new ArrayList<T>(); result = (List<T>) jdbcDao.query(sql, rowMapper); if (CollectionUtil.isNotEmpty(result)) return result.get(0); else return null; } public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... params) { return jdbcDao.query(replace(sql), rowMapper, params); } /** * * @param <T> * @param datagridModel * @param sql * @param rowMapper * @param params */ protected <T> void queryForDatagrid(DatagridModel<T> datagridModel, String sql, RowMapper<T> rowMapper, Object... params) { jdbcDao.queryForDatagrid(datagridModel, sql, rowMapper, params); } public <T> List<T> query(String sql, RowMapper<T> rowMapper) { return jdbcDao.query(replace(sql), rowMapper); } public int queryForInt(String sql) { return jdbcDao.queryForInt(replace(sql)); } public int queryForInt(String sql, Object... params) { return jdbcDao.queryForInt(replace(sql), params); } public int queryForInt(String sql, int[] argTypes, Object... params) { return jdbcDao.queryForInt(replace(sql), argTypes, params); } public List<?> queryForList(String sql) { return jdbcDao.queryForList(replace(sql)); } public List<?> queryForList(String sql, Object... params) { return jdbcDao.queryForList(replace(sql), params); } public List<?> queryForList(String sql, int[] argTypes, Object... params) { return jdbcDao.queryForList(replace(sql), argTypes, params); } public long queryForLong(String sql) { return jdbcDao.queryForLong(replace(sql)); } public long queryForLong(String sql, Object... params) { return jdbcDao.queryForLong(replace(sql), params); } public long queryForLong(String sql, int[] argTypes, Object... params) { return jdbcDao.queryForLong(replace(sql), argTypes, params); } public String queryForString(String sql) { try { // return jdbcDao.queryForString(replace(sql)); return queryForSingleRow(sql, new SingleRowMapper<String>() { @Override public String onMapRow(ResultSet resultSet, int rowNum) throws SQLException { return resultSet.getString(1); } }); } catch (EmptyResultDataAccessException ex) { return null; } } public String queryForString(String sql, Object... params) { try { // return jdbcDao.queryForString(replace(sql), params); return queryForSingleRow(sql, new SingleRowMapper<String>() { @Override public String onMapRow(ResultSet resultSet, int rowNum) throws SQLException { return resultSet.getString(1); } }, params); } catch (EmptyResultDataAccessException ex) { return null; } } @Deprecated public String queryForString(String sql, int[] argTypes, Object... params) { try { return jdbcDao.queryForString(replace(sql), argTypes, params); } catch (EmptyResultDataAccessException ex) { return null; } } public Object queryForObject(String sql, Class<?> requiredType) { try { return jdbcDao.queryForObject(replace(sql), requiredType); } catch (EmptyResultDataAccessException ex) { return null; } } public Object queryForObject(String sql, Class<?> requiredType, Object... params) { try { return jdbcDao.queryForObject(replace(sql), requiredType, params); } catch (EmptyResultDataAccessException ex) { return null; } } /** * Issue a single SQL update operation (such as an insert, update or delete statement) via a prepared statement, * binding the given arguments. * * @param sql * @return */ public int update(String sql) { return jdbcDao.update(replace(sql)); } /** * Issue a single SQL update operation (such as an insert, update or delete statement) via a prepared statement, * binding the given arguments. * * @param sql * @param params * @return */ public int update(String sql, Object... params) { return jdbcDao.update(replace(sql), params); } /** * Issue a single SQL update operation (such as an insert, update or delete statement) via a prepared statement, * binding the given arguments. * * @param sql * @param argTypes * @param params * @return */ public int update(String sql, int[] argTypes, Object... params) { return jdbcDao.update(replace(sql), argTypes, params); } public String getFromSchema() { return fromSchema; } public void setFromSchema(String fromSchema) { this.fromSchema = fromSchema; } public String getToSchema() { return toSchema; } public void setToSchema(String toSchema) { this.toSchema = toSchema; } public String appendInCondition(String field, int size) { return DaoUtil.appendInCondition(field, size); } }