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 ...
随机推荐
- linux系统搜索文件中关键字的位置
grep -Irn “ubuntu”-------即查出文件的目录路径
- SVN常用命令说明
本文转载至 http://www.blogjava.net/jasmine214--love/archive/2011/01/12/342839.html :1.5 及更新版本 名词说明: WC:W ...
- shell中uniq与sort -u 两种去重的对别
sort -u 和 uniq都能起到删除重复信息的功能,那么他们的区别究竟在哪呢?$ cat test jasonjasonjasonfffffjason 下面分别执行三个命 ...
- 【Zookeeper系列】Zookeeper命令操作(转)
原文链接:https://www.cnblogs.com/sunddenly/p/4031881.html 一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他 ...
- poj1279
板子题,求多边形内核面积. 话说jls的板子返回的是边,然后我就在冥思苦想怎么根据割边求面积啊.. 然后发现自己果然是个傻逼,求一下交点存起来就好了... //板子题到此为止了 #include &l ...
- Java课程课后作业02之动手动脑
一.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数 数学算法原理: 可以使用的方法:Math中的random类以及random类,区别:Math中的random类只能用于生成随机数 ...
- 11 vs2015 连接oracle 11g 数据库及相关问题
1.下载Oracle Developer Tools for Visual Studio 2015 ,网址如下. http://www.oracle.com/technetwork/topics/do ...
- juqery 点击张三触发李四的方法 trigger(); 和 被选元素前插入指定的内容的方法 brfore();
$('.zc_fabu_img_1').on('click',function(){ $("#upImg img").trigger("click"); }) ...
- vue2.0 源码解读(一)
又看完一遍中文社区的教程接下来开始做vue2.0的源码解读了! 注:解读源码时一定要配合vue2.0的生命周期和API文档一起看 vue2.0的生命周期分为4主要个过程 create. 创建---实例 ...
- 关于maven的CoreException: Could not get the value for parameter compilerId for plugin 。。的错误
在Eclipse中使用 Alt+F5 快捷键,在弹出的Update Maven Project对话框中选择报错的Maven工程,勾选下图中的 Force Update of Snapshots/Rel ...