`

ECSide核心模块介绍之:EasyDataAccess,数据存取模块.

阅读更多
ECSide 里加入了 easyList特性。可以通过在xml里配制sql语句来快速的展现列表。

最近我将该功能模块进行了重构,使其可以脱离ecside来使用,从而可以用来简化其他的数据库操作。

具体用法结合下面的例子来讲解:

示例 :
对 USER_INFO 表进行查询。 查询条件为 USERNAME GENDER。

第1步:定义spring文件:
    <bean id="testQuery1" class="org.ecside.easyda.DataAccessModel">
    <!-- 注入一个标准的数据源 -->
	<property name="dataSource" ref="test_datasource" />
        <property name="sqls">
            <map>
	     <!-- 这个key的名字随便取 -->
                <entry key="queryInfoByNameGender" >
			<value>
				select * from user_info 
				where 1=1 
				#{IF:USERNAME!=EMPTY} and username like #{USERNAME} #{/IF}
				#{IF:GENDER!=EMPTY} and gender=#{GENDER} #{/IF}
			</value>
		</entry>

            </map>
        </property>
    </bean>

第2步,在适当的位置(如BO中)执行下列java代码

// 这里也可以使用 Ioc 注入。
DataAccessModel dam=(DataAccessModel)factory.getBean("testQuery1");
//parameterMap为传入参数,key为USERNAME GENDER。
List list=(List)dam.executeQuery("queryInfoByNameGender", parameterMap);

ok,执行完了,执行的每条结果会放入MAP,所有的MAP最后放入LIST
Map的Key是SQL语句执行结果的各个列的名字。

其中 #{USERNAME} #{GENDER} 为参数在传入的参数Map中的key.

其中 #{IF..} 字句用来拼装SQL.。
其语义为 如果满足条件 就把IF内的字符串拼接到有效的SQL语句中。
支持简单的条件:
A<B :   #{IF:A#{_L}B}....{/IF}
A>B :   #{IF:A#{_G}B}....{/IF}
A=B :   #{IF:A=B}....{/IF}
A!=B :   #{IF:A!=B}....{/IF}
A<=B :   #{IF:A#{_L}=B}....{/IF}
A>=B :   #{IF:A#{_G}=B}....{/IF}

A为参数(的KEY), B为数值,可以是EMPTY NULL 字符串 数字 等如
#{IF:USERNAME!='admin'}....{/IF}
#{IF:AGE #{_L}= 18}....{/IF}

注意 < >于号出现在 sql语句中时也请使用 #{_L} #{_G}
#{IF:A=B}....{/IF} 内部 可以是任何语句,也可以使用任何参数。不一定非要是A.
例如 这样也是可以的
#{IF:USERROLE='1'}  and (GENDER = ${XXXX} or AGE ${_L} 25 {/IF}

传入参数可以使用组件中提供的getParameterMap方法从request中自动生成,相应的代码很简单:
	public static Map getParameterMap(HttpServletRequest request) {
		Map parameterMap = new HashMap();
		Enumeration names = request.getParameterNames();
		while (names.hasMoreElements()) {
			String name = (String) names.nextElement();
			String[] s = request.getParameterValues(name);
			if (s != null) {
				if (s.length == 1) {
					parameterMap.put(name, request.getParameterValues(name)[0]);
				} else {
					parameterMap.put(name, request.getParameterValues(name));
				}
			}
		}
		return parameterMap;
	}


如果查询叶面的input区域是
姓名:<input type="text" name="i_user_name">
性别:<input type="text" name="i_user_gender">
通过 getParameterMap 取得参数map后,如果想直接调用sql

那么sql需要改动为
<entry key="queryInfoByNameGender" >
	<value>
		select * from user_info 
		where 1=1 
		#{IF:i_user_name!=EMPTY} and username like #{i_user_name} #{/IF}
		#{IF:i_user_gender!=EMPTY} and gender=#{i_user_gender} #{/IF}
	</value>
</entry>



一个DataAccessModel bean里可以写入多个sql.
可以是 delete update insert select  {call...
例如下面这个
    <bean id="myEasyDA" class="demo.MyDataAccessModel">
		<property name="dataSource" ref="test_datasource" />
        <property name="sqls">
            <map>
	      <entry key="baseInfo1" >
			<value>
				{call CM_CUST_REAL_INFO_P(
					#{I_SERVICE_KIND},
					#{I_SERVICE_NO},
					#{I_CITY_CODE},
					#{I_SERVICE_ID},
					#{I_CUSTOMER_ID},

					#{OUT:OUT_F_CUST_NAME},
					#{OUT:OUT_F_GENDER},
					#{OUT:OUT_F_DUTY},
					#{OUT:OUT_F_PRODUCT_NAME},
					#{OUT:OUT_F_POINT_VALUE},
					#{OUT:OUT_F_STATUS},
					#{OUT:ON_FLAG},
					#{OUT:OS_PROMPT}
				)}
			</value>
		</entry>
                <entry key="updateUser" >
					<value>
						update user_info set 
						passwd=#{PASSWD} , 
						userrole=#{USERROLE} ,
						email=#{EMAIL}, 
						gender=#{GENDER} 
						WHERE userid=#{USERID}
					</value>
				</entry>
                <entry key="deleteUser" >
					<value>
						delete from user_info 
						WHERE userid=#{USERID}
					</value>
				</entry>
                <entry key="getUserMemo" >
					<value>
						select MEMO,EMAIL
						from user_info WHERE userid=#{USERID}
					</value>
				</entry>
            </map>
        </property>
    </bean>
   

其中 #{OUT:...} 用来标识 存储过程的输出参数。
其中的 demo.MyDataAccessModel 继承自 org.ecside.easyda.DataAccessModel
你可以在这个类里覆盖父类的registerInterceptors方法,为每个sql添加前后拦截器。
代码如下:
public class MyDataAccessModel extends DataAccessModel {

	public void registerInterceptors(){
		addInterceptor(new DataAccessInterceptor("updateUser"){

			public void before(Map parameterMap, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				
			}

			public void after(Map parameterMap, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				request.setAttribute(ECSideConstants.C_UPDATE_RESULT_MESSAGE,request.getParameter("USERNAME"));
				ServletUtil.writeDefaultTextToClient(parameterMap, request, response);
			}
			
		});
		
		
		addInterceptor(new DataAccessInterceptor("deleteUser"){

			public void before(Map parameterMap, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				
			}

			public void after(Map parameterMap, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				request.setAttribute(ECSideConstants.C_UPDATE_RESULT_MESSAGE,request.getParameter("USERNAME"));
				ServletUtil.writeDefaultTextToClient(parameterMap, request, response);
			}
			
		});
	}
}



已知不足:
在事务控制方面做的工作几乎为0。
#{IF}功能不够强大,不支持复杂的逻辑判断。
所以目前不适合用在复杂的场合。
另:整个过程输入 输出的sql类型 全是string,所以如果要做类型方面的转换,需要自己在sql语句级别进行。


这篇文章没有提供代码,打算下和 ecside 1.1 final一起推出。

希望大家可以针对这个模块提出些建议和意见 谢谢大家了。
分享到:
评论
2 楼 fins 2007-02-06  
是 1=1 但不知道为什么 贴上来就变成  11=1 了
1 楼 afacd 2007-02-06  
where 11=1
为什麽一个1是红色、一个1是蓝色?

相关推荐

    一种智能快递存取系统设计.pdf

    该系统的设计考虑了智能快递存取系统的适应性和扩展性,采用模块化设计的方法,进行智能快递存取系统的结构设计。 智能快递存取系统的主要功能包括: 1. 自动存储:智能快递存取系统可以自动存储快递包裹,不需要...

    基于OPC UA的历史数据存取.pdf

    3. 内存数据操作:数据被送入内存中的归档数据队列,并进行缓冲处理,以减少对磁盘操作的次数和提高数据存取效率。 4. 磁盘归档:缓冲在内存中的数据最终被归档到磁盘文件中,完成数据存储过程。 ### OPC UA规范中...

    ORACLE数据字典与视图[参照].pdf

    ORACLE 数据字典与视图 ORACLE 数据字典是 ORACLE 数据库系统启动后总是可用的,它驻留在 SYSTEM 表空间中。数据字典包含视图集,在许多情况下,每一视图集有三种视图包含有类似信息,彼此以前缀相区别,前缀为 ...

    第7章-数据存取:文件.ipynb

    第7章-数据存取:文件.ipynb

    数据库模块_数据库模块.rar

    数据库模块是软件系统中至关重要的组成部分,它负责管理和存储数据,使得应用程序能够高效、安全地进行数据的存取。在本讨论中,我们将深入探讨数据库模块的核心概念、设计原则以及常见的实现技术。 首先,数据库...

    易语言一千个模块

    4. **数据库访问模块**:与各类数据库系统(如MySQL、SQLite等)交互,方便数据存取和管理。 5. **图形用户界面模块**:创建窗口、按钮、列表框等各种控件,提升用户交互体验。 6. **多媒体模块**:处理音频、视频、...

    图书管理系统部分图分享.pdf

    12. **数据存取模块**:分别处理借阅、书籍和读者的数据存取,确保数据安全。 13. **数据加密与备份模块**:保障数据的安全,防止数据丢失或泄露。 14. **远程数据同步模块**:在多地点的图书馆网络中实现数据的同步...

    visual basic2005文件IO与数据存取秘诀第一章范例

    在Visual Basic 2005中,文件I/O(Input/Output)和数据存取是程序开发中的核心技能,尤其对于处理磁盘上的文件和数据至关重要。本章内容主要聚焦于磁盘、文件以及文件处理的基本操作,为开发者提供实用的范例和技巧...

    易语言源码高级易模块集.7z

    2. **数据库模块**:支持连接和操作各种类型的数据库,如SQL Server、MySQL等,简化了数据存取和处理的代码。 3. **网络通信模块**:用于实现网络通信功能,如HTTP请求、TCP/IP连接,便于开发网络应用。 4. **加密...

    基于Oracle空间数据库的源数据组织存取效率分析.pdf

    2. 空间数据存取效率:GIS系统的核心,直接影响系统的运行和用户体验。 3. 源数据处理:数据导入前的预处理,是影响空间数据库性能的关键环节。 4. 数据量大小:数据量越大,存储需求越高,可能影响存取速度。 5. ...

    793个易模块打包下载

    4. 数据库模块:支持数据库操作,如SQL查询、数据存取等。 5. 第三方接口模块:用于与第三方软件或硬件交互,如DLL、ActiveX控件等。 6. 专业领域模块:针对特定领域的应用,如图像处理、音频视频处理等。 学习...

    J2ME移动计费支付模块

    5. **数据库访问模块**:使用J2ME的RMS(Record Management System)存储用户设置、密钥等数据,并提供接口供其他模块存取。 6. **用户界面模块**:实现与用户的交互,包括接收输入、显示结果,使用J2ME提供的高级...

    集博 EM1000 BASIC可程序化嵌入式控制模块.pdf

    以下详细介绍了该模块的特点及应用范围。 产品特点: 1. EM1000模块包含100Base/T以太网络接口,支持自动MDIX功能,能自动适应线序配置,无需手动调整。 2. 内建高达1024KB的Flash内存,适用于存储固件、应用程序和...

    基于Oracle数据库与ArcSDE的空间数据存取优化.pdf

    【基于Oracle数据库与ArcSDE的空间数据存取优化】 随着空间信息技术的快速发展,Oracle数据库作为关系型数据库的重要代表,其规模不断扩大,存储空间数据的需求日益增长。为了应对海量空间数据的管理和高效存取,...

    易语言模块大全

    4. **数据库访问模块**:提供与数据库系统交互的接口,如MySQL、SQL Server,方便进行数据的存取和处理。 5. **多媒体模块**:支持音频、视频的播放和处理,可用于开发媒体播放器或者进行音视频编辑。 6. **加密...

    数据结构图书管理系统.pdf

    "数据结构图书管理系统.pdf" ...本文档详细介绍了数据结构图书管理系统的设计和实现,涵盖了系统的设计目的、设计内容和要求、数据结构、功能模块详细设计等方面,展示了系统的整体架构和核心代码。

    Visual C# 2005 文件IO与数据存取秘诀(章立民研究室著) 源代码 CH13-CH14

    《Visual C# 2005 文件IO与数据存取秘诀》是一本深入探讨C#编程中关于文件输入/输出(I/O)和数据存储技术的专业书籍,由章立民研究室著。这本书的重点在于教导读者如何高效地管理和操作文件,以及如何在C#环境中...

    springboot[1]-多模块共用配置文件.zip

    - data-access-module(数据访问模块):负责数据存取操作。 - web-module(Web模块):处理HTTP请求和响应的模块。 2. **配置文件共享** - **配置文件位置**:在"common-config"模块中,我们可以创建一个名为`...

    易语言取模块基址

    通过取模块基址,我们可以定位到特定模块的内存区域,进而可以读取或修改其中的数据,甚至调用其中的函数。 实现“取模块基址”通常需要使用系统API函数,例如`GetModuleHandleA`或`GetModuleHandleW`。这些函数...

Global site tag (gtag.js) - Google Analytics