Java连接数据库 #05# SQL与代码分离
在Java连接数据库 #04#里大概是这样放sql语句的:
package org.sample.shop.db.queryrunner; import org.sample.shop.db.queryrunner.statementfactory.StatementFactory; // TODO sql一长可读性变得非常非常差
public interface Statements { String ITEM_SAVE_ITEM = "INSERT INTO item(user_id, name, price, status, quantity) VALUES (?, ?, ?, ?, ?)";
String ITEM_REMOVE_BY_ID = "DELETE FROM item WHERE id=?";
String ITEM_UPDATE_BY_ID = "UPDATE item SET name=?, price=?, status=?, quantity=? WHERE id=?";
String ITEM_GET_BY_ID = "SELECT id, user_id AS userId, name, price, status, quantity FROM item WHERE id=?";
// order
String ORDER_GET_BY_UID = "SELECT id, user_id AS userId, total FROM simple_order WHERE user_id=?";
String ORDER_SAVE_ORDER = "INSERT INTO simple_order(user_id, total) VALUES(?, ?)";
String ORDER_SAVE_ORDER_DETAIL = "INSERT INTO order_detail(order_id, item_id, user_id, quantity, price, status) VALUES(?, ?, ?, ?, ?, ?)";
// order detail
String ORDER_DETAIL_GET_BY_ORDER_ID = "SELECT id, order_id AS orderId, item_id AS itemId, user_id AS userId, quantity, price, status FROM order_detail WHERE order_id=?";
}
在简单的程序里这样写还是挺方便的,然而单条sql语句一旦变长可读性就会变得非常非常差。改起来也相当不方便。
我首先想到的解决办法是:像mybatis一样把sql放到单独一个XML文件里。于是,我简单写了个草稿程序添加DOM4J依赖开始尝试。结果当我把sql字符串放到xml标签里却被提示格式不对,解析起来也报错。。。。。。
然后仔细看看,mybatis能正常解析xml依靠的是这个↓

我只是想把sql单独放到文件里,并且我希望:
- 方便阅读和修改sql语句
- 方便Java解析文件并读取sql语句
为了节约学习成本,我脑洞一开。。。。就投机取巧地用html + jsoup做这件事了。
读取html中的SQL语句
sql.html:
<sql id="ITEM_LIST_BY_UID_AND_STATUS">
SELECT *
FROM (
SELECT rownum AS r, id, user_id AS userId, name, price, status, quantity
FROM item
WHERE user_id=? AND status=?
)temp
WHERE r >= ? AND r < ?
</sql>
<sql id="ITEM_SAVE_ITEM">
INSERT INTO item(user_id, name, price, status, quantity)
VALUES (?, ?, ?, ?, ?)
</sql>
<sql id="ITEM_REMOVE_BY_ID">
DELETE FROM item
WHERE id=?
</sql>
<sql id="ITEM_UPDATE_BY_ID">
UPDATE item
SET name=?, price=?, status=?, quantity=?
WHERE id=?
</sql>
<sql id="ITEM_GET_BY_ID">
SELECT id, user_id AS userId, name, price, status, quantity
FROM item
WHERE id=?
</sql>
/
StatementFactory.java:
package org.sample.shop.db.queryrunner.statementfactory; import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element; import java.io.File;
import java.io.IOException; public class StatementFactory {
private static final String PATHNAME = StatementFactory.class.getResource("/sql.html").getPath();
private static final String CHAR_SET = "UTF-8"; private static Document doc; static {
File input = new File(PATHNAME);
try {
doc = Jsoup.parse(input, CHAR_SET, "");
} catch (IOException e) {
e.printStackTrace();
}
} public static String getStatement(String statementId) {
Element sql = doc.select(statementId).first();
return sql.text();
}
}
/
Statements.java(原来的Sql.java):
package org.sample.shop.db.queryrunner;
import org.sample.shop.db.queryrunner.statementfactory.StatementFactory;
public interface Statements {
// item
String ITEM_LIST_BY_UID_AND_STATUS = StatementFactory.getStatement("#ITEM_LIST_BY_UID_AND_STATUS");
String ITEM_SAVE_ITEM = StatementFactory.getStatement("#ITEM_SAVE_ITEM");
String ITEM_REMOVE_BY_ID = StatementFactory.getStatement("#ITEM_REMOVE_BY_ID");
String ITEM_UPDATE_BY_ID = StatementFactory.getStatement("#ITEM_UPDATE_BY_ID");
String ITEM_GET_BY_ID = StatementFactory.getStatement("#ITEM_GET_BY_ID");;
}
PS. interface中常量和类中静态域性质是一样的!!
缺陷总结
这样做虽然解决了一些问题,但是改进空间还是相当大的。。。
例如说实际写的时候需要来回在4个文件跳转:

以及Statements.java和StatementFactory.java职能其实是重合的。。只是暂时没去把它们写到一起。
就。。有时间再搞吧。。。。。。。。。。。。。。。。
Java连接数据库 #05# SQL与代码分离的更多相关文章
- Java连接数据库 #06# SQL与代码分离(精化版本)
索引 DAO层依赖关系草图 应用示例 接Java连接数据库#05#,对代码进行改进. DAO层依赖关系草图 应用示例(只需3步!) 1.首先定义接口类: package org.sample.shop ...
- 代码生成java连接数据库的所需代码(超详细)
开始学习: round 1:(一开始学习当然还是要一步一步学习的啦,哪有什么一步登天!!!) a.准备工作:1.eclipse,mysql(这两个软件肯定要的啦,不然学什么把它们连接起来) 2.加载驱 ...
- Java连接数据库 #04# Apache Commons DbUtils
索引 通过一个简单的调用看整体结构 Examples 修改JAVA连接数据库#03#中的代码 DbUtils并非是什么ORM框架,只是对原始的JDBC进行了一些封装,以便我们少写一些重复代码.就“用” ...
- JAVA连接数据库 #03# HikariCP
索引 为什么用数据库连接池? HikariCP快速入门 依赖 简单的草稿程序 设置连接池参数(只列举常用的) MySQL配置 修改Java连接数据库#02#中的代码 测试 为什么用数据库连接池? 为什 ...
- 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试
JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不 ...
- C#和Java中执行SQL文件脚本的代码(非常有用)
原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...
- java 连接mysql 和sql server2008代码
这两天用java分别连接mysql和sql server2008代码.刚開始都是有错.如今找到了在 自己机器上成功连接的代码: 1. mysql Class.forName("com.mys ...
- Java&Selenium自动化测试实现页面元素、页面对象及测试代码分离
一.摘要 本篇博文将介绍自动化测试实现页面元素.页面对象及测试代码分离在自动化框架中的实现 二.解析页面元素定位信息 首先,将页面元素与实际的代码分离,首先我们将页面元素定位信息和定位表达式保存在属性 ...
- Java连接数据库 #02# JDBC经典套路
内容索引 LocalConnectionFactory.java LocalConnectionProxy.java ProfileDAO.java-2.0 ProfileDAOImpl.java-2 ...
随机推荐
- 【Static Program Analysis - Chapter 2】 代码的表征之控制流图
(a) an if-then-else (b) a while loop (c) a natural loop with two exits, e.g. while with an if...br ...
- An error occurred. Sorry, the page you are looking for is currently unavailable. Please try again later.
刚装完 PHP.Nginx,准备跑下 phpMyAdmin 程序,结果报以下错误: An error occurred. Sorry, the page you are looking for is ...
- jQuery AJAX方法 前台往后台传数据
https://blog.csdn.net/dreamstar613/article/details/61912717 http://www.cnblogs.com/zhuxiaojie/p/4783 ...
- 算法提高 金属采集_树形dp
算法提高 金属采集 时间限制:1.0s 内存限制:256.0MB 问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连 ...
- Realm 简介
是一个跨平台的本地数据库,比sqlite 数据库更轻量级,执行效率更高. 官网地址:https://realm.io/docs/java/latest/
- eclipse主题之-------DevStyle
最佳因为经常熬夜 eclipse自带的背景 白色 太伤眼了 换了其他颜色但是 总感觉 差点什么 所以就去eclipse自带的插件下载中心 下载了 DevStyle 其实 有很多的 主题插件的 ...
- windows环境下Oracle数据库冷备份和恢复
1.点击开始菜单的“运行”,输入sqlplus/nolog 2.在弹出的命令行窗口以sysdba身份登陆,要输入:系统用户名/登陆密码@数据库实例名,如sys/testora@orcl 3.输入 al ...
- centos7 与 archlinux用户 安装 python3模块 pytaglib
对于 centos7用户: yum group install "Development Tools" yum install taglib-devel yum install p ...
- CString比较不区分大小写
第一种:都变为大写 或者都变成小写. str1.MakeUpper();str2.MakeUpper();or:str1.MakeLower();str2.MakeLower(); if(str1== ...
- SpringMVC访问静态资源的三种方式
如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...