- 浏览: 1758039 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:173792
-
Android学习笔记
浏览量:368254
-
iBatis开发详解
浏览量:189384
-
Objective-C学习...
浏览量:99957
最新评论
-
iLidy:
引用[/c
Hibernate持久化对象的生命周期详解 -
fengzigogo:
您好,有这个项目架构的源码下载地址吗?
一种Java Web应用开发框架的构建(基于Struts2+Spring+FreeMarker)之一 -
spring_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
用Maven构建Java Web开发环境(Jetty容器)之二 -
springdata_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring 3之MVC & Security简单整合开发(二) -
赵庆辉:
看帖回复是美德,楼主讲的很清晰明了,看了豁然开朗.
Java String对象的经典问题(new String())
本文系iBatis开发详解系列文章之在iBatis中使用XML
在实际应用中,很多时候我们使用到了XML格式的数据,比如FushionChart,iBatis允许使用XML作为数据库查询操作的参数,也允许数据库查询结果返回一个XML格式的数据。如果不是必须,使用XML并不会给带来什么价值,甚至不如直接使用POJO,因为它是强类型的。下面先来看看使用XML作为参数的情况,做参数时,可以使用String,也可以使用DOM来传递,此时的XML结构并不严格要求,只要格式良好即可。结合实例,比如有如下的XML片段:
这样,已映射的语句将获得名为userId的参数,且值为1,那么,我们来看看映射语句该怎么来写:
把parameterClass属性写成xml就行了,resultClass可以是你定义的Bean类型或Map,下面来看程序:
这样就能得到结果了,这是String方式的XML传递,下面来看看DOM方式的写法,就需要使用到DOM生成的API了:
这种方式就是DOM方式,代码比较复杂,但是结构很清晰。如果要引入第三方API,那么Dom4j是个不错的选择,写一个工具类来帮助我们简化开发,如下:
那么程序代码就简介很多了,如下:
XML参数就说到这里,下面来看看XML结果,由上面的示例不难得出,下面我们先来看一个简单示例:
这是映射语句,很简单,参数都是见名知意了。xmlResultName参数的含义就是返回XML格式数据的跟元素名称,那么程序中可以这样来写:
我们得到如下结果(排版格式已经调整):
这是获取一个结果的时候,那么如果要获取多条结果,XML结果会是什么样的呢?我们来看一下:
程序也做相应的修改:
打印,得到集合形式的XML文档,每个元素都是独立的XML文档,这显然不是我们想要的形式,那么又该如何处理呢?把这些独立的XML手工拼接成一个XML文档,这显然不可取啊。要解决这个问题,就不能使用iBatis的XML结果了,返回Bean的集合,对Bean进行操作显然更为方法,下面给出一个简单的方法。
我们先来修改User类,加一个方法:
那么我们就可以这样来写程序了:
这样我们就得到格式良好的XML文档了。下面给出一个工具类,利用反射将Bean中的属性转换为XML格式:
而在测试程序中,这么写就行了:
也就得到了结果,只是在每个user元素中会多一个class子元素,如果不想要还要修改工具类。但这也并不是最佳实践,如果处理数据量太大,就要消耗大量的内存。
关于此示例的代码,请参考上一篇文章中的附件。
哪些情况下使用xml比较合适?或者是必须?
跨平台应用,比如web service,当然不绝对
思路很好,直接通过xml做输入输出参数;实际应用上,我认为使用POJO更合适,再转成你想要的数据格式(xml等),这样代码的复杂度、可读性、通用性都更好一些。
当然了,这里仅仅是对iBatis的功能说明
哪些情况下使用xml比较合适?或者是必须?
跨平台应用,比如web service,当然不绝对
哪些情况下使用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子元素,如果不想要还要修改工具类。但这也并不是最佳实践,如果处理数据量太大,就要消耗大量的内存。
关于此示例的代码,请参考上一篇文章中的附件。
评论
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
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操作DDL和映射继承
2012-09-09 21:46 9280本文系iBatis开发详解系列文章之iBatis操作D ... -
iBatis查询复杂集合
2012-09-04 20:23 15774本文系iBatis开发详解系列文章之在iBatis查询 ... -
iBatis执行非查询语句(CRUD,函数和过程)
2012-08-26 21:40 9325CRUD操作中除了查询操作,其他都统一称为更新操作,因 ... -
Spring数据库访问之iBatis(二)
2012-06-10 13:56 5807接上文,我们继续来研究Spring和iBatis的整合 ... -
Spring数据库访问之iBatis(一)
2012-01-02 18:45 16000为了丰富博客专栏【Spring数据库访问系列】的内容, ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7752经过5个月的制作,和华章合作的《中小企业OA系统》Ja ... -
iBatis分页(基于Struts2和Freemarker)
2011-05-02 10:05 13129之前介绍过基于Hibernate分页的原理和设计,这里 ... -
Spring数据库访问之ORM(三)
2011-03-02 20:35 17624本文接上一篇继续研究。 之前我们使用的是Hib ... -
Spring数据库访问之ORM(二)
2011-02-16 13:19 23400本文接上一篇继续来研究Spring的ORM模块。 ... -
Spring数据库访问之ORM(一)
2011-01-27 10:54 30832Spring数据库访问中另外一大模块就是ORM,ORM ... -
Spring数据库访问之异常处理
2011-01-19 10:29 27517使用JDBC API时,很 ... -
Spring数据库访问(HSQL)(四)
2011-01-16 21:49 14594本文接上一篇继续研究Spring的JDBC模板。 ... -
Spring数据库访问(HSQL)(三)
2011-01-13 10:07 13446本文接上一篇继续研究JDBC模板。 之前说的都 ... -
Spring数据库访问(HSQL)(二)
2011-01-11 11:27 10731上一篇我们介绍了 ... -
Spring数据库访问(HSQL)(一)
2011-01-09 23:34 13841本部分主要介绍Spring的JDBC模板,JDBC模板 ... -
Spring 3之MVC & Security简单整合开发(三)
2010-12-03 19:04 22083本文接上一篇继续深入研究Security框架。 ... -
Spring 3之MVC & Security简单整合开发(二)
2010-12-01 20:29 60103本文接上一篇继续 ... -
Spring 3之MVC & Security简单整合开发(一)
2010-11-30 22:00 42658Spring的MVC模块是一种简洁的Web应用框架,实 ... -
iBatis查询select详解
2010-08-07 12:19 40532<select>是iBatis已经映射的语 ... -
iBatis查询API
2010-07-31 13:04 17699先说点基础的内容 ...
相关推荐
通过上述步骤,你可以在iBATIS中使用XML配置文件进行SQL操作。对于复杂场景,如多表联查、分页、存储过程等,你可以继续深入学习XML配置文件的高级用法,例如使用`<association>`, `<collection>`处理嵌套结果,使用...
在这个"Struts+Spring+iBATIS做的XML文件操作例子"中,我们将深入探讨这三个框架如何协同工作以及XML文件在其中的作用。 Struts 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它主要用于控制...
在Ibatis中,XML映射文件包含了SQL语句、参数映射以及结果集映射等信息。通过这些XML文件,我们可以定义查询、插入、更新和删除等操作,同时可以定制化处理复杂的数据转换。XML文件结构清晰,易于理解和维护,同时也...
在SqlMapConfig.xml中,最重要的部分是数据库连接的配置,通常包括以下几项: 1. 数据源(DataSource):定义了如何获取数据库连接。这可能包含数据库驱动类、数据库URL、用户名和密码。例如: ```xml ...
SQLServer Ibatis XML自动生成工具是一款实用的开发辅助软件,主要针对Java开发人员,特别是那些在项目中使用Ibatis作为持久层框架的开发者。这款工具能够显著提高开发效率,通过自动化的方式生成Ibatis所需的XML...
MyBatis通过`SqlSourceBuilder`和`BoundSql`等类解析XML中的动态元素,并在运行时构建出实际的SQL语句。而"工具"则可能意味着我们可以结合其他开发工具,如IDE插件或日志工具,来辅助调试和优化这些动态SQL。 至于...
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简介与工作原理 iBatis(现更名为MyBatis)是一个支持普通SQL查询、存储过程以及高级映射的优秀开源持久层框架。...
"iBATIS-XmlParser" 指的是iBATIS框架中解析XML配置文件的部分,这部分主要负责读取和处理XML中的SQL映射信息。 在iBATIS中,XML配置文件是核心组件之一,它包含了SQL映射语句、参数映射、结果映射等关键信息。XML...
创建对应的POJO对象和映射文件(如Employee.xml),并将映射文件在sqlMapConfig.xml中注册。 **Ibatis 操作** Ibatis 使用不同的标签来处理不同的数据库操作: - `<select>` 标签用于查询,其中包含 SQL 语句,并...
- 在Ibatis的配置文件`SqlMapConfig.xml`中,可以设置`<settings>`标签内的`defaultExecutorType`属性为`BATCH`或`SIMPLE`,以确保每次执行的SQL都是独立的,避免因缓存导致的编码问题。 - 同时,确保你的项目编码...
通过上述步骤,我们可以在ibatis中实现高效的批量更新操作,极大地提升系统处理大规模数据的能力。这种方法不仅适用于Java环境下的开发,也适用于其他支持ibatis的编程语言。总之,ibatis提供的批量更新功能是处理...
使用iBATIS时,首先需要在项目中引入iBATIS库,然后创建数据库配置文件(如`sqlmap-config.xml`),在此文件中定义数据源和事务管理器。接着,编写SQL Map文件,其中包含具体的SQL查询和存储过程。在Java代码中,...
本文将对ibatis的核心配置文件`sqlMapConfig.xml`进行详细解析,帮助读者更好地理解和掌握ibatis的配置方式。 #### 二、`sqlMapConfig.xml`文件结构 `sqlMapConfig.xml`文件是ibatis的主要配置文件,用于定义整个...
在本篇文章中,我们将深入探讨如何使用 Java 编程语言结合 iBatis 框架进行 SQL 字符串的动态拼接。通过分析提供的代码片段,我们可以了解到在实际开发过程中,这种动态 SQL 的构建方式非常常见,尤其是在处理复杂的...
4. **动态SQL**: iBatis支持在XML中编写动态SQL,可以根据条件动态生成SQL语句,增加了SQL的灵活性。 5. **事务管理**: iBatis提供了事务控制功能,开发者可以自定义事务的提交和回滚。 **iBatis开发指南** 开发...
3. **动态SQL**:iBATIS支持动态SQL,允许在XML映射文件中根据条件动态构造SQL语句。这提高了代码的可读性和可维护性。 4. **结果映射(Result Maps)**:iBATIS通过Result Maps将数据库查询的结果映射到Java对象。...
- 使用`SqlMapClientBuilder`构建`SqlMapClient`对象,这一步是初始化iBATIS的核心,通过读取`SqlMapConfig.xml`来建立与数据库的连接。代码示例: ```java Reader reader = Resources.getResourceAsReader(...
在.NET中使用iBATIS时,首先需要安装iBATIS.NET库。可以通过NuGet包管理器或者直接下载源码编译来获取。在VS2008项目中,添加对iBATIS.NET的引用,这样就可以开始配置和使用了。 接着,我们看压缩包内的"数据库.txt...
IBATIS是一款流行的数据持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,提供了灵活的映射机制,使得Java对象与数据库表之间的交互更加便捷。 标签 "ibatis" 指的是这个插件是为IBATIS框架设计的。IBATIS...