flea-db使用之封装JDBC接入
封装JDBC接入
本篇将要演示 FleaJDBCHelper 的使用,该工具类封装了基本的JDBC增删改查的操作,只需简单几步即可实现数据库操作。
1. 准备工作
为了演示JDBC接入(参考 JPA接入 中的准备工作),需要如下准备:
- MySQL数据库 (客户端可以使用 navicat for mysql)
- 新建测试数据库 fleajpatest
- 新建测试表 student
2. 接入讲解
2.1 JDBC数据源配置
数据源配置独立出来,定义在 flea-config.xml 中,可添加多个JDBC数据库配置【即 config-items 节点】。
<?xml version="1.0" encoding="UTF-8"?><flea-config><!-- 其他配置省略 --><config-items key="mysql-fleajpatest" desc="JDBC数据库配置【key=数据库系统-数据库或数据库用户】"><config-item key="driver" desc="mysql数据库驱动名">com.mysql.jdbc.Driver</config-item><config-item key="url" desc="mysql数据库连接地址">jdbc:mysql://localhost:3306/fleajpatest?useUnicode=true&characterEncoding=UTF-8</config-item><config-item key="user" desc="mysql数据库登录用户名">root</config-item><config-item key="password" desc="mysql数据库登录密码">root</config-item></config-items></flea-config>
2.2 定义Flea数据库单元 – FleaDBUnit
/*** <p> Flea 数据库单元 </p>** @author huazie*/
public class FleaDBUnit {private String database; // 数据库管理系统名private String name; // 数据库名 或 数据库用户名private String driver; // 数据库驱动名private String url; // 数据库连接地址private String user; // 数据库登录用户名private String password; // 数据库登录密码// 省略 set 和 get方法
}
2.3 定义Flea数据库操作类 – FleaDBOperation
/*** <p> Flea数据库操作 </p>** @author huazie*/
public class FleaDBOperation implements Closeable {private Connection connection;private PreparedStatement preparedStatement;private ResultSet resultSet;@Overridepublic void close() {FleaJDBCConfig.close(connection, preparedStatement, resultSet);}// 省略 set 和 get方法
}
2.4 定义Flea JDBC配置类 — FleaJDBCConfig
/*** <p> 读取数据库的配置信息,该信息存在于flea-config.xml中 </p>** @author huazie*/
public class FleaJDBCConfig {private static volatile FleaJDBCConfig config;private static final ConcurrentMap<String, FleaDBUnit> fleaDBUnits = new ConcurrentHashMap<>();private FleaJDBCConfig() {}/*** <p> 读取数据库相关配置信息 </p>** @return JDBC配置对象*/public static FleaJDBCConfig getConfig() {if (ObjectUtils.isEmpty(config)) {synchronized (FleaJDBCConfig.class) {if (ObjectUtils.isEmpty(config)) {config = new FleaJDBCConfig();}}}return config;}/*** <p> 使用之前先初始化 </p>** @param mDatabase 数据库管理系统名称* @param mName 数据库名 或 数据库用户*/public static void init(String mDatabase, String mName) {FleaFrameManager.getManager().setDBConfigKey(mDatabase, mName);}/*** <p> 建立数据库连接 </p>** @return 数据库连接对象* @since 1.0.0*/public Connection getConnection() {Connection conn = null;FleaDBUnit fleaDBUnit;String dbConfigKey = FleaFrameManager.getManager().getDBConfigKey();if (!fleaDBUnits.containsKey(dbConfigKey)) {synchronized (fleaDBUnits) {if (!fleaDBUnits.containsKey(dbConfigKey)) {fleaDBUnits.put(dbConfigKey, getFleaDBUnit(dbConfigKey));}}}fleaDBUnit = fleaDBUnits.get(dbConfigKey);try {// 请正确初始化数据库管理系统和数据库(或数据库用户)ObjectUtils.checkEmpty(fleaDBUnit, DaoException.class, "ERROR-DB-DAO0000000013");Class.forName(fleaDBUnit.getDriver());conn = DriverManager.getConnection(fleaDBUnit.getUrl(), fleaDBUnit.getUser(), fleaDBUnit.getPassword());} catch (Exception e) {LOGGER.error("获取数据库连接异常 :{}", e.getMessage());}return conn;}/*** <p> 读取指定配置键的数据库相关配置信息 </p>** @param dbConfigKey 数据库配置键* @return 数据库配置信息类对象*/private FleaDBUnit getFleaDBUnit(String dbConfigKey) {FleaDBUnit fDBUnit = null;if (StringUtils.isNotBlank(dbConfigKey)) {fDBUnit = new FleaDBUnit();String[] dbConfigKeyArr = StringUtils.split(dbConfigKey, CommonConstants.SymbolConstants.HYPHEN);if (ArrayUtils.isNotEmpty(dbConfigKeyArr) && CommonConstants.NumeralConstants.INT_TWO == dbConfigKeyArr.length) {fDBUnit.setDatabase(dbConfigKeyArr[0]);fDBUnit.setName(dbConfigKeyArr[1]);}fDBUnit.setDriver(FleaConfigManager.getConfigItemValue(dbConfigKey, DBConfigConstants.DB_CONFIG_DRIVER));fDBUnit.setUrl(FleaConfigManager.getConfigItemValue(dbConfigKey, DBConfigConstants.DB_CONFIG_URL));fDBUnit.setUser(FleaConfigManager.getConfigItemValue(dbConfigKey, DBConfigConstants.DB_CONFIG_USER));fDBUnit.setPassword(FleaConfigManager.getConfigItemValue(dbConfigKey, DBConfigConstants.DB_CONFIG_PASSWORD));}return fDBUnit;}/*** <p> 释放连接Connection </p>** @param conn 数据库连接对象*/private static void closeConnection(Connection conn) {try {if (ObjectUtils.isNotEmpty(conn)) {conn.close();}} catch (SQLException e) {}}/*** <p> 释放statement </p>** @param statement Statement对象*/private static void closeStatement(Statement statement) {try {if (ObjectUtils.isNotEmpty(statement)) {statement.close();}} catch (SQLException e) {}}/*** <p> 释放ResultSet结果集 </p>** @param rs 结果集对象*/private static void closeResultSet(ResultSet rs) {try {if (ObjectUtils.isNotEmpty(rs)) {rs.close();}} catch (SQLException e) {}}/*** <p> 释放资源 </p>** @param conn 数据库连接对象* @param statement 数据库状态对象* @param rs 数据库结果集对象*/public static void close(Connection conn, Statement statement, ResultSet rs) {closeResultSet(rs);closeStatement(statement);closeConnection(conn);}// 省略一些close方法
}
// 当前线程采用JDBC连的数据库前缀配置private static ThreadLocal<String> sDBLocal = new ThreadLocal<>(); /*** <p> 获取当前线程中使用JDBC连接的数据库配置键 </p>** @return 当前线程中使用JDBC连接的数据库配置键*/public String getDBConfigKey() {return sDBLocal.get();}/*** <p> 设置当前线程中使用JDBC连接的数据库配置键 </p>** @param dbSysName 数据库系统名* @param dbName 数据库名*/public void setDBConfigKey(String dbSysName, String dbName) {if (StringUtils.isNotBlank(dbSysName) && StringUtils.isNotBlank(dbName)) {sDBLocal.set(dbSysName.toLowerCase() + CommonConstants.SymbolConstants.HYPHEN + dbName.toLowerCase());}}
2.4 定义 Flea JDBC工具类 — FleaJDBCHelper
在使用 FleaJDBCHelper 之前,一定要先调用一下 init。
3. 接入自测 – StudentJDBCTest
3.1 JDBC新增数据
@Testpublic void testStudentInsert() throws Exception {// 初始化数据库配置,用于获取具体操作数据源FleaJDBCConfig.init(DBSystemEnum.MySQL.getName(), "fleajpatest");String sql = "insert into student(stu_name, stu_age, stu_sex, stu_state) values(?, ?, ?, ?)";List<Object> paramList = new ArrayList<Object>();paramList.add("huazie");paramList.add(25);paramList.add(1);paramList.add(1);int ret = FleaJDBCHelper.insert(sql, paramList);LOGGER.debug("RESULT = {}", ret);}
执行结果:
3.2 JDBC查询数据
这里的查询语句,可以是复杂SQL,返回结果 List<Map<String, Object>>
@Testpublic void testStudentQuery() throws Exception {FleaJDBCConfig.init(DBSystemEnum.MySQL.getName(), "fleajpatest");String sql = "select * from student where stu_state = ?";List<Object> paramList = new ArrayList<Object>();paramList.add(1);LOGGER.debug("RESULT LIST = {}", FleaJDBCHelper.query(sql, paramList));}
执行结果:
@Testpublic void testStudentSingleQuery() throws Exception {FleaJDBCConfig.init(DBSystemEnum.MySQL.getName(), "fleajpatest");String sql = "select count(*) from student where stu_state = ?";List<Object> paramList = new ArrayList<Object>();paramList.add(1);LOGGER.debug("COUNT = {}", FleaJDBCHelper.querySingle(sql, paramList));}
执行结果:
3.3 JDBC更新数据
@Testpublic void testStudentUpdate() throws Exception {FleaJDBCConfig.init(DBSystemEnum.MySQL.getName(), "fleajpatest");String sql = "update student set stu_state = ? where stu_name = ?";List<Object> paramList = new ArrayList<Object>();paramList.add(2);paramList.add("huazie");int ret = FleaJDBCHelper.update(sql, paramList);LOGGER.debug("RESULT = {}", ret);}
执行结果:
3.4 JDBC删除数据
@Testpublic void testStudentDelete() throws Exception {FleaJDBCConfig.init(DBSystemEnum.MySQL.getName(), "fleajpatest");String sql = "delete from student where stu_name = ? and stu_state = ? ";List<Object> paramList = new ArrayList<Object>();paramList.add("huazie");paramList.add(2);int ret = FleaJDBCHelper.delete(sql, paramList);LOGGER.debug("RESULT = {}", ret);}
执行结果:
flea-db使用之封装JDBC接入相关推荐
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- jdbc封装mysql_用Java手动封装JDBC连接池(一)
JDBC存在的问题 代码的冗余:在对数据库进行增删改查时,每个操作的JDBC流程和SQL执行代码的流程都一样,造成代码的冗余,所以我们可以把冗余的部分封装起来,封装之后,我们就不用再去写JDBC流程, ...
- JDBC、封装JDBC连接池、第三方连接池工具
主要内容: JDBC简介 JDBC来源 通过代码实现JDBC JDBC的改进需求 JDBC改进的代码实现 JDBC使用的设计模式 封装连接池 封装JDBC连接池 ThreadLoacl的使用 Thre ...
- 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive
第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive ...
- c mysql封装 jdbc_彻底封装JDBC操作MySQL的连接。
只需3步. 1.导入mysql的jar包. 略 2.封装配置文件db.properties driverClass = com.mysql.jdbc.Driver url = jdbc:mysql:/ ...
- android uri db,Android ContentProvider封装数据库和文件读写总结
本文是我各处东拼西凑加上自己实现一个ContentProvider的使用总结,留做后用,主要介绍ContentProvider的集成方法. 一.综述 ContentProvider是Android四大 ...
- 封装JDBC—非框架开发必备的封装类
一些小型的项目,有时不想使用框架如MyBatis,Hibernate等开发时,往往在数据持久化时操作比较繁琐,以下提供了对JDBC的封装类,简化JDBC操作. 为了更客观展示MyJDBC,我们通过一般 ...
- php mysql db封装类_封装自己的DB类(PHP)
classDB{//属性 private $host;private $port;private $user;private $pass;private $dbname;private $charse ...
- 封装JDBC事务操作,执行存储过程测试
Oracle数据库端测试环境见:http://www.cnblogs.com/yshyee/p/4392328.html package com.mw.utils;import java.sql.Co ...
- JDBC (Java DB Connection)---Java数据库连接
一:JDBC (Java DB Connection)-Java数据库连接 JDBC是一种可用于执行SQL语句的JAVA API(ApplicationProgramming Interface应用程 ...
最新文章
- 600页!分享珍藏很久的《推荐系统学习手册》(附链接)
- C语言 学生宿舍管理系统
- mysql 常见存储过程,MYSQL存储过程
- Distinct Subsequences
- SQL Server 2008概述(一)
- matlab cep,【CEP】重构和改进HelloInsightObservable
- 使用site-maven-plugin在github上搭建公有仓库
- 操作系统上机作业--根据莱布尼兹级数计算PI(2)(多线程)
- 打印机更换感光鼓单元k_干货,激光打印机常见故障维修方法总结
- HISTFILESIZE与HISTSIZE的区别
- IPsec ***基础:认识IPsec ***
- 《赢在测试2》-- 推荐的阅读书籍
- 浅谈line-height 1
- 虚幻4引擎垃圾回收原理
- vue给标签动态添加元素_vue中用v-html加载html元素及三种方法给v-html元素添加样式(详解)...
- C# GDI winfrom 图像转换椭圆形
- 怎样打开VOIP与SIP
- 修复花雨庭服务器,我的世界手机版怎么进花雨庭服务器 | 手游网游页游攻略大全...
- AWS免费套餐避坑攻略:查看账户下所有region的资源,及时关停不需要的服务
- 录屏储存失败因为5823_为什么屏幕录制失败因为5823
热门文章
- 字符串str.format()方法
- 海康摄像头4G内网连接方案
- 王艾辉:下方重点关注3140 上方3190 破位则追
- org.apache.kafka.clients.consumer.CommitFailedException
- 成为研究生后你都明白了什么?
- 彻底理解Linux的各种终端类型以及概念
- 科比投篮预测——数据处理与分析
- 百度搜索框搜索时显示或者隐藏历史搜索记录
- 【市场调查与预测】廊坊师范学院大学生洗发水使用情况调查(课程论文)
- 掌握算法本质背后的计算思维,尽在吴军博士《计算之魂》这本书中