后台与数据库操作交互之暴力反射

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_23145857/article/details/100016927

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);
    } 
}
 

猜你喜欢

转载自blog.csdn.net/qq_23145857/article/details/100016927
今日推荐