J2EE的SQL语句自动构造方法
|
源代码网整理以下INSERT、DELETE、UPDATE 三种SQL语句是数据库技术的三大基本语句。 在通常的web开发中对它的处理可以说是无处不在. 如果简单的都用手工来构造这些SQL语句的话, 一方面给我们的开发带来很大的工作量, 另一方面系统灵活性受到很大的限制。那么能不能基于某种规则让系统自动从页面表单中取出元素构造出SQL语句呢? 首先让我们看看一般INSERT、DELETE、UPDATE 三种语句的基本形式: 源代码网整理以下DELETE FROM table_name WHERE col_n=value_n 源代码网整理以下UPDATE table_name SET col_1=value_1,col_2=value_2,col_3=value_3 WHERE col_x=value_x 软件开发网 www.mscto.com 源代码网整理以下 2. 对于表单中对应数据库字符串类型的元素,在SQL构造中需要做单引号的处理。这类元素我们暂且称他们为字符串型元素。字符串型元素我们规定其名为s_+数据库表字段名 (s=String)。 3. 对于不需要做但引号处理的元素(如integer型、float型、数据库系统函数--如now(),to_date()等等)。我们暂且简单的统称这类元素为整型元素。对于整型元素我们限制其命名规则为i_+数据库表字段名(i=Integer)。 基于上面的规格我们可以非常轻松写一个javabean。代码如下: /** * @version: 1.1 * @Time: 2005.03.02 */ package com.river.page ; import java.util.*; import javax.servlet.http.HttpServletRequest; public class PageUtil { private HttpServletRequest request = null ; public PageUtil(){} public void init(HttpServletRequest _request){ this.request = _request ; } public void clear(){ if(this.request != null){ this.request = null ; } } public String get(String elementName){ if(request == null || request.getParameter(elementName) == null){ return ""; }else{ return request.getParameter(elementName); } } 源代码网整理以下public String get(HttpServletRequest _request,String elementName){ 源代码网整理以下public String getSQL(HttpServletRequest _request){ end_name = arg_name.substring(2); if(pre_name.equalsIgnoreCase("i_")){ colstr = colstr+","+end_name; if(get(arg_name).equals("")){ valstr = valstr+",NULL"; }else{ valstr = valstr + "," + String.valueOf(get(arg_name)); } }else if(pre_name.equalsIgnoreCase("s_")){ colstr = colstr+","+end_name; if(get(arg_name).equals("")){ valstr = valstr+",NULL"; }else{ valstr = valstr+",’"+get(arg_name).replaceAll("’","’’")+"’"; } } } if(!colstr.equals("")){ colstr = colstr.substring(1); valstr = valstr.substring(1); } sqlstr = "INSERT INTO "+c_table+" ("+colstr+") VALUES ("+valstr+")"; return sqlstr; }else if(c_genre.equalsIgnoreCase("UPDATE")){ java.util.Enumeration arg_names = request.getParameterNames(); String colstr = ""; String arg_name,pre_name,end_name ; while(arg_names.hasMoreElements()){ arg_name = String.valueOf(arg_names.nextElement()).trim(); if(arg_name.length() < 2){ continue; } pre_name = arg_name.substring(0,2); end_name = arg_name.substring(2); if(pre_name.equalsIgnoreCase("i_")){ if(get(arg_name).equals("")){ colstr += ","+end_name+"=NULL"; }else{ colstr += ","+end_name+"="+get(arg_name); } }else if(pre_name.equalsIgnoreCase("s_")){ if(get(arg_name).equals("")){ colstr += ","+end_name+"="+get(arg_name); }else{ colstr += ","+end_name+"=’"+get(arg_name).replaceAll("’","’’")+"’"; } } } if(!colstr.equals("")){ colstr = colstr.substring(1); } sqlstr = "UPDATE "+c_table+" SET "+colstr; if(!c_where.equals("")){ sqlstr += " WHERE "+c_where; } return sqlstr; }else if(c_genre.equalsIgnoreCase("DELETE")){ sqlstr = "DELETE FROM "+c_table; if(c_where != null && !c_where.equals("")){ sqlstr += " WHERE "+c_where; } }else{ com.river.debug.Debug.show("unknow action type : "+c_genre); return null; } return sqlstr; } public String toString(){ return "version 1.0, date 2005.03.02, author river"; } } 源代码网整理以下 源代码网整理以下当然,这样做的缺点也是有的。那就是有一定的性能损耗。特别是碰到表单元素非常多时。但是对于那些不是很"苛刻"的项目这点损耗是值得的 源代码网推荐 源代码网供稿. |
