DbExecuteImpl.java 5.56 KB
Newer Older
yanzg's avatar
yanzg committed
1
package com.yanzuoguang.db.impl;
yanzg's avatar
yanzg committed
2

yanzg's avatar
yanzg committed
3
import com.yanzuoguang.db.DbExecute;
yanzg's avatar
yanzg committed
4
import com.yanzuoguang.extend.ConfigDb;
yanzg's avatar
yanzg committed
5
import com.yanzuoguang.util.vo.MapRow;
yanzg's avatar
yanzg committed
6
import com.yanzuoguang.util.vo.Ref;
yanzg's avatar
yanzg committed
7 8
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
yanzg's avatar
yanzg committed
9
import org.springframework.jdbc.core.RowCallbackHandler;
yanzg's avatar
yanzg committed
10 11 12
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.stereotype.Component;

yanzg's avatar
yanzg committed
13
import javax.annotation.Resource;
yanzg's avatar
yanzg committed
14 15
import java.sql.ResultSet;
import java.sql.SQLException;
yanzg's avatar
yanzg committed
16 17 18 19 20
import java.util.ArrayList;
import java.util.List;

/**
 * 数据库操作类
yanzg's avatar
yanzg committed
21
 *
yanzg's avatar
yanzg committed
22
 * @author 颜佐光
yanzg's avatar
yanzg committed
23 24 25 26
 */
@Component
public class DbExecuteImpl implements DbExecute {

yanzg's avatar
yanzg committed
27
    @Resource
yanzg's avatar
yanzg committed
28 29 30
    @Qualifier("jdbcTemplate")
    private JdbcTemplate jdbc;

yanzg's avatar
yanzg committed
31
    @Resource
yanzg's avatar
yanzg committed
32 33
    private DbPrintSql printSql;

yanzg's avatar
yanzg committed
34 35 36
    @Resource
    private ConfigDb configDb;

yanzg's avatar
yanzg committed
37 38 39
    /**
     * 更新SQL语句的执行
     *
yanzg's avatar
yanzg committed
40 41 42 43
     * @param targetClass 触发类
     * @param sqlName     SQL语句名称
     * @param sql         SQL语句
     * @param paras       参数信息
yanzg's avatar
yanzg committed
44 45
     * @return
     */
yanzg's avatar
yanzg committed
46
    @Override
yanzg's avatar
yanzg committed
47
    public int update(Class targetClass, String sqlName, String sql, Object... paras) {
yanzg's avatar
yanzg committed
48
        int row = 0;
yanzg's avatar
yanzg committed
49
        long start = System.currentTimeMillis();
yanzg's avatar
yanzg committed
50 51 52 53 54
        try {
            sql = this.handleParas(sql, paras);
            row = jdbc.update(sql, paras);
            return row;
        } finally {
yanzg's avatar
yanzg committed
55
            printSql.print(targetClass, sqlName, start, row, sql, paras);
yanzg's avatar
yanzg committed
56 57 58
        }
    }

yanzg's avatar
yanzg committed
59 60 61 62 63 64 65 66 67 68 69 70
    /**
     * 查询数据
     *
     * @param targetClass 触发类
     * @param sqlName     SQL语句名称
     * @param cls         查询的结果的类型
     * @param rowHandle   通过该类来处理结果
     * @param sql         需要查询的SQL语句
     * @param paras       查询语句的参数
     * @param <T>         返回的集合的类型
     * @return 集合
     */
yanzg's avatar
yanzg committed
71
    @Override
yanzg's avatar
yanzg committed
72 73
    public <T extends Object> void query(Class targetClass, Class<T> cls, DbRow<T> rowHandle, String sqlName, String sql, Object... paras) {
        Ref<Integer> row = new Ref<Integer>(0);
yanzg's avatar
yanzg committed
74
        long start = System.currentTimeMillis();
yanzg's avatar
yanzg committed
75 76
        try {
            sql = this.handleParas(sql, paras);
yanzg's avatar
yanzg committed
77
            RowCallbackHandler rowCallbackHandler = new RowCallbackHandler() {
yanzg's avatar
yanzg committed
78 79 80 81 82 83 84
                @Override
                public void processRow(ResultSet rs) throws SQLException {
                    AllBeanRowMapper<T> rowMap = AllBeanRowMapper.getInstance(cls, configDb);
                    T data = rowMap.mapRow(rs, row.value);
                    rowHandle.handle(data);
                    row.value++;
                }
yanzg's avatar
yanzg committed
85 86
            };

yanzg's avatar
yanzg committed
87
            jdbc.query(sql, rowCallbackHandler, paras);
yanzg's avatar
yanzg committed
88
        } finally {
yanzg's avatar
yanzg committed
89
            printSql.print(targetClass, sqlName, start, row.value, sql, paras);
yanzg's avatar
yanzg committed
90 91 92 93
        }

    }

yanzg's avatar
yanzg committed
94 95 96
    /**
     * 查询数据,并返回集合
     *
yanzg's avatar
yanzg committed
97 98 99 100 101 102
     * @param targetClass 触发类
     * @param sqlName     SQL语句名称
     * @param cls         查询的结果的类型
     * @param sql         需要查询的SQL语句
     * @param paras       查询语句的参数
     * @param <T>         返回的集合的类型
yanzg's avatar
yanzg committed
103 104
     * @return 集合
     */
yanzg's avatar
yanzg committed
105
    @Override
yanzg's avatar
yanzg committed
106
    public <T extends Object> List<T> query(Class targetClass, Class<T> cls, String sqlName, String sql, Object... paras) {
yanzg's avatar
yanzg committed
107
        int row = 0;
yanzg's avatar
yanzg committed
108
        long start = System.currentTimeMillis();
yanzg's avatar
yanzg committed
109 110
        try {
            sql = this.handleParas(sql, paras);
yanzg's avatar
yanzg committed
111
            List<T> ret = jdbc.query(sql, paras, AllBeanRowMapper.getInstance(cls, configDb));
yanzg's avatar
yanzg committed
112 113 114 115 116 117
            if (ret == null) {
                ret = new ArrayList<T>();
            }
            row = ret.size();
            return ret;
        } finally {
yanzg's avatar
yanzg committed
118
            printSql.print(targetClass, sqlName, start, row, sql, paras);
yanzg's avatar
yanzg committed
119 120 121 122 123 124
        }
    }

    /**
     * 查询数据,并返回集合
     *
yanzg's avatar
yanzg committed
125 126 127 128
     * @param targetClass 触发类
     * @param sqlName     SQL语句名称
     * @param sql         需要查询的SQL语句
     * @param paras       查询语句的参数
yanzg's avatar
yanzg committed
129 130
     * @return 集合
     */
yanzg's avatar
yanzg committed
131
    @Override
yanzg's avatar
yanzg committed
132 133
    public List<MapRow> query(Class targetClass, String sqlName, String sql, Object... paras) {
        return query(targetClass, MapRow.class, sql, sqlName, paras);
yanzg's avatar
yanzg committed
134 135 136 137 138
    }

    /**
     * 查询第一个单元格的信息
     *
yanzg's avatar
yanzg committed
139 140 141 142
     * @param targetClass 触发类
     * @param sqlName     SQL语句名称
     * @param sql         SQL语句
     * @param paras       参数信息
yanzg's avatar
yanzg committed
143 144
     * @return 第一个单元格的数据
     */
yanzg's avatar
yanzg committed
145
    @Override
yanzg's avatar
yanzg committed
146
    public Object queryCell(Class targetClass, String sqlName, String sql, Object... paras) {
yanzg's avatar
yanzg committed
147
        int row = 0;
yanzg's avatar
yanzg committed
148
        long start = System.currentTimeMillis();
yanzg's avatar
yanzg committed
149 150 151 152 153 154 155 156 157
        try {
            sql = this.handleParas(sql, paras);
            SqlRowSet rowSet = jdbc.queryForRowSet(sql, paras);
            while (rowSet.next()) {
                row = 1;
                return rowSet.getObject(1);
            }
            return null;
        } finally {
yanzg's avatar
yanzg committed
158
            printSql.print(targetClass, sqlName, start, row, sql, paras);
yanzg's avatar
yanzg committed
159 160 161 162 163 164 165 166 167 168 169 170
        }
    }

    /**
     * 处理SQL语句和参数值
     *
     * @param sql
     * @param paras
     * @return
     */
    protected String handleParas(String sql, Object... paras) {
        return sql.replaceAll("1\\s*?=\\s*?1\\s*?(?i)AND", "")
yanzg's avatar
yanzg committed
171 172 173 174 175
                .replaceAll("(?i)WHERE\\s*?1\\s*?=\\s*?1", "")
                .replaceAll("((?i)ORDER\\s*?(?i)BY\\s*?)1\\s*?,", "$1")
                .replaceAll("(?i)ORDER\\s*?(?i)BY\\s*?1\\s*?", "")
                .replaceAll("((?i)GROUP\\s*?(?i)BY\\s*?)1\\s*?,", "$1")
                .replaceAll("(?i)GROUP\\s*?(?i)BY\\s*?1\\s*?", "");
yanzg's avatar
yanzg committed
176 177 178
    }

}