DbTemplate

Posted 皇上吉祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DbTemplate相关的知识,希望对你有一定的参考价值。

  1 package com.me.dbComponent;
  2 
  3 import java.sql.Connection;
  4 import java.sql.PreparedStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 import java.util.*;
  8 import java.util.function.Consumer;
  9 import java.util.function.Function;
 10 
 11 /**
 12  * Created by zgj on 2017/7/27.
 13  */
 14 public abstract class DbTemplate {
 15 
 16     private <T> T execute(Function<Connection, T> function) {
 17         Connection connection = getConnection();
 18         try {
 19             return function.apply(connection);
 20         } finally {
 21             releaseConnection(connection);
 22         }
 23     }
 24 
 25     protected void releaseConnection(Connection connection) {
 26         throw new RuntimeException("the method releaseConnection not implements");
 27     }
 28 
 29     protected Connection getConnection() {
 30         throw new RuntimeException("the method getConnection not implements");
 31     }
 32 
 33 
 34     public int insert(String sql, Object... args) {
 35         return insert(sql, preparedStatement -> setParameter(preparedStatement, args));
 36     }
 37 
 38     public int insert(String sql, Iterable<?> args) {
 39         return insert(sql, preparedStatement -> setParameter(preparedStatement, args));
 40     }
 41 
 42     public int insert(String sql, Map<String, Object> args) {
 43         return insert(sql, preparedStatement -> setParameter(preparedStatement, args));
 44     }
 45 
 46     private int insert(String sql, Consumer<PreparedStatement> statementSetter) {
 47         return execute(connection -> {
 48            try (PreparedStatement pst = connection.prepareStatement(sql)) {
 49                connection.setAutoCommit(false);
 50                if (statementSetter  != null) {
 51                    statementSetter.accept(pst);
 52                }
 53                int count = pst.executeUpdate();
 54                connection.commit();
 55                return count;
 56            } catch (SQLException e) {
 57                try {
 58                    connection.rollback();
 59                } catch (SQLException e1) {
 60                    throw new RuntimeException("transaction rollback occurred exception", e);
 61                }
 62                throw new RuntimeException(e);
 63            }
 64         });
 65 
 66     }
 67 
 68     public <T> T queryObject(String sql , Function<ResultSet, T> resultSet, Object... args) {
 69         return (T)query(sql, preparedStatement -> setParameter(preparedStatement, args), resultSet);
 70     }
 71 
 72     private <T> T query(String sql, Consumer<PreparedStatement> consumer, Function<ResultSet, T> resultSetExtractor) {
 73         return execute(connection -> {
 74             try (PreparedStatement pst = connection.prepareStatement(sql)) {
 75                 if (consumer != null) {
 76                     consumer.accept(pst);
 77                 }
 78                 try (ResultSet resultSet = pst.executeQuery()) {
 79                     return resultSetExtractor.apply(resultSet);
 80                 }
 81             } catch (SQLException e) {
 82                 throw new RuntimeException(e);
 83             }
 84         });
 85 
 86     }
 87 
 88     public <T> T queryObject(String sql, Object... args) {
 89         return (T)query(sql, preparedStatement -> setParameter(preparedStatement, args), DbTemplate::toOne);
 90     }
 91 
 92     private <T> List<T> queryList(String sql, Consumer<PreparedStatement> statementConsumer, Function<ResultSet, T> rowMapper) {
 93         return query(sql, statementConsumer, resultSet -> {
 94             try {
 95                 int size = getRowSize(resultSet);
 96                 if (size == 0)
 97                     return Collections.<T>emptyList();
 98                 List<T> list = new ArrayList<>();
 99                 while (resultSet.next()) {
100                     T t = rowMapper.apply(resultSet);
101                     if (!Objects.isNull(t)) {
102                         list.add(t);
103                     }
104                 }
105                 return list;
106             } catch (SQLException e) {
107                 throw new RuntimeException(e);
108             }
109         });
110     }
111 
112     public <T> List<T> queryList(String sql, Object[] args, Function<ResultSet, T> rowMapper) {
113         return queryList(sql, preparedStatement -> setParameter(preparedStatement, args), rowMapper);
114     }
115 
116 
117     public long queryCount(String sql) {
118         return queryCount(sql, "");
119     }
120 
121     public long queryCount(String sql, Object... args) {
122         Number number = queryObject(sql,args);
123         return number == null ? 0L : number.longValue();
124     }
125 
126     public boolean isExist(String sql) {
127         return isExist(sql, "");
128     }
129 
130     public boolean isExist(String sql, Object... args) {
131         long count = queryCount(sql, args);
132         return count > 0L;
133     }
134 
135     private static Object toOne(ResultSet resultSet) {
136         if (getRowSize(resultSet) > 1) {
137             throw new RuntimeException("the result set is more than 1 row");
138         }
139         try {
140             int colAmount = resultSet.getMetaData().getColumnCount();
141             if (colAmount == 1 && resultSet.next()) {
142                 return resultSet.getObject(1);
143             } else if (colAmount > 1 && resultSet.next()) {
144                 Object[] temp = new Object[colAmount];
145                 for (int i = 0; i < colAmount; i++) {
146                     temp[i] = resultSet.getObject(i + 1);
147                 }
148                 return temp;
149             }
150             return null;
151         } catch (SQLException e) {
152             throw new RuntimeException(e);
153         }
154     }
155 
156     private static int getRowSize(ResultSet resultSet) {
157         int rows = 0;
158         try {
159             if (resultSet.last()) {
160                 rows = resultSet.getRow();
161                 resultSet.beforeFirst();
162             }
163             return rows;
164         } catch (SQLException e) {
165             throw new RuntimeException(e);
166         }
167     }
168 
169 
170     private static void setParameter(PreparedStatement preparedStatement, Object[] args) {
171         if (args == null || args.length == 0) {
172             return;
173         }
174         try {
175             for (int i = 0; i < args.length; i++) {
176                 preparedStatement.setObject(i + 1, args[i]);
177             }
178         } catch (SQLException e) {
179             throw new RuntimeException(e);
180         }
181 
182     }
183 
184     private static void setParameter(PreparedStatement preparedStatement, Iterable<?> args) {
185         if (args == null) {
186             return;
187         }
188         int index = 0;
189         try {
190             for (Iterator i = args.iterator(); i.hasNext(); ) {
191                 preparedStatement.setObject(++index, i.next());
192             }
193         } catch (SQLException e) {
194             throw new RuntimeException(e);
195         }
196 
197     }
198 
199     private static void setParameter(PreparedStatement preparedStatement, Map<String, Object> map) {
200         if (map == null) {
201             return;
202         }
203         int index = 0;
204         try {
205             for (String key : map.keySet()) {
206                 preparedStatement.setObject(++index, map.get(key));
207             }
208         } catch (SQLException e) {
209             throw new RuntimeException(e);
210         }
211 
212     }
213 
214 }

 

以上是关于DbTemplate的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器