- 浏览: 1748156 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:172832
-
Android学习笔记
浏览量:366576
-
iBatis开发详解
浏览量:188322
-
Objective-C学习...
浏览量:98763
最新评论
-
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 9193本文系iBatis开发详解系列文章之iBatis操作D ... -
iBatis查询复杂集合
2012-09-04 20:23 15631本文系iBatis开发详解系列文章之在iBatis查询 ... -
iBatis执行非查询语句(CRUD,函数和过程)
2012-08-26 21:40 9257CRUD操作中除了查询操作,其他都统一称为更新操作,因 ... -
Spring数据库访问之iBatis(二)
2012-06-10 13:56 5699接上文,我们继续来研究Spring和iBatis的整合 ... -
Spring数据库访问之iBatis(一)
2012-01-02 18:45 15863为了丰富博客专栏【Spring数据库访问系列】的内容, ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7687经过5个月的制作,和华章合作的《中小企业OA系统》Ja ... -
iBatis分页(基于Struts2和Freemarker)
2011-05-02 10:05 13033之前介绍过基于Hibernate分页的原理和设计,这里 ... -
Spring数据库访问之ORM(三)
2011-03-02 20:35 17549本文接上一篇继续研究。 之前我们使用的是Hib ... -
Spring数据库访问之ORM(二)
2011-02-16 13:19 23309本文接上一篇继续来研究Spring的ORM模块。 ... -
Spring数据库访问之ORM(一)
2011-01-27 10:54 30715Spring数据库访问中另外一大模块就是ORM,ORM ... -
Spring数据库访问之异常处理
2011-01-19 10:29 27430使用JDBC API时,很 ... -
Spring数据库访问(HSQL)(四)
2011-01-16 21:49 14451本文接上一篇继续研究Spring的JDBC模板。 ... -
Spring数据库访问(HSQL)(三)
2011-01-13 10:07 13380本文接上一篇继续研究JDBC模板。 之前说的都 ... -
Spring数据库访问(HSQL)(二)
2011-01-11 11:27 10695上一篇我们介绍了 ... -
Spring数据库访问(HSQL)(一)
2011-01-09 23:34 13741本部分主要介绍Spring的JDBC模板,JDBC模板 ... -
Spring 3之MVC & Security简单整合开发(三)
2010-12-03 19:04 21984本文接上一篇继续深入研究Security框架。 ... -
Spring 3之MVC & Security简单整合开发(二)
2010-12-01 20:29 59959本文接上一篇继续 ... -
Spring 3之MVC & Security简单整合开发(一)
2010-11-30 22:00 42413Spring的MVC模块是一种简洁的Web应用框架,实 ... -
iBatis查询select详解
2010-08-07 12:19 40462<select>是iBatis已经映射的语 ... -
iBatis查询API
2010-07-31 13:04 17626先说点基础的内容 ...
相关推荐
Ibatis自动生成xml插件,只需要使用此插件,便可省去很多代码量。 包括xml以及object
ibatis用xml配置文件配置的使用,基本包括了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 使用语句类型...
NULL 博文链接:https://wuxiubing.iteye.com/blog/1010635
NULL 博文链接:https://zhangjingqiang.iteye.com/blog/576195
sqlserver Ibatis XML自动生成工具,本人正在使用的工具;下载后配置XML数据库连接和用户名密码,输入表名即可生成
NULL 博文链接:https://yhq1212.iteye.com/blog/1772214
IBATIS中,要查询出来的属性来自哪个xml,就把这个方法写在该xml下.doc
iBATIS-XmlParser
ibatis 乱码解决 ibatis乱码 gbk iso_8859_1 乱码
ibatis ibatis学习笔记(一)>>>>>>>sqlMapConfig.xml文件详解
iBATIS框架源码剖析源码 iBATIS框架源码剖析源码 iBATIS框架源码剖析源码
Spring+iBatis+JDom递归生成XML树 Spring+iBatis+JDom递归生成XML树
ibatis简单使用的想法 ibatis 是一个成熟的框架,现在已经是改名字叫mybatis了,框架的配置比较烦,如xml,dao的书写,还有每个表还要对应于javabean,没有的话,map 也成,这里希望对其进行简单的简化。
ibatis配置文件模板.包括(SqlMap.properties和SqlMapConfig.xml以及跟javabean的映射文件)
项目中使用该Mygeneration模板生成对应xml和实体类;项目中使用该Mygeneration模板生成对应xml和实体类;项目中使用该Mygeneration模板生成对应xml和实体类
spirng+struts+Ibatis+xml、json解析
1.每个实体类需要配置各自的“SqlMap.config”在“config/...3.使用前请先建立表Student与Teacher,表中字段请参照各自的StudentMap.xml、TeacherMap.xml。 4.通过log4net记录错误日志,出错时会打印执行的sql语句。
但是也为你节约了很多的时间. <br>使用方法: 1.修改beans.txt文件:这里是你的javabean的列表,一行一个.程序会读这个配置文件,来获取要做映射的类. 2.把你的jar包拷贝到本目录底下. 3.修改run.cmd文件,把...
ibatis_SqlMap的配置,SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70%的工作量。