接上回:
:我们可以Extract Method(提炼函数)啊,只要把重复部分提炼出来就ok了.
:别把问题想的太简单,你看这两个函数,主要是在返回的地方不同,没办法直接提炼,我们应该使用模板方法模式.
:我们已经使用了模板方法模式了,现在要再次引入模板方法模式,不觉得太复杂了吗? :的确这样,看来我们给这个类赋予了过多职责.
:嗯,我们把查询的功能分离出去吧,只剩下构造SQL的职责就没问题了
public abstract class SimplePagingQueryJdbcTemplate{
public static final Pattern fromPattern = Pattern.compile("from",Pattern.CASE_INSENSITIVE);
public static final String countSQLHead = "select count(*) from ";
public static final Pattern orderByPattern = Pattern.compile("order(\\s)+by",Pattern.CASE_INSENSITIVE);
public static final Pattern selectPattern = Pattern.compile("select",Pattern.CASE_INSENSITIVE);
public void prepareQuery(SimpleQuery query,Pager pager) {
query.setQuerySQL(createPagingQuerySQL(query.getQuerySQL(), pager.getFirstResult(), pager.getPageSize()));
}
public void prepareCount(SimpleQuery query) {
query.setCountSQL(createCountSQL(query.getQuerySQL()));
}
private String createCountSQL(String querySQL){
String[] SQLParts = fromPattern.split(querySQL, 2);
if(SQLParts.length!=2){
throw new IllegalArgumentException("The SQL query maybe miss the word \"from\".");
}
String countSQLbody = cutLastOrderBy(SQLParts[1])[0];
return countSQLHead+countSQLbody;
}
protected String[] cutLastOrderBy(String sql){
Matcher matcher = orderByPattern.matcher(sql);
if(!matcher.find()){
return new String[]{sql,null};
}
int orderByIndex = matcher.start();
while(matcher.find()){
orderByIndex = matcher.start();
}
return new String[] {sql.substring(0,orderByIndex),sql.substring(orderByIndex)};
}
protected abstract String createPagingQuerySQL(String querySQL, long firstResult, int maxResult);
}
:现在清爽多了,连原来的重复代码都消除了
分享到:
相关推荐
因此,解决这个问题的一个有效方法是使用动态规划算法。具体来说,可以定义一个数组dp[i]来记录当圆周上有i个点时的方案数,然后基于这些点构建新的方案,并更新dp数组。 #### 题二 画海岛地图(island.pas) **问题...
第一个是源数据库与目标数据框架的要素分类代码及图层的对照关系表,用于数据的分层重构。第二个是源数据图层与目标数据图层属性项的名称与内容的映射关系表,用于对要素属性的继承保留。通过这样的数据重构,可以...
例如,第1题和第2题中的几何体是直三棱柱,第3题考察的是正方体的对称性。 2. **表面积计算**:表面积是几何体所有表面面积的总和。例如,第1题和第2题中计算的是直三棱柱的表面积,包括底面面积和侧面面积。对于直...
7. **旋转体的体积** - 第七题考察的是几何体的体积计算,正方形绕对角线旋转一周会形成两个圆锥,利用圆锥的体积公式可以解决此问题。 8. **平面几何与立体几何** - 第八题包含了平面与平面的位置关系,以及直线与...
3. 函数的性质:第三题涉及到函数的性质,特别是单调性和满足特定关系的函数。题目要求寻找一个单调递增且满足f(x+y) = f(x) * f(y)的函数。通过对各个选项的分析,我们可以确定满足条件的函数。 4. 对数函数的单调...
- 并发操作通常会带来三个问题:丢失更新、读脏数据以及不可重复读。 6. **第二范式** - 如果关系模式R是1NF,且每个属性都不传递依赖于R的候选键,则称R是第二范式的模式。 7. **实体完整性** - 关系模型的...
- **本题解答**: R有3个属性,S有4个属性,它们的笛卡尔积T就是R与S的所有属性的组合,共有3+4=7个属性,因此答案是C。 **6. 数据库设计阶段** - **知识点**: - **数据库设计**: 数据库设计过程可以分为几个阶段...
- **document.querySelector(selector)**: 返回第一个匹配CSS选择器的元素。 - **document.querySelectorAll(selector)**: 返回所有匹配CSS选择器的元素集合。 这些方法提供了强大的能力来访问和操作DOM树中的元素...
利用这个性质可以求出弦MN所在直线的方程。 6. 三棱锥的体积与球的表面积:三棱锥O-ABC的体积最大时,底面ABC应该与球的底面重合。由此求出三棱锥体积的最大值,可以反推出球的半径,进而计算球的表面积。 7. 直线...
基础汇率**: 一个国家的基本货币兑换率。 - **B. 套算汇率**: 通过基础汇率计算得出的其他货币之间的兑换比率。 - **C. 固定汇率**: 货币价值相对于另一货币保持不变或在一定范围内波动。 - **D. 浮动汇率**: ...
1. **三视图的理解与应用**:三视图是表现物体三个方向(正面、侧面、顶部)的投影,对于立体几何问题,理解三视图可以帮助我们重构几何体的形状,例如题目中的第1题和第2题。 2. **平面图形与斜二测直观图的关系**...
- 编写第一个Python程序:学习如何编写并运行简单的Python脚本。 - Python社区资源:利用社区资源如邮件列表、论坛等获取帮助和支持。 - **扩展阅读**:《Python编程:从入门到实践》、《Python Crash Course》等...
21. 第一代计算机应用:第一代计算机主要用于科学计算和军事用途,而非数据处理。 22. 窗体事件触发:在Windows Forms中,加载窗体时首先触发的事件是Load事件(A选项)。 23. System类的包位置:System类位于java...
第3题中,平面平行性质的判断和应用,如A选项,三角形两边平行于一个平面,第三边也平行于这个平面,这是平面平行线的传递性。B选项展示了平面平行时,一面中的直线和平面内的点可以唯一确定与之平行的直线。D选项中...
开始阶段是心理辅导的第一步。这一阶段需要完成的任务中不包括()** - **解析**:心理辅导的开始阶段通常包括建立信任关系、了解来访者的基本情况等任务。“制定辅导目标”是在后续阶段完成的,因此不在开始阶段的...
在城市化的大潮中,如何保护和传承乡村文化,使之既不失其传统特色又能适应现代社会,是一个值得深思的问题。 学者们提出了多种应对策略来解决乡村文化危机。通过农业现代化、提高农民的文化自觉、以及加大乡村文化...
综上所述,文学经典的重构是一个融合传统与创新的过程,它要求我们在尊重传统的基础上,结合当代价值观念,对经典作品进行重新阐释。通过这一过程,我们不仅能够传承文化,也能够推动文学的发展,使之更好地服务于...
* 方法断点:对某个方法或函数设置断点,在程序运行到该方法的第一行时自动暂停。 * 事件断点:在程序运行过程中发生特定事件时(如异常触发、线程启动、线程退出等)将程序暂停。 * 调试视图:显示当前调试的程序的...
在2019版高考数学一轮复习中,第八章立体几何的第一讲就专注于这一主题,将理论与实际操作相结合,帮助学生在实际应用中更好地理解和掌握这一知识点。 在这一讲的内容中,教师首先要确保学生理解三视图的概念。三...