package com.dl.network_flow.db;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.ResultSetMetaData;
7 import java.sql.SQLException;
8 import java.sql.Statement;
9 import java.sql.Timestamp;
10 import java.util.ArrayList;
11 import java.util.Date;
12 import java.util.HashMap;
13 import java.util.List;
14 import java.util.Map;
15
16 import org.apache.log4j.Logger;
17
18 /*oracle和mysql的分页区别:
19 * 1、语句的记录起始部分不一样,oralce是“记录查询结果的结束行”和“查询结果的开始行”,mysql是从“记录起始行”和“该页显示的条数”
20 * 2、数据基数:oracle是从1开始,mysql是从0开始
21 * */
22 public class BaseDao {
23
24 protected Logger log = Logger.getLogger(
this.getClass());
25
26 /**
27 * 执行新增和修改的数据库操作,不用处理返回的ResultSet结果集
28 *
29 * @param sql
30 * sql语句
31 * @param params
32 * 参数,若为日期,需要特别处理
33 * @return
34 */
35 public int executeSql(String sql, Object[] params) {
36 Connection connection =
null;
37 PreparedStatement preparedStatement =
null;
38 ResultSet resultSet =
null;
39
40 try {
41 connection =
ConnectionFactory.getInstance().getConnection();
42 preparedStatement =
connection.prepareStatement(sql);
43 // log.debug("executeSql sql = " + sql);
44 // log.debug("params = " + params);
45 if (params !=
null) {
46 // 设置sql语句参数
47 for (
int i = 0; i < params.length; i++
) {
48 // log.debug("params[i] = " + params[i]);
49 if (params[i] !=
null) {
50 if (params[i]
instanceof java.util.Date) {
51 preparedStatement
52 .setTimestamp(i + 1,
new Timestamp(
53 ((Date) params[i]).getTime()));
54 }
else {
55 preparedStatement.setObject(i + 1
, params[i]);
56 }
57 }
else {
58 preparedStatement.setString(i + 1, ""
);
59 }
60 }
61 }
62 return preparedStatement.executeUpdate();
63 }
catch (SQLException e) {
64 log.error(e.getMessage() + "code = " + e.getErrorCode()+",sql:"+
sql);
65 // /throw new RuntimeException(e.getMessage() + "code = " +
66 // e.getErrorCode());
67 return -1
;
68 }
finally {
69 ConnectionFactory.getInstance().closeConnection(connection,
70 preparedStatement, resultSet);
71 }
72
73 }
74
75 /*
76 * 批量执行sql语句 paramsArr是个2维数组,第一维度表示各条记录,第二维度表示各条记录里的各个parameter值
77 */
78 public int[] executeBatchSql(String sql, Object[][] paramsArr) {
79 Connection connection =
null;
80 PreparedStatement preparedStatement =
null;
81 ResultSet resultSet =
null;
82 try {
83 connection =
ConnectionFactory.getInstance().getConnection();
84 preparedStatement =
connection.prepareStatement(sql);
85
86 if (paramsArr !=
null) {
87 for (
int s = 0; s < paramsArr.length; s++
) {
88 Object[] params =
paramsArr[s];
89 if (params !=
null) {
90 // 设置sql语句参数
91 for (
int i = 0; i < params.length; i++
) {
92 if (params[i] !=
null) {
93 if (params[i]
instanceof java.util.Date) {
94 preparedStatement.setTimestamp(
95 i + 1
,
96 new Timestamp(((Date) params[i])
97 .getTime()));
98 }
else {
99 preparedStatement.setObject(i + 1
,
100 params[i]);
101 }
102 }
else {
103 preparedStatement.setString(i + 1, ""
);
104 }
105 }
106 preparedStatement.addBatch();
// /批量增加1条
107 }
108 }
109 }
110 return preparedStatement.executeBatch();
// /批量执行
111 }
catch (SQLException e) {
112 e.printStackTrace();
113 // log.error(e.getMessage() + "code = " + e.getErrorCode());
114 log.error(e.getMessage() + "code = " + e.getErrorCode()+",sql:"+
sql);
115 }
finally {
116 ConnectionFactory.getInstance().closeConnection(connection,preparedStatement, resultSet);
117 }
118 return null;
119 }
120
121 /**
122 * 批量执行不同的sql语句 不包含查询
123 * executeBatchSql
124 * @time 2015年9月23日下午4:23:16
125 * @packageName com.dl.ios6
126 * @param sql 多个sql语句的数组
127 * @return
128 */
129 public int[] executeBatchSql(String[] sql){
130 Connection connection =
null;
131 PreparedStatement preparedStatement =
null;
132 ResultSet resultSet =
null;
133
134 connection =
ConnectionFactory.getInstance().getConnection();
135 Statement state =
null;
136 try {
137 if(sql!=
null&&sql.length>0
){
138 boolean autoCommit =
connection.getAutoCommit();
139 connection.setAutoCommit(
false);
140 state =
connection.createStatement();
141 for (
int i = 0; i < sql.length; i++
) {
142 state.addBatch(sql[i]);
143 }
144 int j[] =
state.executeBatch();
145 connection.commit();
146 connection.setAutoCommit(autoCommit);
147 state.close();
148 ConnectionFactory.getInstance().closeConnection(connection, preparedStatement, resultSet);
149 return j;
150 }
151 }
catch (SQLException e) {
152 state =
null;
153 ConnectionFactory.getInstance().closeConnection(connection, preparedStatement, resultSet);
154 }
155 return null;
156 }
157
158
159 /*
160 * 批量执行sql语句 paramsArr是个2维数组,第一维度表示各条记录,第二维度表示各条记录里的各个parameter值
161 */
162 public int[] executeBatchSql(String sql, List<Object[]>
paramsList) {
163 Connection connection =
null;
164 PreparedStatement preparedStatement =
null;
165 ResultSet resultSet =
null;
166 try {
167
168 connection =
ConnectionFactory.getInstance().getConnection();
169 preparedStatement =
connection.prepareStatement(sql);
170
171 if (paramsList ==
null){
172 return null;
173 }
174 // /遍历所有记录
175 for (
int i = 0; i < paramsList.size(); i++
) {
176 Object[] tObj =
paramsList.get(i);
177 if (tObj ==
null) {
178 continue;
179 }
180 // /遍历记录中的每个字段
181 for (
int j = 0; j < tObj.length; j++
) {
182 Object curObj =
tObj[j];
183 if (curObj !=
null) {
184 if (curObj
instanceof java.util.Date) {
185 preparedStatement.setTimestamp(j + 1
,
186 new Timestamp(((java.util.Date) curObj).getTime()));
187 }
else {
188 preparedStatement.setObject(j + 1
, curObj);
189 }
190 }
else{
191 preparedStatement.setString(j + 1, ""
);
192 }
193 }
// /遍历记录中的每个字段
194 preparedStatement.addBatch();
// /添加一条记录
195 }
// /遍历所有记录
196
197 return preparedStatement.executeBatch();
// /批量执行
198 }
catch (SQLException e) {
199 e.printStackTrace();
200 log.error(e.getMessage() + "code = " + e.getErrorCode()+",sql:"+
sql);
201 }
finally {
202 ConnectionFactory.getInstance().closeConnection(connection,
203 preparedStatement, resultSet);
204 }
205 return null;
206 }
207
208 /*
209 * 执行sql操作,把sql和params结合成一个sql语句
210 * 执行sql查询的结果集交给sqlExecute这个接口函数处理,处理后封装的对象放到List里
211 */
212 public List<Map<String, Object>>
queryForList(String sql, Object[] params) {
213 Connection connection =
null;
214 PreparedStatement preparedStatement =
null;
215 ResultSet resultSet =
null;
216
217 try {
218 connection =
ConnectionFactory.getInstance().getConnection();
219 preparedStatement =
connection.prepareStatement(sql);
220 // 设置sql语句参数
221 if (params !=
null) {
222 for (
int i = 0; i < params.length; i++
) {
223 // log.debug("params[i] = " + params[i]);
224 preparedStatement.setObject(i + 1
, params[i]);
225 }
226 }
227 resultSet =
preparedStatement.executeQuery();
228 ResultSetMetaData md = resultSet.getMetaData();
// 得到结果集(rs)的结构信息,比如字段数、字段名等
229 int columnCount =
md.getColumnCount();
230 List<Map<String, Object>> list =
new ArrayList<Map<String, Object>>
();
231 Map<String, Object> rowData =
new HashMap<String, Object>
();
232 while (resultSet.next()) {
233 rowData =
new HashMap<String, Object>
(columnCount);
234 for (
int i = 1; i <= columnCount; i++
) {
235 rowData.put(md.getColumnLabel(i), resultSet.getObject(i));
236 }
237 list.add(rowData);
238 }
239
240 return list;
241 }
catch (SQLException e) {
242 // log.error(e.getMessage());
243 log.error(e.getMessage() + "code = " + e.getErrorCode()+",sql:"+
sql);
244 }
finally {
245 ConnectionFactory.getInstance().closeConnection(connection,
246 preparedStatement, resultSet);
247 }
248 return null;
249 }
250
251
252 public Map<String, Object>
queryForMap(String sql, Object[] params) {
253 Connection connection =
null;
254 PreparedStatement preparedStatement =
null;
255 ResultSet resultSet =
null;
256
257 try {
258 connection =
ConnectionFactory.getInstance().getConnection();
259 preparedStatement =
connection.prepareStatement(sql);
260 // 设置sql语句参数
261 if (params !=
null) {
262 for (
int i = 0; i < params.length; i++
) {
263 // log.debug("params[i] = " + params[i]);
264 preparedStatement.setObject(i + 1
, params[i]);
265 }
266 }
267 resultSet =
preparedStatement.executeQuery();
268 ResultSetMetaData md = resultSet.getMetaData();
// 得到结果集(rs)的结构信息,比如字段数、字段名等
269 int columnCount =
md.getColumnCount();
270 Map<String, Object> rowData =
new HashMap<String, Object>
();
271 while (resultSet.next()) {
272 rowData =
new HashMap<String, Object>
(columnCount);
273 for (
int i = 1; i <= columnCount; i++
) {
274 rowData.put(md.getColumnLabel(i), resultSet.getObject(i));
275 }
276 break;
277 }
278
279 return rowData;
280 }
catch (SQLException e) {
281 log.error(e.getMessage() + "code = " + e.getErrorCode()+",sql:"+
sql);
282 }
finally {
283 ConnectionFactory.getInstance().closeConnection(connection,preparedStatement, resultSet);
284 }
285 return null;
286 }
287
288 }
1 package com.dl.network_flow.db;
2
3 import java.beans.PropertyVetoException;
4 import java.sql.Connection;
5 import java.sql.PreparedStatement;
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
8 import com.dl.network_flow.utils.PropertyUtils;
9 import com.mchange.v2.c3p0.ComboPooledDataSource;
10 /*使用C3P0连接池
11 * 从C3P0连接池ComboPooledDataSource中获得Connection
12 * 关闭Connection
13 * */
14 public class ConnectionFactory
15 {
16
17 // private static Logger log = Logger.getLogger(ConnectionFactory.class);
18
19 public static ConnectionFactory connectionFactory = new ConnectionFactory();
20
21 private ComboPooledDataSource ds; ///C3P0连接池
22
23 ///初始化数据库连接池的参数:5个
24 ///给C3P0连接池指定DriverClass、JdbcUrl、User、Password、InitialPoolSize、MaxPoolSize、CheckoutTimeout
25 private ConnectionFactory() {
26 ds = new ComboPooledDataSource();
27 try {
28 String DriverClass = PropertyUtils.getValue("DriverClass");
29 //log.debug("DriverClass = " + DriverClass);
30 if (DriverClass != null) {
31 ds.setDriverClass(DriverClass);
32 }
33 }
34 catch (PropertyVetoException e) {
35 }
36 String JdbcUrl = PropertyUtils.getValue("JdbcUrl");
37 //log.debug("JdbcUrl = " + JdbcUrl);
38 if (JdbcUrl != null) {
39 ds.setJdbcUrl(JdbcUrl);
40 }
41
42
43 String User = PropertyUtils.getValue("User");
44 //log.debug("User = " + User);
45 if (User != null) {
46 ds.setUser(User);
47 }
48
49 String Password = PropertyUtils.getValue("Password");
50 //log.debug("Password = " + Password);
51 if (Password != null) {
52 ds.setPassword(Password);
53 }
54
55 String InitialPoolSize = PropertyUtils.getValue("InitialPoolSize");
56 //log.debug("InitialPoolSize = " + InitialPoolSize);
57 if (InitialPoolSize != null) {
58 ds.setInitialPoolSize(Integer.parseInt(InitialPoolSize));
59 }
60
61 String MaxPoolSize = PropertyUtils.getValue("MaxPoolSize");
62 //log.debug("MaxPoolSize = " + MaxPoolSize);
63 if (MaxPoolSize != null) {
64 ds.setMaxPoolSize(Integer.parseInt(MaxPoolSize));
65 }
66
67 String CheckoutTimeout = PropertyUtils.getValue("CheckoutTimeout");
68 //log.debug("CheckoutTimeout = " + CheckoutTimeout);
69 if (CheckoutTimeout != null) {
70 ds.setCheckoutTimeout(Integer.parseInt(CheckoutTimeout));
71 }
72
73 String MaxIdleTime = PropertyUtils.getValue("MaxIdleTime");
74 if(MaxIdleTime != null){
75 ds.setMaxIdleTime(Integer.parseInt(MaxIdleTime));
76 }
77
78 }
79
80 public static ConnectionFactory getInstance() {
81 return connectionFactory;
82 }
83
84 /**
85 * 获得数据库连接
86 *
87 * @return
88 */
89 public Connection getConnection() {
90 try {
91
92 return ds.getConnection();
93 } catch (SQLException e) {
94 throw new RuntimeException(e.getMessage() + "code = " + e.getErrorCode());
95 }
96 }
97
98 /**
99 * 关闭数据库连接
100 *
101 * @param connection
102 * @param prepareStatement
103 * @param resultSet
104 */
105 public void closeConnection(Connection connection, PreparedStatement prepareStatement, ResultSet resultSet) {
106
107 try {
108 if (resultSet != null) {
109 resultSet.close();
110 }
111 if (prepareStatement != null) {
112 prepareStatement.close();
113 }
114 if (connection != null) {
115 connection.close();
116 }
117 } catch (SQLException e) {
118 throw new RuntimeException(e.getMessage() + "code = " + e.getErrorCode());
119 }
120 }
121
122 public static void main(String[] args)
123 {
124
125 }
126 }
1 package com.dl.network_flow.utils;
2
3
4 import java.io.BufferedReader;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.InputStreamReader;
8 import java.util.Properties;
9
10 /**
11 * Created by IntelliJ IDEA.
12 * User: Administrator
13 * Date: 2010-4-23
14 * Time: 18:02:11
15 * To change this template use File | Settings | File Templates.
16 */
17 public class PropertyUtils {
18 private Properties pro = new Properties();
19 private static PropertyUtils propertyUtils = new PropertyUtils();
20
21 private PropertyUtils() {
22 InputStream in = null;
23 try {
24 // pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
25 in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
26 BufferedReader bf = new BufferedReader(new InputStreamReader(in));
27 pro.load(bf);
28 } catch (IOException e) {
29 throw new RuntimeException(e.getMessage());
30 } finally {
31 try {
32 if(in!=null){
33 in.close();
34 }
35 } catch (IOException e) {
36 }
37 }
38 }
39
40 public static PropertyUtils getInstance(){
41 return propertyUtils;
42 }
43
44 public static String getValue(String key) {
45 return (String)getInstance().pro.get(key);
46 }
47
48 public static void main(String[] args) throws Exception {
49 System.out.println(getValue("abcd"));
50 }
51
52 }
db.properties 文件内容
#本地
JdbcUrl=jdbc:mysql://IP地址:3306/数据库名称?autoReconnect=true&autoReconnectForPools=true
DriverClass=com.mysql.jdbc.Driver
User=用户名
Password=数据库密码
#初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 initialPoolSize
InitialPoolSize=15
#连接池中保留的最大连接数。Default: 15 maxPoolSize
MaxPoolSize=30
#sp计费信息实时入库,每次入库的数量
spsynCacheSize=30
#最大空闲时间
MaxIdleTime=120
mysql数据库连接工具类C3P0
标签: