JDBC浅层封装
时间:2019-10-15
本文章向大家介绍JDBC浅层封装,主要包括JDBC浅层封装使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在我16年的博客中,写过"JavaEE中的MVC"系列的文章,解析了系统各个部分的基本设计,属于大学时期的作品了,原本想写在毕业设计上,不过老师们看不懂,算是大学的遗憾吧。
在不断地设计就发现,DAO的封装,最终的只会朝着两个方向发展,一种是MyBatis这样,基于模版引擎;另一种就是像Hibernate,把数据映射发挥到极致;或者,二者兼有。
自己设计的价值基本没有,但是,这个过程,有利于加深对框架的理解。
是最基本的封装,简单、有效,如果使用Sqlite数据库的话,会非常有用,SessionFactory可以按需求加入连接池的使用。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * "org.sqlite.JDBC" * "com.mysql.jdbc.driver" * * @author 41320 * @date 2017年4月7日,21:28:33 */ public class SessionFactory { final static Logger log = LoggerFactory.getLogger(SessionFactory.class); private static String sUrl = null; public void build(String driver, String url) throws IOException { try{ Class.forName(driver); SessionFactory.sUrl = url; } catch(Exception e){ throw new IOException("无法建立数据库连接:" + url, e); } } public static Connection getConnection(){ try { return DriverManager.getConnection(sUrl); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 作为Connection的一个包装类,提取了JDBC中常用的方法,简化数据库的操作难度, * 依托于SessionFactory,可以单独作为工具类使用,或者作为EasyDao的基类使用 * * @author 41320 * @date 2017年4月7日,21:28:33 */ public class Session implements AutoCloseable { private Connection conn; /** * 执行一条Sql语句,包括Insert、Delete、Update * @param sql * @param params * @return */ public int executeUpdate(String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); return preparedStatement.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); return 0; } } /** * 执行一条带参数查询语句,通过回调函数处理结果 * @param parser * @param sql * @param params * @param <T> * @return */ public <T> T queryOne(ResultSetParser<T> parser, String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); try (ResultSet resultSet = preparedStatement.executeQuery()) { resultSet.next(); return parser.parse(resultSet); } } catch (SQLException e) { e.printStackTrace(); return null; } } /** * 执行一条带参数查询语句,通过回调函数处理结果 * * @param sql * @param params * @return Object * @throws SQLException */ public Map<String, Object> queryAsMap(String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); try (ResultSet resultSet = preparedStatement.executeQuery()) { ResultSetMetaData metaData = resultSet.getMetaData(); int cols = metaData.getColumnCount(); resultSet.next(); Map<String, Object> map = new HashMap<>(cols); for (int i = 0; i < cols; i++) { String key = metaData.getColumnName(i + 1); Object value = resultSet.getObject(i + 1); map.put(key.toUpperCase(), value); } return map; } } catch (SQLException e) { e.printStackTrace(); return null; } } /** * 执行一条带参数查询语句,通过回调函数处理结果 * * @param parser * @param sql * @param params * @return Object */ public <T> List<T> queryList(ResultSetParser<T> parser, String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); try (ResultSet resultSet = preparedStatement.executeQuery()) { List<T> retList = new ArrayList<T>(); while (resultSet.next()) { retList.add(parser.parse(resultSet)); } return retList; } } catch (SQLException e) { e.printStackTrace(); return null; } } /** * 执行一条带参数查询语句,通过回调函数处理结果 * * @param sql * @param params * @return Object */ public List<Map<String, Object>> queryAsListMap(String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); try (ResultSet resultSet = preparedStatement.executeQuery()) { ResultSetMetaData metaData = resultSet.getMetaData(); int cols = metaData.getColumnCount(); List<Map<String, Object>> res = new ArrayList<>(); while (resultSet.next()) { Map<String, Object> map = new HashMap<>(cols); for (int i = 0; i < cols; i++) { String key = metaData.getColumnName(i + 1); Object value = resultSet.getObject(i + 1); map.put(key.toUpperCase(), value); } res.add(map); } return res; } } catch (SQLException e) { e.printStackTrace(); return null; } } public int queryCount(String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); try (ResultSet resultSet = preparedStatement.executeQuery()) { resultSet.next(); return resultSet.getInt(1); } } catch (SQLException e) { e.printStackTrace(); return 0; } } private int queryCntBySql(String sql, Object... params) { int idx = sql.indexOf(" from "); if (idx < 0) { sql = sql.toLowerCase(); idx = sql.indexOf(" from "); } String cntSql = "select count(*) " + sql.substring(idx); return queryCount(cntSql, params); } public <T> Page queryPage(ResultSetParser<T> parser, String sql, Object... params) { Page page = new Page(); page.list = this.queryList(parser, sql, params); page.total = queryCntBySql(sql, params); return page; } public Page queryPage(String sql, Object... params) { Page page = new Page(); page.list = this.queryAsListMap(sql, params); page.total = queryCntBySql(sql, params); return page; } /** * 执行插入操作 * * @param sql - * @param args - * @return 自增的ID */ public Integer insert(String sql, Object... args) { try (PreparedStatement ps = conn.prepareStatement(sql)) { setParams(ps, args); ps.executeUpdate(); try (ResultSet rs = ps.getGeneratedKeys()) { if (rs != null) { return rs.getInt(1); } } } catch (SQLException e) { e.printStackTrace(); } return null; } public void beginTrancation(String methodName) { try { conn.setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); } } /** * 提交事务,关闭连接,并且清除引用 */ public void commit() { try { conn.commit(); } catch (SQLException e) { e.printStackTrace(); } } /** * 事务回滚 */ public void rollback() { try { conn.rollback(); } catch (SQLException e) { e.printStackTrace(); } } /** * 关闭并清除引用 */ @Override public void close() { try { if (conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } /** * PreparedStatement参数注入 * @param pstmt * @param params * @throws SQLException */ private void setParams(PreparedStatement pstmt, Object... params) throws SQLException { if (params != null) { for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } } } /** * 结果集处理回调 */ @FunctionalInterface public interface ResultSetParser<T> { T parse(ResultSet rs); } /** * 分页,按需调整 */ public class Page { public int total; public List<?> list; } }
2016
原文地址:https://www.cnblogs.com/chenss15060100790/p/11681665.html
- 大数据基础系列之提交spark应用及依赖管理
- 大数据集群安全系列之kafka使用SSL加密认证
- 基于zookeeper leader选举方式一
- Spark与mongodb整合完整版本
- spark源码系列之累加器实现机制及自定义累加器
- Scala语法基础之隐式转换
- SparkSql的优化器-Catalyst
- Scala语言基础之结合demo和spark讲实现链式计算
- Spark高级操作之json复杂和嵌套数据结构的操作二
- Spark高级操作之json复杂和嵌套数据结构的操作一
- hadoop系列之基础系列
- Spark的调度系统
- Spark Structured Streaming的高效处理-RunOnceTrigger
- Spark度量系统相关讲解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Cocos Creator 2.x透明渐变效果实现
- Themeleaf通过ajax局部更新
- ubuntu下利用expect实现screen多窗口开机运行
- hetzner服务器购买和安装debian系统
- 安全通告 | Apache SkyWalking SQL注入漏洞安全风险公告(CVE-2020-13921)
- Cmd Markdown 迁移备份的流程
- PyTorch3:计算图torch.autograph
- spark shell 配置 Kryo 序列化
- Mac里捣腾Kerberos(一)
- Spark on K8S 访问 Kerberized HDFS
- Apache Beam的Docker Demo
- docker login 报错了...
- Spark-Submit 和 K8S Operation For Spark
- Spark的Dockerfile分析
- Spark on Kubernetes在Mac的Demo