简易高重用的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工具类,用以接下来的 ...
随机推荐
- linux上的vim永久显示行号
步骤1: cp /usr/share/vim/vimrc ~/.vimrc 先复制一份vim配置模板到个人目录下 注:redhat 改成 cp /etc/vimrc ~/.vimrc 步骤2: vi ...
- 浅谈Visitor Pattern
第一步: 在介绍Visitor Pattern (访问者模式)之前,先简要介绍一下:双重分派. 在Visitor Pattern中双重分派是指:数据结构的每一个节点都可以接受一个访问者的调用(这句 ...
- 转:CentOS 6.5 nginx
CentOS 6.5安装及简单配置Nginx 一.准备事项 (1) 因为nginx需要访问80端口所以请先关闭或者开放防火墙端口,和selinux. 参考命令 关闭防火墙: [root@local ~ ...
- webpack最佳入门实践系列(6)
10.css模块化 10.1.什么是css模块? CSS模块就是所有的类名都只有局部作用域的CSS文件,当你在一个JavaScript模块中导入一个CSS文件时,CSS模块将会定义一个对象,将文件中类 ...
- Linux Mint---shutter截图软件
shutter 可以说是linux下最好的截图软件了,默认安装好后不能编辑截图,解决方法如下: 1-关闭shutter 2-sudo apt-get install shutter libgoo-ca ...
- Linux Mint---开启桌面三维特效
其实系统默认已经安装好了compiz,我们只需要切换就可以了 menu->control center->desktop setting->window 开启compiz的时候,由于 ...
- table 实现 九宫格布局
九宫格布局 最近遇到一个题目,是实现一个九宫格布局的.实现的效果大概是下图这种这样子的: (鼠标悬浮的时候,九宫格的边框颜色是改变的.) 首先想到的是直接使用<table>进行布局,原因很 ...
- Vim 自动补全成对的括号和引号
修改后: 1 :inoremap (()<ESC>i 2:inoremap )<c-r>=ClosePair(')')<CR> 3:inoremap {{}< ...
- 函数atof,atoi,atol,strtod,strtol,strtoul 描述
函数atof,atoi,atol,strtod,strtol,strtoul atof(将字串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul表头文件 #in ...
- c专家编程读书笔记
无论在什么时候,如果遇到malloc(strlen(str));,几乎可以直接断定他是错误的,而malloc(strlen(str)+1):才是正确的: 一个L的NUL哟关于结束一个ACSII字符串: ...