package com.tianjian.property.dao;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.*;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapperResultSetExtractor;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import com.tianjian.property.constant.Constant;
import com.tianjian.property.entity.common.Pagination;
import com.tianjian.property.entity.common.Table;
import com.tianjian.property.util.StringUtil;
public abstract class BaseDao<T, PK> {
private final static Logger log = Logger.getLogger(BaseDao.class.getName());
@Autowired
protected JdbcTemplate template = null;
protected Table<T, PK> table = null;
protected NamedParameterJdbcTemplate namedJdbcTemplate;
/** 设置一些操作的常量 */
public static final String SQL_INSERT = "insert";
public static final String SQL_UPDATE = "update";
public static final String SQL_DELETE = "delete";
@Autowired
public void setDataSource(DataSource dataSource) {
this.namedJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public BaseDao() {
}
public Table<T, PK> getTable() {
return table;
}
public void setTable(Table<T, PK> table) {
this.table = table;
}
public JdbcTemplate getTemplate() {
return template;
}
public void setTemplate(JdbcTemplate template) {
this.template = template;
}
public T save(T entity) {
final KeyHolder keyHolder = new GeneratedKeyHolder();
String sql = this.makeSql(SQL_INSERT);
Object[] args = this.setArgs(entity, SQL_INSERT);
if (getTable().getAutoGeneratePK()) {
template.update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
for (int i = 0; i < args.length; i++) {
setPrepareStatementParameters(args, ps, i);
}
return ps;
}
private void setPrepareStatementParameters(Object[] args, PreparedStatement ps, int i)
throws SQLException {
if (args[i] != null) {
if (args[i].getClass().getName().equals("java.lang.String")) {
ps.setString(i + 1, (String) args[i]);
} else if (args[i].getClass().getName().equals("java.lang.Double")) {
ps.setDouble(i + 1, (Double) args[i]);
} else if (args[i].getClass().getName().equals("java.math.BigDecimal")) {
ps.setBigDecimal(i + 1, (BigDecimal) args[i]);
} else if (args[i].getClass().getName().equals("java.lang.Integer")) {
ps.setInt(i + 1, (Integer) args[i]);
} else if (args[i].getClass().getName().equals("java.sql.Date")) {
ps.setDate(i + 1, (Date) args[i]);
} else if (args[i].getClass().getName().equals("java.sql.Timestamp")) {
ps.setTimestamp(i + 1, (Timestamp) args[i]);
} else {
ps.setObject(i + 1, args[i]);
}
} else {
ps.setObject(i + 1, null);
}
}
}, keyHolder);
getTable().setID(entity, keyHolder.getKey());
} else {
int[] argTypes = this.setArgTypes(entity, SQL_INSERT);
template.update(sql.toString(), args, argTypes);
}
return entity;
}
public int[] batchSave(List<T> list) {
String sql = this.makeSql(SQL_INSERT);
List<Object[]> batchArgs = new ArrayList<>();
for (T entity : list) {
Object[] args = this.setArgs(entity, SQL_INSERT);
batchArgs.add(args);
}
int[] argTypes = this.setArgTypes(list.get(0), SQL_INSERT);
int[] counts = template.batchUpdate(sql, batchArgs, argTypes);
return counts;
}
public int[] batchUpdate(List<T> list) {
String sql = this.makeSql(SQL_UPDATE);
List<Object[]> batchArgs = new ArrayList<>();
for (T entity : list) {
Object[] args = this.setArgs(entity, SQL_UPDATE);
batchArgs.add(args);
}
int[] argTypes = this.setArgTypes(list.get(0), SQL_UPDATE);
int[] counts = template.batchUpdate(sql, batchArgs, argTypes);
return counts;
}
public int update(T entity) {
String sql = this.makeSql(SQL_UPDATE);
Object[] args = this.setArgs(entity, SQL_UPDATE);
int[] argTypes = this.setArgTypes(entity, SQL_UPDATE);
return template.update(sql, args, argTypes);
}
public int deleteItem(T entity) {
String sql = getTable().createDeleteSql(entity);
Object[] args = this.setArgs(entity, SQL_DELETE);
int[] argTypes = this.setArgTypes(entity, SQL_DELETE);
return template.update(sql, args, argTypes);
}
public int delete(PK... pkValue) {
String sql = this.makeSql(SQL_DELETE);
return template.update(sql, pkValue);
}
public void deleteAll() {
String sql = " TRUNCATE TABLE " + getTable().getTableName();
template.execute(sql);
}
public T getByID(PK... pkValue) {
String sql = getTable().createSearchSqlByPKValue(pkValue);
//log.info(sql);
List<T> list = null;
try {
list = template.query(sql, pkValue, new RowMapperResultSetExtractor<T>(getTable().getRowMapper()));
return (null != list && list.size() == 1 ? list.get(0) : null);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public List<T> searchAll() {
String sql = "SELECT * FROM " + getTable().getTableName();
return template.query(sql, new RowMapperResultSetExtractor<T>(getTable().getRowMapper()));
}
/**
* 327
* @return
*/
public List<T> searchDept(String deptCode) {
String sql = "SELECT * FROM " + getTable().getTableName()+" where Parent='147ed331b4470ff6d4758594040b57de' and isAvailable=1";
if(""!=deptCode && null!=deptCode){
sql = "SELECT * FROM " + getTable().getTableName()+" where Parent='"+deptCode+"' and isAvailable=1";
}
return template.query(sql, new RowMapperResultSetExtractor<T>(getTable().getRowMapper()));
}
public List<T> searchAll(String orderBy) {
String sql = "SELECT * FROM " + getTable().getTableName() + orderBy;
return template.query(sql, new RowMapperResultSetExtractor<T>(getTable().getRowMapper()));
}
public List<T> search(String where, List<Object> parameters) {
where = where == null ? "" : where;
StringBuffer sql = new StringBuffer("SELECT * FROM " + getTable().getTableName() + " WHERE 1=1 ").append(where);
List<T> resultList = null;
try {
if (!"".equals(where))
resultList = template.query(sql.toString(), parameters.toArray(),
new RowMapperResultSetExtractor<T>(getTable().getRowMapper()));
else
resultList = template.query(sql.toString(),
new RowMapperResultSetExtractor<T>(getTable().getRowMapper()));
} catch (Exception e) {
e.printStackTrace();
}
return resultList;
}
public int updateBySql(String sql, Object[] parameters) {
int num = 0;
try {
if (parameters == null || parameters.length == 0)
num = template.update(sql);
else
num = template.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
for (int i = 0; i < parameters.length; i++)
ps.setObject(i + 1, parameters[i]);
}
});
} catch (Exception e) {
e.printStackTrace();
num = -1;
}
return num;
}
public int[] batchUpdateByNamedSql(String sql, List<T> list) {
int[] updateCounts = null;
SqlParameterSource[] sqlParameterSource = SqlParameterSourceUtils.createBatch(list.toArray());
updateCounts = namedJdbcTemplate.batchUpdate(sql, sqlParameterSource);
return updateCounts;
}
public List<Map<String, Object>> searchBySql(String sql, Object[] params) {
return template.queryForList(sql, params);
}
public List<T> searchBySql(String sql, Object[] parameters, Class<T> cl) {
List<T> resultList = null;
try {
if (parameters != null && parameters.length > 0)
resultList = template.query(sql, parameters, new BeanPropertyRowMapper<T>(cl));
else
resultList = template.query(sql, new BeanPropertyRowMapper<T>(cl));
} catch (Exception e) {
e.printStackTrace();
}
return resultList;
}
public Pagination<Map<String, Object>> searchPageBySql(Integer page, Integer limit, String sql, String countSql,
List<Object> parameters) {
parameters = parameters == null ? new ArrayList<>() : parameters;
int totalCount = 0;
if (parameters != null && parameters.size() > 0)
totalCount = template.queryForObject(countSql, parameters.toArray(), Integer.class);
else
totalCount = template.queryForObject(countSql, Integer.class);
sql+= ")T where rownumber > ? ";
parameters.add((page - 1) * limit);
List<Map<String, Object>> list = null;
if (totalCount < 1) {
final Pagination<Map<String, Object>> finder = new Pagination<Map<String, Object>>(page, limit, totalCount);
finder.setData(new ArrayList());
return finder;
} else {
final Pagination<Map<String, Object>> finder = new Pagination<Map<String, Object>>(page, limit, totalCount);
list = this.searchBySql(sql, parameters.toArray());
finder.setData(list);
return finder;
}
}
public Pagination<T> searchPageBySql(Integer page, Integer limit, String sql, String countSql,
List<Object> parameters, Class<T> cl) {
parameters = parameters == null ? new ArrayList<>() : parameters;
int totalCount = 0;
if (parameters != null && parameters.size() > 0)
totalCount = template.queryForObject(countSql, parameters.toArray(), Integer.class);
else
totalCount = template.queryForObject(countSql, Integer.class);
sql+= ")T where rownumber > ? ";
//log.info("验证码查询执行sql--"+sql);
parameters.add((page - 1) * limit);
List<T> list = null;
if (totalCount < 1) {
final Pagination<T> finder = new Pagination<T>(page, limit, totalCount);
finder.setData(new ArrayList<T>());
return finder;
} else {
final Pagination<T> finder = new Pagination<T>(page, limit, totalCount);
list = this.searchBySql(sql, parameters.toArray(), cl);
finder.setData(list);
return finder;
}
}
public Pagination<T> searchPage(Integer page, Integer limit, String condition, List<Object> parameters) {
int totalCount = this.count(condition, parameters);
List<T> list = null;
if (totalCount < 1) {
final Pagination<T> finder = new Pagination<T>(page, limit, totalCount);
finder.setData(new ArrayList<T>());
return finder;
} else {
final Pagination<T> finder = new Pagination<T>(page, limit, totalCount);
list = this.search(page, limit, condition, parameters, null);
finder.setData(list);
return finder;
}
}
public Pagination<T> searchPage(Integer page, Integer limit, LinkedHashMap<String, String> orderby) {
int totalCount = this.count();
if (totalCount < 1) {
final Pagination<T> finder = new Pagination<T>(page, limit, totalCount);
finder.setData(new ArrayList<T>());
return finder;
} else {
final Pagination<T> finder = new Pagination<T>(page, limit, totalCount);
List<T> list = this.search(page, limit, "", null, orderby);
finder.setData(list);
return finder;
}
}
public Pagination<T> searchPage(Integer page, Integer limit, String condition, List<Object> parameters,
LinkedHashMap<String, String> orderby) {
int totalCount = this.count(condition, parameters);
if (totalCount < 1) {
final Pagination<T> finder = new Pagination<T>(page, limit, totalCount);
finder.setData(new ArrayList<T>());
return finder;
} else {
final Pagination<T> finder = new Pagination<T>(page, limit, totalCount);
List<T> list = this.search(page, limit, condition, parameters, orderby);
finder.setData(list);
return finder;
}
}
public int count() {
String sql = " SELECT COUNT(1) FROM " + getTable().getTableName();
return template.queryForObject(sql, Integer.class);
}
public int count(String condition, List<Object> parameters) {
if (condition == null || "".equals(condition)) {
return count();
}
String sql = " SELECT COUNT(1) FROM " + getTable().getTableName() + " WHERE 1=1 " + condition;
return template.queryForObject(sql, parameters.toArray(), Integer.class);
}
private String makeSql(String sqlFlag) {
StringBuffer sql = new StringBuffer();
Field[] fields = getTable().getBeanClass().getDeclaredFields();
if (sqlFlag.equals(SQL_INSERT)) {
sql.append(" INSERT INTO " + getTable().getTableName());
sql.append("(");
for (int i = 0; fields != null && i < fields.length; i++) {
if (fields[i].getName().equals("serialVersionUID")
|| (getTable().getAutoGeneratePK()
&& fields[i].getName().compareToIgnoreCase(getTable().getTableKey()[0]) == 0)
|| StringUtil.contains(fields[i].getName(), getTable().getNotDatabaseField())) {
continue;
}
fields[i].setAccessible(true); // 暴力反射
String column = fields[i].getName();
sql.append(column).append(",");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(") VALUES (");
for (int i = 0; fields != null && i < fields.length; i++) {
if (fields[i].getName().equals("serialVersionUID")
|| (getTable().getAutoGeneratePK()
&& fields[i].getName().compareToIgnoreCase(getTable().getTableKey()[0]) == 0)
|| StringUtil.contains(fields[i].getName(), getTable().getNotDatabaseField())) {
continue;
}
sql.append("?,");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(")");
} else if (sqlFlag.equals(SQL_UPDATE)) {
sql.append(" UPDATE " + getTable().getTableName() + " SET ");
for (int i = 0; fields != null && i < fields.length; i++) {
if (fields[i].getName().equals("serialVersionUID")
|| (getTable().getAutoGeneratePK()
&& fields[i].getName().compareToIgnoreCase(getTable().getTableKey()[0]) == 0)
|| StringUtil.contains(fields[i].getName(), getTable().getNotDatabaseField())) {
continue;
}
fields[i].setAccessible(true); // 暴力反射
String column = fields[i].getName();
sql.append(column).append("=").append("?,");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(" WHERE 1=1 ");
for (String key : getTable().getTableKey()) {
sql.append(" AND ").append(key).append(" = ?");
}
} else if (sqlFlag.equals(SQL_DELETE)) {
sql.append(" DELETE FROM " + getTable().getTableName());
sql.append(" WHERE 1=1 ");
for (String key : getTable().getTableKey()) {
sql.append(" AND ").append(key).append(" = ?");
}
}
//log.debug("SQL=" + sql);
return sql.toString();
}
// 设置参数
private Object[] setArgs(T entity, String sqlFlag) {
Field[] fields = getTable().getBeanClass().getDeclaredFields();
if (sqlFlag.equals(SQL_INSERT)) {
List<Object> args = new ArrayList<>();
try {
for (int i = 0; fields != null && i < fields.length; i++) {
if (fields[i].getName().equals("serialVersionUID")
|| (getTable().getAutoGeneratePK()
&& fields[i].getName().compareToIgnoreCase(getTable().getTableKey()[0]) == 0)
|| StringUtil.contains(fields[i].getName(), getTable().getNotDatabaseField())) {
continue;
}
fields[i].setAccessible(true); // 暴力反射
args.add(fields[i].get(entity));
}
} catch (Exception e) {
e.printStackTrace();
}
return args.toArray();
} else if (sqlFlag.equals(SQL_UPDATE)) {
List<Object> args = new ArrayList<>();
try {
for (int i = 0; fields != null && i < fields.length; i++) {
if (fields[i].getName().equals("serialVersionUID")
|| (getTable().getAutoGeneratePK()
&& fields[i].getName().compareToIgnoreCase(getTable().getTableKey()[0]) == 0)
|| StringUtil.contains(fields[i].getName(), getTable().getNotDatabaseField())) {
continue;
}
fields[i].setAccessible(true); // 暴力反射
args.add(fields[i].get(entity));
}
for (Field field : fields) {
for (String key : getTable().getTableKey()) {
field.setAccessible(true); // 暴力反射
if (key.equals(field.getName()))
args.add(field.get(entity));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return args.toArray();
} else if (sqlFlag.equals(SQL_DELETE)) {
List<Object> args = new ArrayList<>();
try {
for (Field field : fields) {
for (String key : getTable().getTableKey()) {
if (key.equals(field))
args.add(field.get(entity));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return args.toArray();
}
return null;
}
private int[] setArgTypes(T entity, String sqlFlag) {
Field[] fields = getTable().getBeanClass().getDeclaredFields();
if (sqlFlag.equals(SQL_INSERT)) {
List<Integer> argTypes = new ArrayList<>();
try {
for (int i = 0; fields != null && i < fields.length; i++) {
if (fields[i].getName().equals("serialVersionUID")
|| (getTable().getAutoGeneratePK()
&& fields[i].getName().compareToIgnoreCase(getTable().getTableKey()[0]) == 0)
|| StringUtil.contains(fields[i].getName(), getTable().getNotDatabaseField())) {
continue;
}
fields[i].setAccessible(true); // 暴力反射=
if (fields[i].get(entity) != null) {
if (fields[i].get(entity).getClass().getName().equals("java.lang.String")) {
argTypes.add(Types.VARCHAR);
} else if (fields[i].get(entity).getClass().getName().equals("java.lang.Double")) {
argTypes.add(Types.DECIMAL);
} else if (fields[i].get(entity).getClass().getName().equals("java.math.BigDecimal")) {
argTypes.add(Types.DECIMAL);
} else if (fields[i].get(entity).getClass().getName().equals("java.lang.Integer")) {
argTypes.add(Types.INTEGER);
} else if (fields[i].get(entity).getClass().getName().equals("java.sql.Date")) {
argTypes.add(Types.DATE);
} else if (fields[i].get(entity).getClass().getName().equals("java.sql.Timestamp")) {
argTypes.add(Types.TIMESTAMP);
} else {
argTypes.add(Types.OTHER);
}
} else {
argTypes.add(Types.JAVA_OBJECT);
}
}
} catch (Exception e) {
e.printStackTrace();
}
int[] argType = new int[argTypes.size()];
for (int i = 0; argTypes != null && i < argTypes.size(); i++) {
argType[i] = argTypes.get(i);
}
return argType;
} else if (sqlFlag.equals(SQL_UPDATE)) {
List<Integer> argTypes = new ArrayList<>();
try {
for (int i = 0; fields != null && i < fields.length; i++) {
if (fields[i].getName().equals("serialVersionUID")
|| (getTable().getAutoGeneratePK()
&& fields[i].getName().compareToIgnoreCase(getTable().getTableKey()[0]) == 0)
|| StringUtil.contains(fields[i].getName(), getTable().getNotDatabaseField())) {
continue;
}
fields[i].setAccessible(true); // 暴力反射=
if (fields[i].get(entity) != null) {
if (fields[i].get(entity).getClass().getName().equals("java.lang.String")) {
argTypes.add(Types.VARCHAR);
} else if (fields[i].get(entity).getClass().getName().equals("java.lang.Double")) {
argTypes.add(Types.DECIMAL);
} else if (fields[i].get(entity).getClass().getName().equals("java.math.BigDecimal")) {
argTypes.add(Types.DECIMAL);
} else if (fields[i].get(entity).getClass().getName().equals("java.lang.Integer")) {
argTypes.add(Types.INTEGER);
} else if (fields[i].get(entity).getClass().getName().equals("java.sql.Date")) {
argTypes.add(Types.DATE);
} else if (fields[i].get(entity).getClass().getName().equals("java.sql.Timestamp")) {
argTypes.add(Types.TIMESTAMP);
} else {
argTypes.add(Types.OTHER);
}
} else {
argTypes.add(Types.JAVA_OBJECT);
}
}
} catch (Exception e) {
e.printStackTrace();
}
for (String key : getTable().getTableKey()) {
if (key.getClass().getName().equals("java.lang.String")) {
argTypes.add(Types.VARCHAR);
} else if (key.getClass().getName().equals("java.lang.Integer")) {
argTypes.add(Types.INTEGER);
} else if (key.getClass().getName().equals("java.lang.Long")) {
argTypes.add(Types.BIGINT);
}
}
int[] argType = new int[argTypes.size()];
for (int i = 0; argTypes != null && i < argTypes.size(); i++) {
argType[i] = argTypes.get(i);
}
return argType;
} else if (sqlFlag.equals(SQL_DELETE)) {
int[] argTypes = new int[getTable().getTableKey().length]; // 长度是1
try {
for (int i = 0; i < getTable().getTableKey().length; i++) {
if (getTable().getTableKey().getClass().getName().equals("java.lang.String")) {
argTypes[0] = Types.VARCHAR;
} else if (getTable().getTableKey().getClass().getName().equals("java.lang.Integer")) {
argTypes[0] = Types.INTEGER;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return argTypes;
}
return null;
}
private List<T> search(int page, int limit, String where, List<Object> parameters,
LinkedHashMap<String, String> orderby) {
parameters = parameters == null ? new ArrayList<>() : parameters;
StringBuffer sql = new StringBuffer("select top ").append(limit).append(" * from (select row_number() over(order by ")
.append(getTable().getTableKey()[0])
.append(") as rownumber,* from ")
.append(getTable().getTableName())
.append(" where 1=1 ").append(where).append(")T where rownumber > ? ");
parameters.add((page - 1) * limit);
if (orderby != null && orderby.size() > 0) {
sql.append(" ORDER BY ");
for (Map.Entry<String, String> me : orderby.entrySet()) {
String columnName = me.getKey();
String columnValue = me.getValue();
sql.append(columnName).append(" ").append(columnValue).append(",");
}
sql = sql.deleteCharAt(sql.length() - 1);
}
return template.query(sql.toString(), parameters.toArray(),
new RowMapperResultSetExtractor<T>(getTable().getRowMapper()));
}
public Pagination<T> paginationForMSSQL(String tableName,String condition, Map<String, Object> paramMap, Integer page, Integer limit, LinkedHashMap<String, String> orderBy) {
paramMap.put("OFFSET", (page - 1) * limit);
paramMap.put("LIMIT", limit);
String countSql = "SELECT COUNT(1) FROM " + tableName + " WHERE 1 = 1 " + condition;
Integer count = this.namedJdbcTemplate.queryForObject(countSql, paramMap, Integer.class);
int intStartRow = (page - 1) * limit + 1;
int intEndRow = page * limit;
String FieldOrder="";
Iterator<String> it=orderBy.keySet().iterator();
while(it.hasNext()){
if("".equals(FieldOrder)||FieldOrder==""){
String key=it.next();
String value=orderBy.get(key);
FieldOrder=FieldOrder+key+" "+value+" ";
}else{
FieldOrder=FieldOrder+",";
String key=it.next();
String value=orderBy.get(key);
FieldOrder=FieldOrder+key+" "+value+" ";
}
}
String strTableSql = "(select * ,row_number() over(order by " + FieldOrder + ") as row from " + tableName + " where 1=1 " + condition + ") as temp";
String strPageSql = "select * from " + strTableSql + " where row between " + intStartRow + " and " + intEndRow;
List<T> result=this.namedJdbcTemplate.query(strPageSql.toString(), paramMap, getTable().getRowMapper());
return new Pagination<>(page, limit, count, result);
}
public Long getAutoIncreaseId(){
String sql = "SELECT @@identity";
return this.namedJdbcTemplate.queryForObject(sql, Collections.EMPTY_MAP, Long.class);
}
public List<T> searchDeptCode(String deptCode) {
String sql = "SELECT * FROM " + getTable().getTableName() +" where Parent='"+deptCode+"' and isAvailable=1";
return template.query(sql, new RowMapperResultSetExtractor<T>(getTable().getRowMapper()));
}
}
Dao层继承及覆写
package com.tianjian.property.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import com.tianjian.property.constant.Constant;
import com.tianjian.property.util.CommonUtil;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Repository;
import com.tianjian.property.entity.Activity;
import com.tianjian.property.entity.common.Pagination;
import com.tianjian.property.entity.common.Table;
import com.tianjian.property.util.BeanUtils;
import com.tianjian.property.util.StringUtil;
@Repository
public class ActivityDao extends BaseDao<Activity, Integer> {
private Table<Activity, Integer> table = new Table<>(Activity.class,
new BeanPropertyRowMapper<Activity>(Activity.class), "t_Activity", false, new String[] { "id" },
new String[] { "activityType", "defaultPicPath", "addBy", "propertyName", "city", "county" });
@Override
public Table<Activity, Integer> getTable() {
return this.table;
}
public Pagination<Activity> getActivities(Integer cityId, Integer countyId, String propertyId,
Integer activityTypeId, Integer adminId, String title, Integer isClose, Integer page, Integer limit) {
StringBuilder condition = new StringBuilder();
String sql = "(select tp.Id cityId,ts.Id countyId, tp.Name City,ts.Name County,e.UserName addBy,p.PropertyName,t.TypeName activityType,i.PhotoPath defaultPicPath , a.Id, a.ActivityTitle,a.ActivityContent,a.ActivesLimit,a.ActivesExcerpt,a.AdminID,a.AddTime,a.PropertyId,a.ActivityTypeId,convert(varchar, StartTime,120 ) as StartTime,convert(varchar, EndTime,120 ) as EndTime,convert(varchar, RegStartTime,120 ) as RegStartTime,convert(varchar, RegEndTime,120 ) as RegEndTime,a.IsClose from t_Activity a left join t_ActivityType t on a.ActivityTypeId=t.Id left join t_Property p on a.PropertyId=p.PropertyId left join t_Area ts on p.AreaId=ts.Id left join t_Area tp on ts.ParentId=tp.Id left join t_EnterpriseUsers e on a.AdminID=e.EUserId left join t_ActivityPhoto i on a.Id=i.ActivityId where (i.id is null or i.IsDefault=1)) rs ";
Map<String, Object> paramMap = new HashMap<>();
if (null != cityId && cityId > 0) {
condition.append(" AND rs.cityId = :cityId");
paramMap.put("cityId", cityId);
}
if (null != countyId && countyId > 0) {
condition.append(" AND rs.countyId = :countyId");
paramMap.put("countyId", countyId);
}
if (!StringUtil.isEmpty(propertyId)) {
condition.append(" AND rs.PropertyId = :propertyId");
paramMap.put("propertyId", propertyId);
}
if (null != activityTypeId && activityTypeId > 0) {
condition.append(" AND rs.ActivityTypeId = :activityTypeId");
paramMap.put("activityTypeId", activityTypeId);
}
if (null != adminId && adminId > 0) {
condition.append(" AND rs.AdminID = :adminId");
paramMap.put("adminId", adminId);
}
if (!StringUtil.isEmpty(title)) {
condition.append(" AND rs.activityTitle like :title");
paramMap.put("title", "%" + title + "%");
}
if (null != isClose) {
condition.append(" AND rs.IsClose=:isClose");
paramMap.put("isClose", isClose);
}
LinkedHashMap<String, String> orderBy = new LinkedHashMap<String, String>();
orderBy.put("AddTime", "DESC");
return this.paginationForMSSQL(sql, condition.toString(), paramMap, page, limit, orderBy);
}
public void updateActivity(Activity Activity) {
Map<String, Object> map = BeanUtils.transBean2Map(Activity);
String sql = "UPDATE t_Activity SET ActivityTypeId=:activityTypeId,ActivityTitle=:activityTitle,ActivityContent=:activityContent,StartTime=:startTime,EndTime=:endTime,ActivesLimit=:activesLimit, ActivesExcerpt=:activesExcerpt,RegStartTime=:regStartTime,RegEndTime=:regEndTime,PropertyId=:propertyId, IsClose=:isClose WHERE Id=:id";
this.namedJdbcTemplate.update(sql, map);
}
public void addActivity(Activity Activity) {
Map<String, Object> map = BeanUtils.transBean2Map(Activity);
String sql = "INSERT INTO t_Activity (ActivityTypeId,ActivityTitle,ActivityContent,StartTime,EndTime,ActivesLimit,ActivesExcerpt,RegStartTime,RegEndTime,AdminId,AddTime,IsClose,PropertyId) VALUES(:activityTypeId,:activityTitle,:activityContent,:startTime,:endTime,:activesLimit,:activesExcerpt,:regStartTime,:regEndTime,:adminId,:addTime,:isClose,:propertyId)";
this.namedJdbcTemplate.update(sql, map);
}
public void deleteActivity(String id) {
String sql = "DELETE from t_Activity WHERE Id=:id";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", id);
this.namedJdbcTemplate.update(sql, paramMap);
}
public Integer getSignUp(String id) {
String sql = "select count(*) from t_Signs where ActivesId =:id";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", id);
return this.namedJdbcTemplate.queryForObject(sql, paramMap, Integer.class);
}
public Integer getLastActivityId() {
String sql = "select max(id) from t_Activity";
return this.template.queryForObject(sql, Integer.class);
}
public Integer getCountByType(String typeId) {
String sql = "select count(*) from t_Activity where IsClose=0 and ActivityTypeId=:typeId";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("typeId", typeId);
return this.namedJdbcTemplate.queryForObject(sql, paramMap, Integer.class);
}
public List<Activity> getLatestActivities(Integer propertyId) {
String sql = "SELECT TOP(4) a.Id,a.ActivityTitle,a.ActivityContent,a.ActivesLimit,a.StartTime,a.EndTime,a.ActivesExcerpt,a.RegStartTime,a.RegEndTime,a.AdminID,a.AddTime,a.IsClose,a.PropertyId,a.ActivityTypeId,p.PhotoPath FROM t_Activity a "
+ "left join t_ActivityPhoto p on a.Id = p.ActivityId AND p.IsDefault=1 WHERE (a.EndTime > GETDATE() OR a.EndTime IS NULL) AND a.IsClose=? AND (a.PropertyId=? OR a.PropertyId=0 )ORDER BY a.AddTime DESC";
return this.queryActivities(sql, new Object[] { Constant.IS_NOT_CLOSE, propertyId });
}
public List<Activity> getHistorActivities(Integer propertyId) {
String sql = "SELECT TOP(4) a.Id,a.ActivityTitle,a.ActivityContent,a.ActivesLimit,a.StartTime,a.EndTime,a.ActivesExcerpt,a.RegStartTime,a.RegEndTime,a.AdminID,a.AddTime,a.IsClose,a.PropertyId,a.ActivityTypeId,p.PhotoPath FROM t_Activity a "
+ "left join t_ActivityPhoto p on a.Id = p.ActivityId AND p.IsDefault=1 WHERE (GETDATE() > a.EndTime) AND a.IsClose=? AND (a.PropertyId=? OR a.PropertyId=0 )ORDER BY a.AddTime DESC";
return this.queryActivities(sql, new Object[] { Constant.IS_NOT_CLOSE, propertyId });
}
public List<Activity> getActivitiesByPropertyId(Integer activityTypeId, String propertyId) {
String sql = "SELECT a.Id,a.ActivityTitle,a.ActivityContent,a.ActivesLimit,a.StartTime,a.EndTime,a.ActivesExcerpt,a.RegStartTime,a.RegEndTime,a.AdminID,a.AddTime,a.IsClose,a.PropertyId,a.ActivityTypeId,p.PhotoPath FROM t_Activity a "
+ "left join t_ActivityPhoto p on a.Id = p.ActivityId AND p.IsDefault=1 WHERE (DATEADD(day,1,a.EndTime) > GETDATE() OR a.EndTime IS NULL) AND a.IsClose=? AND a.ActivityTypeId=? AND (a.PropertyId=? OR a.PropertyId=0 ) ORDER BY a.AddTime DESC";
return this.queryActivities(sql, new Object[] { Constant.IS_NOT_CLOSE, activityTypeId, propertyId });
}
public Activity getActivityById(Integer activityId, int userId) {
String sql = "SELECT a.Id,a.ActivityTitle,a.ActivityContent,a.ActivesLimit,a.StartTime,a.EndTime,a.ActivesExcerpt,a.RegStartTime,a.RegEndTime,a.AdminID,a.AddTime,a.IsClose,a.PropertyId,a.ActivityTypeId,p.PhotoPath FROM t_Activity a "
+ "left join t_ActivityPhoto p on a.Id = p.ActivityId AND p.IsDefault=1 WHERE a.IsClose=? AND a.Id=?";
List<Activity> activities = this.queryActivities(sql, new Object[] { Constant.IS_NOT_CLOSE, activityId });
// return activities.size() > 0 ? activities.get(0) : null;
if (activities.size() > 0) {
Activity Activity = activities.get(0);
int yiZan = getYiZan(userId, Activity.getId());
Activity.setYiZan(yiZan);
int zanCount = getZanCount(Activity.getId());
Activity.setZanCount(zanCount);
return Activity;
} else {
return null;
}
}
public int getYiZan(int currentUserId, long huoId) {
String sql = "select count(1) AS yiZan from t_ActivityPraise where UserId=? and AId= ?";
int max = this.template.queryForObject(sql, new Object[] { currentUserId, huoId }, Integer.class);
return max;
}
public int getZanCount(long huoId) {
String sql = "select count(1) AS zanCount from t_ActivityPraise where AId= ?";
int max = this.template.queryForObject(sql, new Object[] { huoId }, Integer.class);
return max;
}
private List<Activity> queryActivities(String sql, Object[] params) {
String dateFormat = "yyyy-MM-dd HH:mm:ss";
List<Activity> activities = new ArrayList<>();
template.query(sql, params, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
Activity model = new Activity();
model.setId(rs.getInt("Id"));
model.setActivityTitle(rs.getString("ActivityTitle"));
model.setActivityContent(rs.getString("ActivityContent"));
model.setActivesLimit(rs.getString("ActivesLimit"));
model.setStartTime(CommonUtil.formatDate(rs.getTimestamp("StartTime"), dateFormat));
model.setEndTime(CommonUtil.formatDate(rs.getTimestamp("EndTime"), dateFormat));
model.setActivesExcerpt(rs.getString("ActivesExcerpt"));
model.setRegStartTime(CommonUtil.formatDate(rs.getTimestamp("RegStartTime"), dateFormat));
model.setRegEndTime(CommonUtil.formatDate(rs.getTimestamp("RegEndTime"), dateFormat));
model.setAdminId(rs.getInt("AdminID"));
model.setAddTime(rs.getTimestamp("AddTime"));
model.setIsClose(rs.getInt("IsClose"));
model.setPropertyId(Integer.parseInt(rs.getString("PropertyId")));
model.setActivityTypeId(rs.getInt("ActivityTypeId"));
model.setDefaultPicPath(rs.getString("PhotoPath"));
activities.add(model);
}
});
return activities;
}
public Integer getSignCountByUserId(Integer userId, Integer activityId) {
String sql = "select count(*) from t_Signs where UserId=:userId and ActivesId=:activityId";
Map<String, Object> params = new HashMap<>();
params.put("userId", userId);
params.put("activityId", activityId);
return this.namedJdbcTemplate.queryForObject(sql, params, Integer.class);
}
public boolean addSign(Integer userId, Integer activityId) {
String sql = "INSERT INTO t_Signs(UserId,ActivesId,AddTime) Values(:userId,:activityId,GETDATE())";
Map<String, Object> params = new HashMap<>();
params.put("userId", userId);
params.put("activityId", activityId);
return this.namedJdbcTemplate.update(sql, params) > 0;
}
public List<Integer> getMySigns(Integer userId) {
String sql = "select ActivesId from t_Signs where UserId=?";
List<Integer> activityIds = new ArrayList<>();
template.query(sql, new Object[] { userId }, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
activityIds.add(rs.getInt("ActivesId"));
}
});
return activityIds;
}
public Activity selectPraise(Activity activity) {
String sql = "select * from t_ActivityPraise where AId = " + activity.getAId() + " and UserId = "
+ activity.getAdminId() + " ";
List<Activity> list = new ArrayList<>();
Activity activity1 = new Activity();
this.template.query(sql, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
activity1.setAdminId(rs.getInt("UserId"));
activity1.setAId(rs.getInt("AId"));
activity1.setAddTime(rs.getTimestamp("AddTime"));
activity1.setPropertyId(rs.getInt("PropertyId"));
}
});
return activity1;
}
public void addPraise(Activity activity) {
String sql = "insert into t_ActivityPraise(UserId,AId,AddTime,PropertyId) VALUES"
+ "(:userId,:aId,:addTime,:propertyId)";
Map<String, Object> map = new HashMap<>();
map.put("userId", activity.getAdminId());
map.put("aId", activity.getAId());
map.put("addTime", new Date());
map.put("propertyId", activity.getPropertyId());
this.namedJdbcTemplate.update(sql, map);
}
public void deletePraise(Activity activity) {
String sql = "DELETE from t_ActivityPraise WHERE AId=:aId and UserId=:userId";
Map<String, Object> map = new HashMap<>();
map.put("aId", activity.getAId());
map.put("userId", activity.getAdminId());
this.namedJdbcTemplate.update(sql, map);
}
}
service层:
package com.tianjian.property.service;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import com.tianjian.property.constant.Constant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.tianjian.property.dao.ActivityDao;
import com.tianjian.property.entity.Activity;
import com.tianjian.property.entity.common.Pagination;
import com.tianjian.property.util.CommonUtil;
@Service
@Transactional
public class ActivityService {
@Autowired
private ActivityDao activityDao;
@Value(Constant.FILE_SERVER)
private String fileServer;
@Value("${web.image.path}")
private String path;
public Pagination<Activity> getActivities(Integer cityId,Integer countyId,String propertyId,Integer activityTypeId, Integer adminId, String title, Integer isClose, Integer page, Integer limit) {
return activityDao.getActivities(cityId,countyId,propertyId, activityTypeId,adminId, title, isClose, page, limit);
}
public boolean updateActivity(Activity activity) {
try {
this.activityDao.updateActivity(activity);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public boolean addActivity(Activity activity) {
activity.setIsClose(0);
activity.setAddTime(new Timestamp(System.currentTimeMillis()));
activity.setAdminId(CommonUtil.currentAdminDetails().geteUserId());
try {
this.activityDao.addActivity(activity);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public boolean deleteActivity(String id) {
try {
this.activityDao.deleteActivity(id);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public int getLastActivityId() {
Integer id = this.activityDao.getLastActivityId();
return id == null ? 0 : id;
}
public int getSignUp(String id) {
Integer signUpNum = this.activityDao.getSignUp(id);
return signUpNum == null ? 0 : signUpNum;
}
public int getCountByType(String typeId) {
Integer activityCount = this.activityDao.getCountByType(typeId);
return activityCount == null ? 0 : activityCount;
}
public List<Activity> getLatestActivities(Integer propertyId) {
List<Activity> activities = this.activityDao.getLatestActivities(propertyId);
this.resetPaths(activities);
return activities;
}
public List<Activity> getHistorActivities(Integer propertyId) {
List<Activity> activities = this.activityDao.getHistorActivities(propertyId);
this.resetPaths(activities);
return activities;
}
public List<Activity> getActivities(Integer activityTypeId, String propertyId) {
List<Activity> activities = this.activityDao.getActivitiesByPropertyId(activityTypeId, propertyId);
this.resetPaths(activities);
return activities;
}
/***
*
* @param activityTypeId
* @param propertyId
* @param pageSize
* @param pageOffset 从1开始,第1页
* @return
*/
public List<Activity> getActivities(Integer activityTypeId, String propertyId, Integer pageSize, Integer pageOffset) {
List<Activity> activities = this.getActivities(activityTypeId, propertyId);
return this.getSubList(activities, pageSize, pageOffset);
}
public List<Activity> getSubList(List<Activity> activities, Integer pageSize, Integer pageOffset) {
if (activities == null || activities.size() == 0) {
return new ArrayList<>();
}
Integer startIndex = (pageOffset-1)*pageSize;
Integer endIndex = startIndex + pageSize;
endIndex = endIndex < activities.size() ? endIndex : activities.size();
List<Activity> subList = activities.subList(startIndex, endIndex);
this.resetPaths(subList);
return subList;
}
public Activity getActivityById(Integer activityId,int userId) {
Activity activity = this.activityDao.getActivityById(activityId,userId);
if(activity!=null){
this.resetPath(activity);
}
return activity;
}
public boolean signUp(Integer userId, Integer activityId) {
Integer sn = this.activityDao.getSignCountByUserId(userId, activityId);
if (sn > 0) {
return true;
}
return this.activityDao.addSign(userId, activityId);
}
public boolean isSignUp(Integer userId, Integer activityId) {
Integer sn = this.activityDao.getSignCountByUserId(userId, activityId);
if (sn > 0) {
return true;
} else {
return false;
}
}
public List<Activity> getMyActivities(Integer userId) {
List<Integer> activityIds = this.activityDao.getMySigns(userId);
if (activityIds.size() == 0) {
return new ArrayList<>();
}
List<Activity> activities = this.getActivitiesByIds(activityIds);
this.resetPaths(activities);
return activities;
}
private List<Activity> getActivitiesByIds(List<Integer> activityIds) {
List<Activity> activities = new ArrayList<>();
for (Integer id : activityIds) {
Activity activity = this.getActivityById(id,0);
if (activity != null) {
Integer signCount = this.getSignUp(id.toString());
activity.setSignCount(signCount);
this.resetPath(activity);
activities.add(activity);
}
}
return activities;
}
private void resetPaths(List<Activity> activities) {
for (Activity activity : activities) {
resetPath(activity);
}
}
private void resetPath(Activity activity) {
activity.setDefaultPicPath(CommonUtil.getFullPath(path, activity.getDefaultPicPath()));
}
public Activity selectPraise(Activity activity) {
return activityDao.selectPraise(activity);
}
public void addPraise(Activity activity) {
activityDao.addPraise(activity);
}
public void deletePraise(Activity activity) {
activityDao.deletePraise(activity);
}
}