简易高重用的jdbcutils工具封装实现类以及简易连接池实现
因为如今发现做个小项目都是导入n多的依赖包,非常烦琐,仅仅想快点开发完一个个的小需求项目,这个时候真心不想用框架,仅仅能自己写个jdbcutils,尽管网上有非常多有apache的,阿里的,可是感觉用过后都不怎么顺手,然后自己花了点时间写个新的,不喜勿喷
1.我们要写个resultset集合转成bean的回调接口,这个用过spring jdbc的人都知道这玩意
- package org.simple.mvc.jdbc.bean;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- public interface RowMapper<T> {
- public abstract T mapRow(ResultSet rs) throws SQLException;
- }
2.先来个主要的jdbc操作接口吧,这样好规范点
- package org.simple.mvc.jdbc;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import java.util.List;
- import java.util.Map;
- import javax.sql.DataSource;
- import org.simple.mvc.jdbc.bean.RowMapper;
- public interface JdbcOperation {
- /**
- * update或delete功能
- *
- * @param sql
- * @param params
- * @return 变更记录数
- * @throws SQLException
- */
- public abstract int execute(String sql, Object[] params) throws SQLException;
- /**
- * update或delete功能
- *
- * @param sql
- * @return 变更记录数
- * @throws SQLException
- */
- public abstract int execute(String sql) throws SQLException;
- /**
- * 批处理update或delete功能
- *
- * @param sql
- * @param params
- * @return 变更记录数
- * @throws SQLException
- */
- public abstract int executeBatch(String sql, List<Object[]> params) throws SQLException;
- /**
- * 批处理update或delete功能
- *
- * @param sql
- * @param params
- * @return 变更记录数
- * @throws SQLException
- */
- public abstract int executeBatch(String sql) throws SQLException;
- /**
- * select功能
- *
- * @param sql
- * @param params
- * @return 原生ResultSet数据集合
- * @throws SQLException
- */
- public abstract ResultSet queryForResultSet(String sql, Object[] params) throws SQLException;
- /**
- * select功能
- *
- * @param sql
- * @return 原生ResultSet数据集合
- * @throws SQLException
- */
- public abstract ResultSet queryForResultSet(String sql) throws SQLException;
- /**
- * select功能
- *
- * @param sql
- * @param params
- * @return List<?
- >数据集合
- * @throws SQLException
- */
- public abstract List<?
- > queryForBean(String sql, Object[] params, RowMapper<?> mapper) throws SQLException;
- /**
- * select功能
- *
- * @param sql
- * @param params
- * @return List<?
- >数据集合
- * @throws SQLException
- */
- public abstract List<?> queryForBean(String sql, RowMapper<?> mapper) throws SQLException;
- /**
- * select功能
- *
- * @param sql
- * @param params
- * @return List<Map<String, Object>>数据集合
- * @throws SQLException
- */
- public abstract List<Map<String, Object>> queryForMap(String sql, Object[] params) throws SQLException;
- /**
- * select功能
- *
- * @param sql
- * @param params
- * @return List<Map<String, Object>>数据集合
- * @throws SQLException
- */
- public abstract List<Map<String, Object>> queryForMap(String sql) throws SQLException;
- /**
- * select功能
- *
- * @param sql
- * @return 统计单列记录数
- * @throws SQLException
- */
- public abstract int queryForInt(String sql, Object[] params) throws SQLException;
- /**
- * select功能
- *
- * @param sql
- * @return 统计单列记录数
- * @throws SQLException
- */
- public abstract int queryForInt(String sql) throws SQLException;
- /**
- * 释放Connection资源
- *
- * @param x
- */
- public abstract void free(Connection x);
- /**
- * 释放Statement资源
- *
- * @param x
- */
- public abstract void free(Statement x);
- /**
- * 释放PreparedStatement资源
- *
- * @param x
- */
- public abstract void free(PreparedStatement x);
- /**
- * 释放ResultSet资源
- *
- * @param x
- */
- public abstract void free(ResultSet x);
- /**
- * 设置数据源
- *
- * @param dataSource
- */
- public abstract void setDataSource(DataSource dataSource);
- /**
- * 获取数据库链接
- *
- * @return Connection
- */
- public abstract Connection getConnection();
- /**
- * 获取数据库链接
- *
- * @param autoCommit
- * @return Connection
- */
- public Connection getConnection(boolean autoCommit);
- }
3.实现我们接口里面的方法
- package org.simple.mvc.jdbc.impl;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.sql.SQLException;
- import java.sql.Statement;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.sql.DataSource;
- import org.simple.mvc.jdbc.JdbcOperation;
- import org.simple.mvc.jdbc.bean.RowMapper;
- /**
- * 简易JDBC实现类
- *
- * @author shadow
- *
- */
- public class SimpleJdbc implements JdbcOperation {
- private static final boolean AUTO_COMMIT = true;
- private DataSource dataSource;
- public SimpleJdbc() {
- }
- public SimpleJdbc(DataSource dataSource) {
- this.dataSource = dataSource;
- }
- public Connection getConnection() {
- return getConnection(AUTO_COMMIT);
- }
- public Connection getConnection(boolean autoCommit) {
- try {
- Connection conn = dataSource.getConnection();
- if (!autoCommit)
- conn.setAutoCommit(autoCommit);
- return conn;
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return null;
- }
- @Override
- public int execute(String sql, Object[] params) throws SQLException {
- Connection conn = getConnection(false);
- PreparedStatement stmt = null;
- int result = -1;
- try {
- stmt = createPreparedStatement(conn, sql, params);
- result = stmt.executeUpdate();
- conn.commit();
- } catch (Exception e) {
- conn.rollback();
- e.printStackTrace();
- } finally {
- free(stmt);
- free(conn);
- }
- return result;
- }
- @Override
- public int execute(String sql) throws SQLException {
- return execute(sql, new Object[] {});
- }
- @Override
- public ResultSet queryForResultSet(String sql, Object[] params) throws SQLException {
- Connection conn = getConnection();
- PreparedStatement stmt = null;
- try {
- stmt = createPreparedStatement(conn, sql, params);
- return stmt.executeQuery();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- free(stmt);
- free(conn);
- }
- return null;
- }
- @Override
- public ResultSet queryForResultSet(String sql) throws SQLException {
- return queryForResultSet(sql, new Object[] {});
- }
- @Override
- public int queryForInt(String sql, Object[] params) throws SQLException {
- Connection conn = getConnection();
- PreparedStatement stmt = null;
- ResultSet rs = null;
- try {
- stmt = createPreparedStatement(conn, sql, params);
- rs = createResultSet(stmt);
- while (rs.next()) {
- return rs.getInt(1);
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- free(rs);
- free(stmt);
- free(conn);
- }
- return 0;
- }
- @Override
- public int queryForInt(String sql) throws SQLException {
- return queryForInt(sql, new Object[] {});
- }
- @Override
- public List<?> queryForBean(String sql, Object[] params, RowMapper<?> mapper) throws SQLException {
- Connection conn = getConnection();
- PreparedStatement stmt = null;
- ResultSet rs = null;
- List<Object> list = null;
- try {
- stmt = createPreparedStatement(conn, sql, params);
- rs = createResultSet(stmt);
- list = new ArrayList<Object>();
- while (rs.next()) {
- list.add(mapper.mapRow(rs));
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- free(rs);
- free(stmt);
- free(conn);
- }
- return list;
- }
- @Override
- public List<?
- > queryForBean(String sql, RowMapper<?> mapper) throws SQLException {
- return queryForBean(sql, new Object[] {}, mapper);
- }
- @Override
- public List<Map<String, Object>> queryForMap(String sql, Object[] params) throws SQLException {
- Connection conn = getConnection();
- PreparedStatement stmt = null;
- ResultSet rs = null;
- try {
- stmt = createPreparedStatement(conn, sql, params);
- rs = createResultSet(stmt);
- List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
- Map<String, Object> map = null;
- ResultSetMetaData rsd = rs.getMetaData();
- int columnCount = rsd.getColumnCount();
- while (rs.next()) {
- map = new HashMap<String, Object>(columnCount);
- for (int i = 1; i < columnCount; i++) {
- map.put(rsd.getColumnName(i), rs.getObject(i));
- }
- list.add(map);
- }
- return list;
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- free(rs);
- free(stmt);
- free(conn);
- }
- return null;
- }
- @Override
- public List<Map<String, Object>> queryForMap(String sql) throws SQLException {
- return queryForMap(sql, new Object[] {});
- }
- @Override
- public int executeBatch(String sql, List<Object[]> params) throws SQLException {
- int result = 0;
- Connection conn = getConnection(false);
- PreparedStatement stmt = null;
- try {
- stmt = conn.prepareStatement(sql);
- for (int i = 0; i < params.size(); i++) {
- Object[] param = params.get(i);
- for (int j = 0; j < param.length; j++)
- stmt.setObject(j + 1, param[j]);
- stmt.addBatch();
- if (i % 1000 == 0) {
- stmt.executeBatch();
- stmt.clearBatch();
- }
- }
- stmt.executeBatch();
- conn.commit();
- result = params.size();
- } catch (Exception e) {
- conn.rollback();
- e.printStackTrace();
- } finally {
- free(stmt);
- free(conn);
- }
- return result;
- }
- @Override
- public int executeBatch(String sql) throws SQLException {
- return executeBatch(sql, new ArrayList<Object[]>());
- }
- public DataSource getDataSource() {
- return dataSource;
- }
- public void setDataSource(DataSource dataSource) {
- this.dataSource = dataSource;
- }
- @Override
- public void free(Connection x) {
- if (x != null)
- try {
- x.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void free(Statement x) {
- if (x != null)
- try {
- x.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void free(PreparedStatement x) {
- if (x != null)
- try {
- x.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void free(ResultSet x) {
- if (x != null)
- try {
- x.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- public PreparedStatement createPreparedStatement(Connection conn, String sql, Object[] params) throws SQLException {
- PreparedStatement stmt = conn.prepareStatement(sql);
- for (int i = 0; i < params.length; i++)
- stmt.setObject(i + 1, params[i]);
- return stmt;
- }
- public ResultSet createResultSet(PreparedStatement stmt) throws SQLException {
- return stmt.executeQuery();
- }
- }
4.然后实现我们一个连接池吧,不喜欢dbcp,c3p0的话,那些要依赖包的导致项目重量上去了
- package org.simple.mvc.jdbc.source;
- import java.io.PrintWriter;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.util.LinkedList;
- import javax.sql.DataSource;
- /**
- * 简易连接池实现类
- *
- * @author shadow
- *
- */
- public class SimpleDataSource implements DataSource {
- private int poolSize = 5;
- private LinkedList<Connection> pool = new LinkedList<Connection>();
- public SimpleDataSource(String driver, String url, String name, String pwd) {
- this(driver, url, name, pwd, 5);
- }
- public SimpleDataSource(String driver, String url) {
- this(driver, url, "", "", 5);
- }
- public SimpleDataSource(String driver, String url, String name, String pwd, int poolSize) {
- try {
- Class.forName(driver);
- this.poolSize = poolSize;
- if (poolSize <= 0) {
- throw new RuntimeException("初始化池大小失败: " + poolSize);
- }
- for (int i = 0; i < poolSize; i++) {
- Connection con = DriverManager.getConnection(url, name, pwd);
- con = ConnectionProxy.getProxy(con, pool);// 获取被代理的对象
- pool.add(con);// 加入被代理的对象
- }
- } catch (Exception e) {
- throw new RuntimeException(e.getMessage(), e);
- }
- }
- /** 获取池大小 */
- public int getPoolSize() {
- return poolSize;
- }
- /** 不支持日志操作 */
- public PrintWriter getLogWriter() throws SQLException {
- throw new RuntimeException("Unsupport Operation.");
- }
- public void setLogWriter(PrintWriter out) throws SQLException {
- throw new RuntimeException("Unsupport operation.");
- }
- /** 不支持超时操作 */
- public void setLoginTimeout(int seconds) throws SQLException {
- throw new RuntimeException("Unsupport operation.");
- }
- public int getLoginTimeout() throws SQLException {
- return 0;
- }
- @SuppressWarnings("unchecked")
- public <T> T unwrap(Class<T> iface) throws SQLException {
- return (T) this;
- }
- public boolean isWrapperFor(Class<?> iface) throws SQLException {
- return DataSource.class.equals(iface);
- }
- /** 从池中取一个连接对象,使用了同步和线程调度 */
- public Connection getConnection() throws SQLException {
- synchronized (pool) {
- if (pool.size() == 0) {
- try {
- pool.wait();
- } catch (InterruptedException e) {
- throw new RuntimeException(e.getMessage(), e);
- }
- return getConnection();
- } else {
- return pool.removeFirst();
- }
- }
- }
- public Connection getConnection(String username, String password) throws SQLException {
- throw new RuntimeException("不支持接收username与password的操作");
- }
- /** 实现对Connection的动态代理 */
- static class ConnectionProxy implements InvocationHandler {
- private Object obj;
- private LinkedList<Connection> pool;
- private ConnectionProxy(Object obj, LinkedList<Connection> pool) {
- this.obj = obj;
- this.pool = pool;
- }
- public static Connection getProxy(Object o, LinkedList<Connection> pool) {
- Object proxed = Proxy.newProxyInstance(o.getClass().getClassLoader(), new Class[] { Connection.class },
- new ConnectionProxy(o, pool));
- return (Connection) proxed;
- }
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- if (method.getName().equals("close")) {
- synchronized (pool) {
- pool.add((Connection) proxy);
- pool.notify();
- }
- return null;
- } else {
- return method.invoke(obj, args);
- }
- }
- }
- }
5.開始測试下我们刚刚写的玩意,simplejdbc主要是有datasource提供给他就能够了,其它的一律无视,測试里面的user对象我就不提供,里面就是两个属性,id和username,然后生成set和get方法就可以,当然这个是演示resultset转成bean的,当然也能够直接使用queryForMap直接查询出map集合,我想接口提供的方法已经足够使用了
- public static void main(String[] args) throws SQLException {
- SimpleDataSource dataSource = new SimpleDataSource("org.sqlite.JDBC", "jdbc:sqlite:/E:p1010.db");
- SimpleJdbc jdbc = new SimpleJdbc(dataSource);
- List<User> list = (List<User>) jdbc.queryForBean("select * from t_user", new RowMapper<User>() {
- User user = null;
- @Override
- public User mapRow(ResultSet rs) throws SQLException {
- user = new User();
- user.setId(rs.getInt("id"));
- user.setUsername(rs.getString("username"));
- return user;
- }
- });
- for (User user : list) {
- System.out.println(user.getId() + "---" + user.getUsername());
- }
- }
简易高重用的jdbcutils工具封装实现类以及简易连接池实现的更多相关文章
- DBUtils工具类和DBCP连接池
今日内容介绍 1.DBUtils2.处理结果集的八种方式3.连接池4.连接池的用法1 PrepareStatement接口预编译SQL语句 1.1 预处理对象 * 使用PreparedStatemen ...
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- 通过jdbc完成单表的curd操作以及对JDBCUtils的封装
概述:jdbc是oracle公司制定的一套规范(一套接口),驱动是jdbc的实现类,由数据库厂商提供.所以我们可以通过一套规范实现对不同的数据库操作(多态) jdbc的作用:连接数据库,发送sql语句 ...
- Druid 连接池 JDBCUtils 工具类的使用
Druid工具介绍 它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. 支持所有JDBC兼容的数据库,包括Oracle.MySQL. ...
- day17(JDBC入门&jdbcUtils工具介绍)
day17 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中url ...
- 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式
适用于app.config与web.config的ConfigUtil读写工具类 之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...
- JavaWeb基础之JdbcUtils工具类final
JdbcUtils工具类3.0最终版,添加了事务相关功能和释放链接.最终版本可以直接打成jar包,在后面的基本项目都会使用该工具类 1. JdbcUtils代码 /** * 最终版 * @author ...
- JavaWeb基础之JdbcUtils工具类2.0
使用c3p0连接池来改版JdbcUtils工具 1. 使用c3p0连接池获取连接,使代码更加简单 /** * 使用c3p0连接池做小工具 * JdbcUtils v2.0 * @author hui. ...
- JavaWeb基础之JdbcUtils工具类1.0
2016年12月20日,第一次学习JDBC.看的是传智播客崔希凡老师的视频,东北口音很是风趣幽默,技术之牛让人膜拜.2017年9月21日,再次重温web知识,分享JdbcUtils工具类,用以接下来的 ...
随机推荐
- CSS 清除浮动的4种方法
此为未清除浮动源代码,运行代码无法查看到父级元素浅黄色背景.<style type=”text/css”> <!– *{margin:0;padding:0;} body{font: ...
- SD卡给MCU升级
目 录1. 前言2. 初识BootLoader2.1 百度百科的BootLoader2.2 BootLoader的简单理解2.3 BootLoader的作用3. BootLoader预备知识3.1 复 ...
- 理想中的SQL语句条件拼接方式
背景 Orm用过一些,但处理增删改上面做的都不错.但是查询上跟我想要的效果总是差了一点.我想要的效果则是这样,基于某种命名规则进行传参,后台解析器知道命名规则即可知道它要查询什么样的数据. 谈谈我之前 ...
- 【IDEA】IDEA创建Maven的Web项目并运行以及打包
0.IDEA集成Maven并设置Maven的配置 idea15之后的版本,都自带了maven插件,idea14貌似需要自己安装,方法也很简单:File->Settings->Plugin ...
- 不只是内存分析工具~valgrind
体系结构:原理介绍·参考好文:应用 Valgrind 发现 Linux 程序的内存问题 简单组一个摘要: Valgrind包括如下一些工具: Memcheck.这是valgrind应用最广泛的工具,一 ...
- C++虚函数表解析(基础篇)
原文:http://blog.csdn.net/haoel/article/details/1948051 一.简介 C++中的虚函数的作用主要是实现了多态的机制.虚函数(Virtual Funct ...
- 基于UDT connect连接通信以及文件传输--客户端
上面一篇文章中提出了服务端的,其实这里没有严格意义的服务端和客户端之分,因为我在代码中是基于UDP的,不存在服务端与客户端,两个都是对等的,只是我这里进行一下简单的区分而已.在这里,客户端所进行的主要 ...
- 【原创】CMD命令设置IP地址
问题描述 在实际工作中,尤其是像我们这种BI分析人员,在做项目的时候,时常都需要因客户的不同随时切换不同的网络环境,有时可能需要在公司和客户之间来回的穿梭.交替.问题也就随之而来:每次客户那里都需要设 ...
- NetStream配置
http://support.huawei.com/enterprise/docinforeader!loadDocument1.action?contentId=DOC1000067951& ...
- .ner core InvalidOperationException: Cannot find compilation library location for package 'xxx' 和 SqlException: 'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。问题
原文地址:传送门 1.InvalidOperationException: Cannot find compilation library location for package 'xxx'问题: ...