简易高重用的jdbcutils工具封装实现类以及简易连接池实现

本文介绍了一个简易的JDBC实现与连接池构造方法,包括接口定义、类实现及测试验证,旨在提供轻量级的数据库操作解决方案。

     由于现在发现做个小项目都是导入n多的依赖包,很烦琐,只想快点开发完一个个的小需求项目,这个时候真心不想用框架,只能自己写个jdbcutils,虽然网上有很多有apache的,阿里的,但是感觉用过后都不怎么顺手,然后自己花了点时间写个新的,不喜勿喷


1.我们要写个resultset集合转成bean的回调接口,这个用过spring jdbc的人都知道这玩意

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.simple.mvc.jdbc.bean;  
  2.   
  3. import java.sql.ResultSet;  
  4. import java.sql.SQLException;  
  5.   
  6. public interface RowMapper<T> {  
  7.   
  8.     public abstract T mapRow(ResultSet rs) throws SQLException;  
  9.   
  10. }  


2.先来个基本的jdbc操作接口吧,这样好规范点

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.simple.mvc.jdbc;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7. import java.sql.Statement;  
  8. import java.util.List;  
  9. import java.util.Map;  
  10.   
  11. import javax.sql.DataSource;  
  12.   
  13. import org.simple.mvc.jdbc.bean.RowMapper;  
  14.   
  15. public interface JdbcOperation {  
  16.   
  17.     /** 
  18.      * update或delete功能 
  19.      *  
  20.      * @param sql 
  21.      * @param params 
  22.      * @return 变更记录数 
  23.      * @throws SQLException 
  24.      */  
  25.     public abstract int execute(String sql, Object[] params) throws SQLException;  
  26.   
  27.     /** 
  28.      * update或delete功能 
  29.      *  
  30.      * @param sql 
  31.      * @return 变更记录数 
  32.      * @throws SQLException 
  33.      */  
  34.     public abstract int execute(String sql) throws SQLException;  
  35.   
  36.     /** 
  37.      * 批处理update或delete功能 
  38.      *  
  39.      * @param sql 
  40.      * @param params 
  41.      * @return 变更记录数 
  42.      * @throws SQLException 
  43.      */  
  44.     public abstract int executeBatch(String sql, List<Object[]> params) throws SQLException;  
  45.   
  46.     /** 
  47.      * 批处理update或delete功能 
  48.      *  
  49.      * @param sql 
  50.      * @param params 
  51.      * @return 变更记录数 
  52.      * @throws SQLException 
  53.      */  
  54.     public abstract int executeBatch(String sql) throws SQLException;  
  55.   
  56.     /** 
  57.      * select功能 
  58.      *  
  59.      * @param sql 
  60.      * @param params 
  61.      * @return 原生ResultSet数据集合 
  62.      * @throws SQLException 
  63.      */  
  64.     public abstract ResultSet queryForResultSet(String sql, Object[] params) throws SQLException;  
  65.   
  66.     /** 
  67.      * select功能 
  68.      *  
  69.      * @param sql 
  70.      * @return 原生ResultSet数据集合 
  71.      * @throws SQLException 
  72.      */  
  73.     public abstract ResultSet queryForResultSet(String sql) throws SQLException;  
  74.   
  75.     /** 
  76.      * select功能 
  77.      *  
  78.      * @param sql 
  79.      * @param params 
  80.      * @return List<?>数据集合 
  81.      * @throws SQLException 
  82.      */  
  83.     public abstract List<?> queryForBean(String sql, Object[] params, RowMapper<?> mapper) throws SQLException;  
  84.   
  85.     /** 
  86.      * select功能 
  87.      *  
  88.      * @param sql 
  89.      * @param params 
  90.      * @return List<?>数据集合 
  91.      * @throws SQLException 
  92.      */  
  93.     public abstract List<?> queryForBean(String sql, RowMapper<?> mapper) throws SQLException;  
  94.   
  95.     /** 
  96.      * select功能 
  97.      *  
  98.      * @param sql 
  99.      * @param params 
  100.      * @return List<Map<String, Object>>数据集合 
  101.      * @throws SQLException 
  102.      */  
  103.     public abstract List<Map<String, Object>> queryForMap(String sql, Object[] params) throws SQLException;  
  104.   
  105.     /** 
  106.      * select功能 
  107.      *  
  108.      * @param sql 
  109.      * @param params 
  110.      * @return List<Map<String, Object>>数据集合 
  111.      * @throws SQLException 
  112.      */  
  113.     public abstract List<Map<String, Object>> queryForMap(String sql) throws SQLException;  
  114.   
  115.     /** 
  116.      * select功能 
  117.      *  
  118.      * @param sql 
  119.      * @return 统计单列记录数 
  120.      * @throws SQLException 
  121.      */  
  122.     public abstract int queryForInt(String sql, Object[] params) throws SQLException;  
  123.   
  124.     /** 
  125.      * select功能 
  126.      *  
  127.      * @param sql 
  128.      * @return 统计单列记录数 
  129.      * @throws SQLException 
  130.      */  
  131.     public abstract int queryForInt(String sql) throws SQLException;  
  132.   
  133.     /** 
  134.      * 释放Connection资源 
  135.      *  
  136.      * @param x 
  137.      */  
  138.     public abstract void free(Connection x);  
  139.   
  140.     /** 
  141.      * 释放Statement资源 
  142.      *  
  143.      * @param x 
  144.      */  
  145.     public abstract void free(Statement x);  
  146.   
  147.     /** 
  148.      * 释放PreparedStatement资源 
  149.      *  
  150.      * @param x 
  151.      */  
  152.     public abstract void free(PreparedStatement x);  
  153.   
  154.     /** 
  155.      * 释放ResultSet资源 
  156.      *  
  157.      * @param x 
  158.      */  
  159.     public abstract void free(ResultSet x);  
  160.   
  161.     /** 
  162.      * 设置数据源 
  163.      *  
  164.      * @param dataSource 
  165.      */  
  166.     public abstract void setDataSource(DataSource dataSource);  
  167.   
  168.     /** 
  169.      * 获取数据库链接 
  170.      *  
  171.      * @return Connection 
  172.      */  
  173.     public abstract Connection getConnection();  
  174.   
  175.     /** 
  176.      * 获取数据库链接 
  177.      *  
  178.      * @param autoCommit 
  179.      * @return Connection 
  180.      */  
  181.     public Connection getConnection(boolean autoCommit);  
  182.   
  183. }  



3.实现我们接口里面的方法

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.simple.mvc.jdbc.impl;  
  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.util.ArrayList;  
  10. import java.util.HashMap;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13.   
  14. import javax.sql.DataSource;  
  15.   
  16. import org.simple.mvc.jdbc.JdbcOperation;  
  17. import org.simple.mvc.jdbc.bean.RowMapper;  
  18.   
  19. /** 
  20.  * 简易JDBC实现类 
  21.  *  
  22.  * @author shadow 
  23.  *  
  24.  */  
  25. public class SimpleJdbc implements JdbcOperation {  
  26.   
  27.     private static final boolean AUTO_COMMIT = true;  
  28.   
  29.     private DataSource dataSource;  
  30.   
  31.     public SimpleJdbc() {  
  32.   
  33.     }  
  34.   
  35.     public SimpleJdbc(DataSource dataSource) {  
  36.         this.dataSource = dataSource;  
  37.     }  
  38.   
  39.     public Connection getConnection() {  
  40.         return getConnection(AUTO_COMMIT);  
  41.     }  
  42.   
  43.     public Connection getConnection(boolean autoCommit) {  
  44.         try {  
  45.             Connection conn = dataSource.getConnection();  
  46.             if (!autoCommit)  
  47.                 conn.setAutoCommit(autoCommit);  
  48.             return conn;  
  49.         } catch (SQLException e) {  
  50.             e.printStackTrace();  
  51.         }  
  52.         return null;  
  53.     }  
  54.   
  55.     @Override  
  56.     public int execute(String sql, Object[] params) throws SQLException {  
  57.         Connection conn = getConnection(false);  
  58.         PreparedStatement stmt = null;  
  59.         int result = -1;  
  60.         try {  
  61.             stmt = createPreparedStatement(conn, sql, params);  
  62.             result = stmt.executeUpdate();  
  63.             conn.commit();  
  64.         } catch (Exception e) {  
  65.             conn.rollback();  
  66.             e.printStackTrace();  
  67.         } finally {  
  68.             free(stmt);  
  69.             free(conn);  
  70.         }  
  71.         return result;  
  72.     }  
  73.   
  74.     @Override  
  75.     public int execute(String sql) throws SQLException {  
  76.         return execute(sql, new Object[] {});  
  77.     }  
  78.   
  79.     @Override  
  80.     public ResultSet queryForResultSet(String sql, Object[] params) throws SQLException {  
  81.         Connection conn = getConnection();  
  82.         PreparedStatement stmt = null;  
  83.         try {  
  84.             stmt = createPreparedStatement(conn, sql, params);  
  85.             return stmt.executeQuery();  
  86.         } catch (Exception e) {  
  87.             e.printStackTrace();  
  88.         } finally {  
  89.             free(stmt);  
  90.             free(conn);  
  91.         }  
  92.         return null;  
  93.     }  
  94.   
  95.     @Override  
  96.     public ResultSet queryForResultSet(String sql) throws SQLException {  
  97.         return queryForResultSet(sql, new Object[] {});  
  98.     }  
  99.   
  100.     @Override  
  101.     public int queryForInt(String sql, Object[] params) throws SQLException {  
  102.         Connection conn = getConnection();  
  103.         PreparedStatement stmt = null;  
  104.         ResultSet rs = null;  
  105.         try {  
  106.             stmt = createPreparedStatement(conn, sql, params);  
  107.             rs = createResultSet(stmt);  
  108.             while (rs.next()) {  
  109.                 return rs.getInt(1);  
  110.             }  
  111.         } catch (Exception e) {  
  112.             e.printStackTrace();  
  113.         } finally {  
  114.             free(rs);  
  115.             free(stmt);  
  116.             free(conn);  
  117.         }  
  118.         return 0;  
  119.     }  
  120.   
  121.     @Override  
  122.     public int queryForInt(String sql) throws SQLException {  
  123.         return queryForInt(sql, new Object[] {});  
  124.     }  
  125.   
  126.     @Override  
  127.     public List<?> queryForBean(String sql, Object[] params, RowMapper<?> mapper) throws SQLException {  
  128.         Connection conn = getConnection();  
  129.         PreparedStatement stmt = null;  
  130.         ResultSet rs = null;  
  131.         List<Object> list = null;  
  132.         try {  
  133.             stmt = createPreparedStatement(conn, sql, params);  
  134.             rs = createResultSet(stmt);  
  135.             list = new ArrayList<Object>();  
  136.             while (rs.next()) {  
  137.                 list.add(mapper.mapRow(rs));  
  138.             }  
  139.         } catch (Exception e) {  
  140.             e.printStackTrace();  
  141.         } finally {  
  142.             free(rs);  
  143.             free(stmt);  
  144.             free(conn);  
  145.         }  
  146.         return list;  
  147.     }  
  148.   
  149.     @Override  
  150.     public List<?> queryForBean(String sql, RowMapper<?> mapper) throws SQLException {  
  151.         return queryForBean(sql, new Object[] {}, mapper);  
  152.     }  
  153.   
  154.     @Override  
  155.     public List<Map<String, Object>> queryForMap(String sql, Object[] params) throws SQLException {  
  156.         Connection conn = getConnection();  
  157.         PreparedStatement stmt = null;  
  158.         ResultSet rs = null;  
  159.         try {  
  160.             stmt = createPreparedStatement(conn, sql, params);  
  161.             rs = createResultSet(stmt);  
  162.   
  163.             List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  164.             Map<String, Object> map = null;  
  165.             ResultSetMetaData rsd = rs.getMetaData();  
  166.             int columnCount = rsd.getColumnCount();  
  167.   
  168.             while (rs.next()) {  
  169.                 map = new HashMap<String, Object>(columnCount);  
  170.                 for (int i = 1; i < columnCount; i++) {  
  171.                     map.put(rsd.getColumnName(i), rs.getObject(i));  
  172.                 }  
  173.                 list.add(map);  
  174.             }  
  175.   
  176.             return list;  
  177.         } catch (Exception e) {  
  178.             e.printStackTrace();  
  179.         } finally {  
  180.             free(rs);  
  181.             free(stmt);  
  182.             free(conn);  
  183.         }  
  184.         return null;  
  185.     }  
  186.   
  187.     @Override  
  188.     public List<Map<String, Object>> queryForMap(String sql) throws SQLException {  
  189.         return queryForMap(sql, new Object[] {});  
  190.     }  
  191.   
  192.     @Override  
  193.     public int executeBatch(String sql, List<Object[]> params) throws SQLException {  
  194.         int result = 0;  
  195.         Connection conn = getConnection(false);  
  196.         PreparedStatement stmt = null;  
  197.         try {  
  198.             stmt = conn.prepareStatement(sql);  
  199.             for (int i = 0; i < params.size(); i++) {  
  200.                 Object[] param = params.get(i);  
  201.                 for (int j = 0; j < param.length; j++)  
  202.                     stmt.setObject(j + 1, param[j]);  
  203.                 stmt.addBatch();  
  204.                 if (i % 1000 == 0) {  
  205.                     stmt.executeBatch();  
  206.                     stmt.clearBatch();  
  207.                 }  
  208.             }  
  209.             stmt.executeBatch();  
  210.             conn.commit();  
  211.             result = params.size();  
  212.         } catch (Exception e) {  
  213.             conn.rollback();  
  214.             e.printStackTrace();  
  215.         } finally {  
  216.             free(stmt);  
  217.             free(conn);  
  218.         }  
  219.         return result;  
  220.     }  
  221.   
  222.     @Override  
  223.     public int executeBatch(String sql) throws SQLException {  
  224.         return executeBatch(sql, new ArrayList<Object[]>());  
  225.     }  
  226.   
  227.     public DataSource getDataSource() {  
  228.         return dataSource;  
  229.     }  
  230.   
  231.     public void setDataSource(DataSource dataSource) {  
  232.         this.dataSource = dataSource;  
  233.     }  
  234.   
  235.     @Override  
  236.     public void free(Connection x) {  
  237.         if (x != null)  
  238.             try {  
  239.                 x.close();  
  240.             } catch (SQLException e) {  
  241.                 e.printStackTrace();  
  242.             }  
  243.     }  
  244.   
  245.     @Override  
  246.     public void free(Statement x) {  
  247.         if (x != null)  
  248.             try {  
  249.                 x.close();  
  250.             } catch (SQLException e) {  
  251.                 e.printStackTrace();  
  252.             }  
  253.     }  
  254.   
  255.     @Override  
  256.     public void free(PreparedStatement x) {  
  257.         if (x != null)  
  258.             try {  
  259.                 x.close();  
  260.             } catch (SQLException e) {  
  261.                 e.printStackTrace();  
  262.             }  
  263.     }  
  264.   
  265.     @Override  
  266.     public void free(ResultSet x) {  
  267.         if (x != null)  
  268.             try {  
  269.                 x.close();  
  270.             } catch (SQLException e) {  
  271.                 e.printStackTrace();  
  272.             }  
  273.     }  
  274.   
  275.     public PreparedStatement createPreparedStatement(Connection conn, String sql, Object[] params) throws SQLException {  
  276.         PreparedStatement stmt = conn.prepareStatement(sql);  
  277.         for (int i = 0; i < params.length; i++)  
  278.             stmt.setObject(i + 1, params[i]);  
  279.         return stmt;  
  280.     }  
  281.   
  282.     public ResultSet createResultSet(PreparedStatement stmt) throws SQLException {  
  283.         return stmt.executeQuery();  
  284.     }  
  285. }  





4.然后实现我们一个连接池吧,不喜欢dbcp,c3p0的话,那些要依赖包的导致项目重量上去了

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.simple.mvc.jdbc.source;  
  2.   
  3. import java.io.PrintWriter;  
  4. import java.lang.reflect.InvocationHandler;  
  5. import java.lang.reflect.Method;  
  6. import java.lang.reflect.Proxy;  
  7. import java.sql.Connection;  
  8. import java.sql.DriverManager;  
  9. import java.sql.SQLException;  
  10. import java.util.LinkedList;  
  11.   
  12. import javax.sql.DataSource;  
  13.   
  14. /** 
  15.  * 简易连接池实现类 
  16.  *  
  17.  * @author shadow 
  18.  *  
  19.  */  
  20. public class SimpleDataSource implements DataSource {  
  21.   
  22.     private int poolSize = 5;  
  23.   
  24.     private LinkedList<Connection> pool = new LinkedList<Connection>();  
  25.   
  26.     public SimpleDataSource(String driver, String url, String name, String pwd) {  
  27.         this(driver, url, name, pwd, 5);  
  28.     }  
  29.   
  30.     public SimpleDataSource(String driver, String url) {  
  31.         this(driver, url, """"5);  
  32.     }  
  33.   
  34.     public SimpleDataSource(String driver, String url, String name, String pwd, int poolSize) {  
  35.         try {  
  36.             Class.forName(driver);  
  37.             this.poolSize = poolSize;  
  38.             if (poolSize <= 0) {  
  39.                 throw new RuntimeException("初始化池大小失败: " + poolSize);  
  40.             }  
  41.   
  42.             for (int i = 0; i < poolSize; i++) {  
  43.                 Connection con = DriverManager.getConnection(url, name, pwd);  
  44.                 con = ConnectionProxy.getProxy(con, pool);// 获取被代理的对象  
  45.                 pool.add(con);// 添加被代理的对象  
  46.             }  
  47.         } catch (Exception e) {  
  48.             throw new RuntimeException(e.getMessage(), e);  
  49.         }  
  50.   
  51.     }  
  52.   
  53.     /** 获取池大小 */  
  54.     public int getPoolSize() {  
  55.         return poolSize;  
  56.   
  57.     }  
  58.   
  59.     /** 不支持日志操作 */  
  60.     public PrintWriter getLogWriter() throws SQLException {  
  61.         throw new RuntimeException("Unsupport Operation.");  
  62.     }  
  63.   
  64.     public void setLogWriter(PrintWriter out) throws SQLException {  
  65.         throw new RuntimeException("Unsupport operation.");  
  66.     }  
  67.   
  68.     /** 不支持超时操作 */  
  69.     public void setLoginTimeout(int seconds) throws SQLException {  
  70.         throw new RuntimeException("Unsupport operation.");  
  71.     }  
  72.   
  73.     public int getLoginTimeout() throws SQLException {  
  74.         return 0;  
  75.     }  
  76.   
  77.     @SuppressWarnings("unchecked")  
  78.     public <T> T unwrap(Class<T> iface) throws SQLException {  
  79.         return (T) this;  
  80.     }  
  81.   
  82.     public boolean isWrapperFor(Class<?> iface) throws SQLException {  
  83.         return DataSource.class.equals(iface);  
  84.     }  
  85.   
  86.     /** 从池中取一个连接对象,使用了同步和线程调度 */  
  87.     public Connection getConnection() throws SQLException {  
  88.         synchronized (pool) {  
  89.             if (pool.size() == 0) {  
  90.                 try {  
  91.                     pool.wait();  
  92.                 } catch (InterruptedException e) {  
  93.                     throw new RuntimeException(e.getMessage(), e);  
  94.                 }  
  95.                 return getConnection();  
  96.             } else {  
  97.                 return pool.removeFirst();  
  98.             }  
  99.         }  
  100.     }  
  101.   
  102.     public Connection getConnection(String username, String password) throws SQLException {  
  103.         throw new RuntimeException("不支持接收用户名和密码的操作");  
  104.     }  
  105.   
  106.     /** 实现对Connection的动态代理 */  
  107.     static class ConnectionProxy implements InvocationHandler {  
  108.   
  109.         private Object obj;  
  110.         private LinkedList<Connection> pool;  
  111.   
  112.         private ConnectionProxy(Object obj, LinkedList<Connection> pool) {  
  113.             this.obj = obj;  
  114.             this.pool = pool;  
  115.         }  
  116.   
  117.         public static Connection getProxy(Object o, LinkedList<Connection> pool) {  
  118.             Object proxed = Proxy.newProxyInstance(o.getClass().getClassLoader(), new Class[] { Connection.class },  
  119.                     new ConnectionProxy(o, pool));  
  120.             return (Connection) proxed;  
  121.         }  
  122.   
  123.         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
  124.             if (method.getName().equals("close")) {  
  125.                 synchronized (pool) {  
  126.                     pool.add((Connection) proxy);  
  127.                     pool.notify();  
  128.                 }  
  129.                 return null;  
  130.             } else {  
  131.                 return method.invoke(obj, args);  
  132.             }  
  133.         }  
  134.   
  135.     }  
  136.   
  137. }  




5.开始测试下我们刚刚写的玩意,simplejdbc主要是有datasource提供给他就可以了,其他的一律无视,测试里面的user对象我就不提供,里面就是两个属性,id和username,然后生成set和get方法即可,当然这个是演示resultset转成bean的,当然也可以直接使用queryForMap直接查询出map集合,我想接口提供的方法已经足够使用了

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public static void main(String[] args) throws SQLException {  
  2.         SimpleDataSource dataSource = new SimpleDataSource("org.sqlite.JDBC""jdbc:sqlite:/E:p1010.db");  
  3.         SimpleJdbc jdbc = new SimpleJdbc(dataSource);  
  4.         List<User> list = (List<User>) jdbc.queryForBean("select * from t_user"new RowMapper<User>() {  
  5.             User user = null;  
  6.   
  7.             @Override  
  8.             public User mapRow(ResultSet rs) throws SQLException {  
  9.                 user = new User();  
  10.                 user.setId(rs.getInt("id"));  
  11.                 user.setUsername(rs.getString("username"));  
  12.                 return user;  
  13.             }  
  14.         });  
  15.         for (User user : list) {  
  16.             System.out.println(user.getId() + "---" + user.getUsername());  
  17.         }  
  18.     }  
【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink仿真实现)内容概要:本文档是一份关于“光伏并网逆变器扫频与稳定性分析”的Simulink仿真实现资源,重点复现博士论文中的阻抗建模与扫频法验证过程,涵盖锁相环和电流环等关键控制环节。通过构建详细的逆变器模型,采用小信号扰动方法进行频域扫描,获取系统输出阻抗特性,并结合奈奎斯特稳定判据分析并网系统的稳定性,帮助深入理解光伏发电系统在弱电网条件下的动态行为与失稳机理。; 适合人群:具备电力电子、自动控制理论基础,熟悉Simulink仿真环境,从事新能源发电、微电网或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握光伏并网逆变器的阻抗建模方法;②学习基于扫频法的系统稳定性分析流程;③复现水平学术论文中的关键技术环节,支撑科研项目或学位论文工作;④为实际工程中并网逆变器的稳定性问题提供仿真分析手段。; 阅读建议:建议读者结合相关理论教材与原始论文,逐步运行并调试提供的Simulink模型,重点关注锁相环与电流控制器参数对系统阻抗特性的影响,通过改变电网强度等条件观察系统稳定性变化,深化对阻抗分析法的理解与应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值