`
sarin
  • 浏览: 1758039 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:173792
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:368254
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:189384
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:99957
社区版块
存档分类
最新评论

iBatis中使用XML

阅读更多
    本文系iBatis开发详解系列文章之在iBatis中使用XML
    在实际应用中,很多时候我们使用到了XML格式的数据,比如FushionChart,iBatis允许使用XML作为数据库查询操作的参数,也允许数据库查询结果返回一个XML格式的数据。如果不是必须,使用XML并不会给带来什么价值,甚至不如直接使用POJO,因为它是强类型的。下面先来看看使用XML作为参数的情况,做参数时,可以使用String,也可以使用DOM来传递,此时的XML结构并不严格要求,只要格式良好即可。结合实例,比如有如下的XML片段:
<parameter><userId>1</userId></parameter>

    这样,已映射的语句将获得名为userId的参数,且值为1,那么,我们来看看映射语句该怎么来写:
<select id="getUserByXMLId" parameterClass="xml" resultClass="User">
	select * from users where userId=#userId#
</select>

    把parameterClass属性写成xml就行了,resultClass可以是你定义的Bean类型或Map,下面来看程序:
String parameter = "<parameter><userId>1</userId></parameter>";
User user = (User) sqlMap.queryForObject("User.getUserByXMLId",
		parameter);
System.out.println(user);

    这样就能得到结果了,这是String方式的XML传递,下面来看看DOM方式的写法,就需要使用到DOM生成的API了:
public static void main(String[] args) throws SQLException,
			ParserConfigurationException {
	//创建XML文档
	org.w3c.dom.Document parameterDocument = DocumentBuilderFactory
			.newInstance().newDocumentBuilder().newDocument();
	//创建根元素
	org.w3c.dom.Element paramElement = parameterDocument
			.createElement("parameterDocument");
	//创建userId元素
	org.w3c.dom.Element userIdElement = parameterDocument
.createElement("userId");
	//设置userId元素的值
	userIdElement.setTextContent("1");
	//元素关系添加
	paramElement.appendChild(userIdElement);
	parameterDocument.appendChild(paramElement);
	//数据查询
	User user = (User) sqlMap.queryForObject("User.getUserByXMLId",
			parameterDocument);
	System.out.println(user);
}

    这种方式就是DOM方式,代码比较复杂,但是结构很清晰。如果要引入第三方API,那么Dom4j是个不错的选择,写一个工具类来帮助我们简化开发,如下:
package ibatis.util;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
/**
 * 使用dom4j生成XML工具类
 * 
 * @author Sarin
 * 
 */
public class XMLUtil {
	private Document document = null;
	public Document getDocument() {
		return document;
	}
	/**
	 * 构造方法,初始化Document
	 */
	public XMLUtil() {
		document = DocumentHelper.createDocument();
	}
	/**
	 * 生成根节点
	 * 
	 * @param rootName
	 * @return
	 */
	public Element addRoot(String rootName) {
		Element root = document.addElement(rootName);
		return root;
	}
	/**
	 * 生成节点
	 * 
	 * @param parentElement
	 * @param elementName
	 * @return
	 */
	public Element addNode(Element parentElement, String elementName) {
		Element node = parentElement.addElement(elementName);
		return node;
	}
	/**
	 * 为节点增加一个属性
	 * 
	 * @param thisElement
	 * @param attributeName
	 * @param attributeValue
	 */
	public void addAttribute(Element thisElement, String attributeName,
			String attributeValue) {
		thisElement.addAttribute(attributeName, attributeValue);
	}
	/**
	 * 为节点增加多个属性
	 * 
	 * @param thisElement
	 * @param attributeNames
	 * @param attributeValues
	 */
	public void addAttributes(Element thisElement, String[] attributeNames,
			String[] attributeValues) {
		for (int i = 0; i < attributeNames.length; i++) {
			thisElement.addAttribute(attributeNames[i], attributeValues[i]);
		}
	}
	/**
	 * 增加节点的值
	 * 
	 * @param thisElement
	 * @param text
	 */
	public void addText(Element thisElement, String text) {
		thisElement.addText(text);
	}
	/**
	 * 获取最终的XML
	 * 
	 * @return
	 * @throws IOException
	 */
	public String getXML() {
		return document.asXML().substring(39);
	}
}

    那么程序代码就简介很多了,如下:
XMLUtil xmlParameter = new XMLUtil();
Element parameter = xmlParameter.addRoot("parameter");
Element userId = xmlParameter.addNode(parameter, "userId");
userId.addText("1");
System.out.println(xmlParameter.getXML());
User user = (User) sqlMap.queryForObject("User.getUserByXMLId",
		xmlParameter.getXML());
System.out.println(user);

    XML参数就说到这里,下面来看看XML结果,由上面的示例不难得出,下面我们先来看一个简单示例:
<select id="getXMLValueByUserId" resultClass="xml" xmlResultName="User" parameterClass="int">
		select * from users where userId=#userId#
</select>

    这是映射语句,很简单,参数都是见名知意了。xmlResultName参数的含义就是返回XML格式数据的跟元素名称,那么程序中可以这样来写:
String xmlUser = (String) sqlMap.queryForObject(
		"User.getXMLValueByUserId", new Integer(1));
System.out.println(xmlUser);

    我们得到如下结果(排版格式已经调整):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<User>
<userId>1</userId>
<userName>Sarin</userName>
<password>123</password>
<age>23</age>
<mobile>15940912345</mobile>
<email>gmail@gmail.com</email>
</User>

    这是获取一个结果的时候,那么如果要获取多条结果,XML结果会是什么样的呢?我们来看一下:
<select id="getUserXMLValue" resultClass="xml" xmlResultName="User">
	select * from users
</select>

    程序也做相应的修改:
List xmlUserList = sqlMap.queryForList("User.getUserXMLValue");
System.out.println(xmlUserList);

    打印,得到集合形式的XML文档,每个元素都是独立的XML文档,这显然不是我们想要的形式,那么又该如何处理呢?把这些独立的XML手工拼接成一个XML文档,这显然不可取啊。要解决这个问题,就不能使用iBatis的XML结果了,返回Bean的集合,对Bean进行操作显然更为方法,下面给出一个简单的方法。
    我们先来修改User类,加一个方法:
public String toXML() {
	StringBuffer xmlValue = new StringBuffer();
	xmlValue.append("<user>");
	xmlValue.append("<userId>").append(getUserId()).append("</userId>");
	xmlValue.append("<userName>").append(getUserName()).append("</userName>");
	xmlValue.append("<password>").append(getPassword()).append("</password>");
	xmlValue.append("<mobile>").append(getMobile()).append("</mobile>");
	xmlValue.append("<email>").append(getEmail()).append("</email>");
	xmlValue.append("<age>").append(getAge()).append("</age>");
	xmlValue.append("</user>");
	return xmlValue.toString();
}

    那么我们就可以这样来写程序了:
List<User> userList = sqlMap.queryForList("User.getAllUsers");
StringBuffer xmlUserList = new StringBuffer("<users>");
for (User user : userList) {
	xmlUserList.append(user.toXML());
}
xmlUserList.append("</users>");
System.out.println(xmlUserList.toString());

    这样我们就得到格式良好的XML文档了。下面给出一个工具类,利用反射将Bean中的属性转换为XML格式:
package ibatis.util;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class BeanToXML {
	private Class beanClass;
	private BeanInfo beanInfo;
	private String name;
	public BeanToXML(Class beanClass, String name) throws Exception {
		this.beanClass = beanClass;
		this.name = name;
		beanInfo = Introspector.getBeanInfo(beanClass);
	}
	public String convertToXML(Object obj) throws Exception {
		StringBuffer xmlValue = new StringBuffer();
		if (obj.getClass().isAssignableFrom(beanClass)) {
			PropertyDescriptor[] pd = beanInfo.getPropertyDescriptors();
			if (pd.length > 0) {
				xmlValue.append("<").append(name).append(">");
				for (int i = 0; i < pd.length; i++) {
					xmlValue.append(getProperty(obj, pd[i]));
				}
				xmlValue.append("</").append(name).append(">");
			} else {
				xmlValue.append("<").append(name).append("/>");
			}
		} else {
			throw new ClassCastException("Class " + obj.getClass().getName()
					+ " is not compatible with " + beanClass.getName());
		}
		return xmlValue.toString();
	}
	private String getProperty(Object obj, PropertyDescriptor pd)
			throws Exception {
		StringBuffer propertyValue = new StringBuffer();
		Method method = pd.getReadMethod();
		Object bodyValue = method.invoke(obj);
		if (null == bodyValue) {			propertyValue.append("<").append(pd.getName()).append("/>");
		} else {			propertyValue.append("<").append(pd.getName()).append(">");
			propertyValue.append(bodyValue.toString());			propertyValue.append("</").append(pd.getName()).append(">");
		}
		return propertyValue.toString();
	}
}

    而在测试程序中,这么写就行了:
BeanToXML btx = new BeanToXML(User.class, "user");
List<User> userList = sqlMap.queryForList("User.getAllUsers");
StringBuffer xmlUserList = new StringBuffer("<users>");
for (User user : userList) {
	xmlUserList.append(btx.convertToXML(user));
}
xmlUserList.append("</users>");
System.out.println(xmlUserList.toString());

    也就得到了结果,只是在每个user元素中会多一个class子元素,如果不想要还要修改工具类。但这也并不是最佳实践,如果处理数据量太大,就要消耗大量的内存。
    关于此示例的代码,请参考上一篇文章中的附件。
3
3
分享到:
评论
7 楼 learnworld 2012-08-31  
sarin 写道
learnworld 写道
引用
如果不是必须,使用XML并不会给带来什么价值,甚至不如直接使用POJO,因为它是强类型的。

哪些情况下使用xml比较合适?或者是必须?

跨平台应用,比如web service,当然不绝对

思路很好,直接通过xml做输入输出参数;实际应用上,我认为使用POJO更合适,再转成你想要的数据格式(xml等),这样代码的复杂度、可读性、通用性都更好一些。
6 楼 sarin 2012-08-30  
bruce0508 写道
由pojo转xml也是可行的啊,没必要用这种方式吧

当然了,这里仅仅是对iBatis的功能说明
5 楼 sarin 2012-08-30  
iwangxiaodong 写道
兄弟,iBatis早就改名为MyBatis了,架构也变化很大,早早升级吧!

本系列仅介绍iBatis,它们原理相通,知道原理即可,不追求版本号
4 楼 sarin 2012-08-30  
learnworld 写道
引用
如果不是必须,使用XML并不会给带来什么价值,甚至不如直接使用POJO,因为它是强类型的。

哪些情况下使用xml比较合适?或者是必须?

跨平台应用,比如web service,当然不绝对
3 楼 bruce0508 2012-08-30  
由pojo转xml也是可行的啊,没必要用这种方式吧
2 楼 iwangxiaodong 2012-08-30  
兄弟,iBatis早就改名为MyBatis了,架构也变化很大,早早升级吧!
1 楼 learnworld 2012-08-30  
引用
如果不是必须,使用XML并不会给带来什么价值,甚至不如直接使用POJO,因为它是强类型的。

哪些情况下使用xml比较合适?或者是必须?

相关推荐

    ibatis用xml配置文件配置使用

    通过上述步骤,你可以在iBATIS中使用XML配置文件进行SQL操作。对于复杂场景,如多表联查、分页、存储过程等,你可以继续深入学习XML配置文件的高级用法,例如使用`&lt;association&gt;`, `&lt;collection&gt;`处理嵌套结果,使用...

    Struts+Spring+iBATIS做的XML文件操作例子

    在这个"Struts+Spring+iBATIS做的XML文件操作例子"中,我们将深入探讨这三个框架如何协同工作以及XML文件在其中的作用。 Struts 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它主要用于控制...

    ibatis生成xml,object

    在Ibatis中,XML映射文件包含了SQL语句、参数映射以及结果集映射等信息。通过这些XML文件,我们可以定义查询、插入、更新和删除等操作,同时可以定制化处理复杂的数据转换。XML文件结构清晰,易于理解和维护,同时也...

    ibatis 连接字符串 SqlMapConfig.xml

    在SqlMapConfig.xml中,最重要的部分是数据库连接的配置,通常包括以下几项: 1. 数据源(DataSource):定义了如何获取数据库连接。这可能包含数据库驱动类、数据库URL、用户名和密码。例如: ```xml ...

    sqlserver Ibatis XML自动生成工具

    SQLServer Ibatis XML自动生成工具是一款实用的开发辅助软件,主要针对Java开发人员,特别是那些在项目中使用Ibatis作为持久层框架的开发者。这款工具能够显著提高开发效率,通过自动化的方式生成Ibatis所需的XML...

    ibatis UPDATE 动态XML与insert

    MyBatis通过`SqlSourceBuilder`和`BoundSql`等类解析XML中的动态元素,并在运行时构建出实际的SQL语句。而"工具"则可能意味着我们可以结合其他开发工具,如IDE插件或日志工具,来辅助调试和优化这些动态SQL。 至于...

    iBATIS实战

    6.1 在iBATIS中使用XML 96 6.1.1 XML参数 96 6.1.2 XML结果 98 6.2 用已映射语句关联对象 101 6.2.1 复杂集合 101 6.2.2 延迟加载 104 6.2.3 避免N+1查询问题 105 6.3 继承 107 6.4 其他用途 109 6.4.1 使用语句类型...

    IBATIS中,要查询出来的属性来自哪个xml,就把这个方法写在该xml下

    ### IBATIS中,要查询出来的属性来自哪个xml,就把这个方法写在该xml下的深入解析 #### 一、IBATIS简介与工作原理 iBatis(现更名为MyBatis)是一个支持普通SQL查询、存储过程以及高级映射的优秀开源持久层框架。...

    iBATIS-XmlParser

    "iBATIS-XmlParser" 指的是iBATIS框架中解析XML配置文件的部分,这部分主要负责读取和处理XML中的SQL映射信息。 在iBATIS中,XML配置文件是核心组件之一,它包含了SQL映射语句、参数映射、结果映射等关键信息。XML...

    ibatis的使用教程

    创建对应的POJO对象和映射文件(如Employee.xml),并将映射文件在sqlMapConfig.xml中注册。 **Ibatis 操作** Ibatis 使用不同的标签来处理不同的数据库操作: - `&lt;select&gt;` 标签用于查询,其中包含 SQL 语句,并...

    ibatis乱码解决方法(ibatis独立)

    - 在Ibatis的配置文件`SqlMapConfig.xml`中,可以设置`&lt;settings&gt;`标签内的`defaultExecutorType`属性为`BATCH`或`SIMPLE`,以确保每次执行的SQL都是独立的,避免因缓存导致的编码问题。 - 同时,确保你的项目编码...

    ibatis应对批量update

    通过上述步骤,我们可以在ibatis中实现高效的批量更新操作,极大地提升系统处理大规模数据的能力。这种方法不仅适用于Java环境下的开发,也适用于其他支持ibatis的编程语言。总之,ibatis提供的批量更新功能是处理...

    ibatis 相关使用文档及安装包ibatis 相关使用文档及安装包

    使用iBATIS时,首先需要在项目中引入iBATIS库,然后创建数据库配置文件(如`sqlmap-config.xml`),在此文件中定义数据源和事务管理器。接着,编写SQL Map文件,其中包含具体的SQL查询和存储过程。在Java代码中,...

    ibatis配置文件

    本文将对ibatis的核心配置文件`sqlMapConfig.xml`进行详细解析,帮助读者更好地理解和掌握ibatis的配置方式。 #### 二、`sqlMapConfig.xml`文件结构 `sqlMapConfig.xml`文件是ibatis的主要配置文件,用于定义整个...

    ibatis拼接字符串

    在本篇文章中,我们将深入探讨如何使用 Java 编程语言结合 iBatis 框架进行 SQL 字符串的动态拼接。通过分析提供的代码片段,我们可以了解到在实际开发过程中,这种动态 SQL 的构建方式非常常见,尤其是在处理复杂的...

    ibatis 使用手册

    4. **动态SQL**: iBatis支持在XML中编写动态SQL,可以根据条件动态生成SQL语句,增加了SQL的灵活性。 5. **事务管理**: iBatis提供了事务控制功能,开发者可以自定义事务的提交和回滚。 **iBatis开发指南** 开发...

    iBATIS框架源码剖析源码

    3. **动态SQL**:iBATIS支持动态SQL,允许在XML映射文件中根据条件动态构造SQL语句。这提高了代码的可读性和可维护性。 4. **结果映射(Result Maps)**:iBATIS通过Result Maps将数据库查询的结果映射到Java对象。...

    ibatis简易使用 ibatis简易使用 ibatis简易使用

    - 使用`SqlMapClientBuilder`构建`SqlMapClient`对象,这一步是初始化iBATIS的核心,通过读取`SqlMapConfig.xml`来建立与数据库的连接。代码示例: ```java Reader reader = Resources.getResourceAsReader(...

    .net中使用iBATIS的小例子

    在.NET中使用iBATIS时,首先需要安装iBATIS.NET库。可以通过NuGet包管理器或者直接下载源码编译来获取。在VS2008项目中,添加对iBATIS.NET的引用,这样就可以开始配置和使用了。 接着,我们看压缩包内的"数据库.txt...

    ibatis 自动生成插件

    IBATIS是一款流行的数据持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,提供了灵活的映射机制,使得Java对象与数据库表之间的交互更加便捷。 标签 "ibatis" 指的是这个插件是为IBATIS框架设计的。IBATIS...

Global site tag (gtag.js) - Google Analytics