在Web开发中,多种条件的综合查询非常常见,应对这种业务需求我们通常使用下面几种方法来实现:
PS:
i.(Hibernate的条件查询Criteria Queries当然是非常方便的,本文仅探讨JDBC方式的使用)
ii.(欢迎高手、大拿们拍砖,请勿人身攻击)
1.直接将参数值拼接到SQL语句中,然后进行查询。
这种方式的安全性应当说是比较差的,一不小心就被SQL注入了。虽然可以先过滤参数值中的特殊字符,但总感觉不是很优雅。
2.先使用占位符'?'来拼接SQL,然后再通过条件判断去填充PreparedStatement。
用过这种方式的TX,都知道这种方式的复杂性。先要在拼SQL时判断一次,然后还要在填充pst时再判断一次,麻烦。
3.存储过程
本人一直不爽存储过程,以前有一个项目从MySQL迁移到MSSQL,后来又换成ORACLE,最后产品的不同版本运行在不同数据库上,当时差点要了亲命了。
其实讲这么多无非就是想要一种相对优雅简单的查询方式,前一段看到.NET中的SQLHelper受到一些启发,然后就写了这么一个类似的组件(其实我Google了半个小时都没有找到符合要求的)。
基本思想:
1.在控制器中(Servlet/Action etc...)中将查询表单中的参数值添加到查询条件列表中
2.在DAO(你明白的)中设置基本SQL
3.迭代查询条件列表,使用占位符拼接SQL
4.在DAO中拿SQL创建PreparedStatement
5.迭代查询条件列表,为pst填充值
6.接下来,没有特殊的地方了,就是正常的executeQuery,while(rs.next()){...}
将第1/2/3/5步骤的功能提取出来做成一个工具类,然后其它地方就可以随意使用了,嘿嘿
好了,不啰嗦了直接上代码吧
Parameter.java
/**
* 查询参数类,用于表示条件参数对象
* @author Lixor(at)live.cn
*
*/
public class Parameter{
private String field;
private Object value;
private String operator;
/**
*
* @param field 数据库字段名
* @param operator 数据库操作符 =、>=、<、like etc...
* @param value 参数值 Object
*/
public Parameter(String field,String operator, Object value) {
super();
this.field = field;
this.value = value;
this.operator = operator;
}
public String getField() {
return field;
}
public Object getValue() {
return value;
}
public String getOperator() {
return operator;
}
}
DynamicQuery.java
/**
* 动态查询工具类,用于拼接SQL、填充pst
* @author Lixor(at)live.cn
*
*/
public class DynamicQuery {
private static Logger logger=Logger.getLogger(DynamicQuery.class);
private String templet = " AND %s %s ?";
private String baseSql;
private ArrayList<Parameter> parameters = new ArrayList<Parameter>();
public DynamicQuery() {
}
/**
* 要求baseSql带有where条件
*
* @param baseSql
*/
public void setBaseSql(String baseSql) {
this.baseSql = baseSql;
}
public void addParameter(Parameter parameter) {
parameters.add(parameter);
}
public String generateSql() {
StringBuffer buffer = new StringBuffer(baseSql);
for (Parameter p : parameters) {
buffer.append(String.format(templet, p.getField(), p.getOperator()));
}
logger.debug(buffer);
return buffer.toString();
}
public void fillPreparedStatement(PreparedStatement pst) throws SQLException {
int count = 1;
for (Parameter p : parameters) {
pst.setObject(count, p.getValue());
count++;
}
}
}
示例:查询产品信息
QueryServlet.java
DynamicQuery query=new DynamicQuery();
query.addParameter(new Parameter("p.name" ,"like","电视"));
query.addParameter(new Parameter("p.type_id","=" ,1));
query.addParameter(new Parameter("p.productDate" ,">=",java.sql.Date.valueOf("2010-09-04")));
query.addParameter(new Parameter("p.price" ,">=",1000.0f));
ProductDao dao=new ProductDao();
List<Product> productList=dao.query(query);
request.setAttribute("productList",productList);
ProductDao.java
public List<Product> query(DynamicQuery query) {
List<Product> productList = new ArrayList<Product>();
try {
String sql = "SELECT p.id,p.name,p.price,p.productDate,p.image,p.type_id,t.name,p.description FROM tbl_product p,tbl_type t WHERE p.type_id=t.id";
query.setBaseSql(sql);
sql = query.generateSql();//如果想排序,自行在sql后添加
Connection conn = null;
try {
conn = DbUtil.getConnection();
PreparedStatement pst= conn.prepareStatement(sql);
query.fillPreparedStatement(pst);//填充pst
ResultSet rs = pst.executeQuery();
while (rs.next()) {
Product product = new Product();
……
productList.add(product);
}
rs.close();
pst.close();
} finally {
if (conn != null) {
conn.close();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return productList;
}
感谢“jl580650”提出的pst.setObject建议,我之前是用反射做的。
分享到:
相关推荐
基于JDBC的DAO实现虽然提供了很多便利,但也存在一些局限,如手动处理SQL可能会导致代码难以维护,且无法充分利用ORM框架(如Hibernate、MyBatis)提供的高级特性。随着技术的发展,很多现代应用倾向于使用ORM框架...
【基于JDBC的简易网上购物系统】是一种利用Java的数据库连接技术(JDBC)和Servlet进行构建的简单电子商务平台,适合初级开发者学习实践。在这个系统中,JDBC扮演了数据库操作的重要角色,而Servlet则负责处理HTTP...
**基于JDBC的成绩管理系统** 一个基于JDBC(Java Database Connectivity)的成绩管理系统是使用Java编程语言设计的,主要用于处理与数据库相关的任务,特别是针对学生成绩的数据管理。在这个系统中,JDBC作为桥梁,...
【初学者第一个小项目基于JDBC+Oracle实现图书管理系统】是一个经典的编程实践,它涵盖了数据库操作、面向对象设计以及简单的用户交互。在这个项目中,我们将深入理解如何利用Java的JDBC(Java Database ...
1、项目简介本项目是一套基于Servlet+JDBC+jsp实现员工信息管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。...
本项目"基于jdbcDriver的MySQL分库分表实现-OShard.zip"提供了使用Java JDBC驱动来实现MySQL数据库分库分表的示例。下面将详细阐述相关知识点。 1. **MySQL数据库**:MySQL是一款开源、免费的关系型数据库管理系统...
在这个项目中,我们使用JDBC(Java Database Connectivity)来实现一个基本的CRM系统,涵盖了CRUD(Create、Read、Update、Delete)操作,同时运用了时间控件、字符截取和分页等技术,以提供更加高效和用户友好的...
讨论了Java语言通过JDBC(JavaDataBaseConnectivity)访问Web数据库的实现思想及访问模式,论述了JDBC的原理及实现过程,给出了一个基于JDBC的Web数据库开发的实验模型.
网络留言本V1.0是一款基于JDBC技术实现的在线互动平台,它允许用户在网页上发表留言、交流观点,为互联网用户提供了一个简单易用的沟通渠道。本文将深入探讨其背后的JDBC技术及其在实际开发中的应用。 JDBC(Java ...
总结来说,基于JDBC+Mysql开发的会议管理系统利用了Java的强大编程能力和Mysql的高效数据库功能,实现了对会议的全面管理。通过这个系统,用户可以方便地组织和参与会议,提高了工作效率,也降低了管理成本。对于...
Java JDBC学生数据管理系统是一个利用Java编程语言和JDBC(Java Database Connectivity)技术设计的应用,用于高效管理和操作学生数据。这个系统提供了用户友好的界面,使得用户可以方便地执行SQL(Structured Query...
"基于Java数据类的动态查询系统" 本文介绍了一种基于Java数据类的动态查询系统,该系统可以满足用户灵活多变的查询需求。该系统由三个功能模块组成:查询定义模块、动态查询模块和固定查询模块。查询定义模块主要...
基于JDBC的SQL Server数据库访问技术,主要涉及以下几个方面: 1. JDBC连接数据库原理 JDBC连接数据库首先需要建立一个JDBC-ODBC桥接器。ODBC(Open Database Connectivity)是一种微软公司开发的数据库连接技术,...
SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。 平时不太...
2. **SQL条件查询**:条件查询通常是基于WHERE子句的,例如`SELECT * FROM 表名 WHERE 条件`。这里的条件可以是字段的等值比较、范围查询、逻辑运算等。在SQL Server中,还可以利用T-SQL的特有功能,如TOP、LIKE、IN...
【标题】"基于jdbc+servlet+filter的网上投票系统.zip" 涉及到的核心技术是Java Web开发中的三大重要组件:JDBC(Java Database Connectivity)、Servlet和Filter。这是一个典型的Web应用程序,用于实现在线投票的...
"Struts2+jdbc+Eclipse成绩查询系统"是一个基于Java技术栈开发的Web应用程序,主要用于学生成绩的管理和查询。这个项目结合了Struts2框架、JDBC(Java Database Connectivity)数据库连接技术和Eclipse集成开发环境...
Java Swing+JDBC+MySQL实现的毕业设计选题管理系统是一个基于桌面应用的软件项目,它利用Java的Swing库构建用户界面,通过JDBC(Java Database Connectivity)与MySQL数据库进行数据交互,实现了对毕业设计选题的...
电话本管理系统jdbc是一个基于Java编程语言的数据库管理应用程序,它实现了对电话簿数据的基本操作,如添加、删除、修改和查询。在这个系统中,DAO(Data Access Object)模式被用作与数据库交互的核心机制,提供了...
而我们今天要讨论的是一款基于SpringJdbc和FreeMarker实现的轻量级框架,它旨在提供与Mybatis类似的功能。 SpringJdbc是Spring框架的一部分,它为Java开发者提供了对JDBC的抽象层,消除了大量的样板代码和手动管理...