iBatis 操作数据库【简单的一对多映射】,简单例子之二

涉及到的数据库,有两个

注意:

数据库:里的address是作为,custome的一部分出现的,

bean:他们是完全独立的两个bean

 


 

t_customer

 

DROP TABLE IF EXISTS `t_customer`;
CREATE TABLE `t_customer` (
  `id` bigint(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  `phone` int(11) DEFAULT NULL,
  `married` bit(1) DEFAULT NULL,
  `sex` varchar(1) DEFAULT NULL,
  `image` blob,
  `registered_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `home_address` varchar(100) DEFAULT NULL,

  `company_address` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=128 DEFAULT CHARSET=latin1;

 

t_order

 

DROP TABLE IF EXISTS `t_order`;
CREATE TABLE `t_order` (
  `id` bigint(10) NOT NULL AUTO_INCREMENT,
  `customer_id` bigint(10) DEFAULT NULL,
  `order_number` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_customer_id` (`customer_id`),
  CONSTRAINT `fk_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `t_customer` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=latin1;

 

 


 

对应的bean文件有

 


 

package bean;

import java.io.Serializable;
/**
 *
 * @author zwc
 *
 */
@SuppressWarnings("serial")
public class Order implements Serializable{
 private long id;
 private String orderNumber;
 private Customer customer;
 
 
 public long getId() {
  return id;
 }
 public void setId(long id) {
  this.id = id;
 }
 public String getOrderNumber() {
  return orderNumber;
 }
 public void setOrderNumber(String orderNumber) {
  this.orderNumber = orderNumber;
 }
 public Customer getCustomer() {
  return customer;
 }
 public void setCustomer(Customer customer) {
  this.customer = customer;
 }
}

 

 

package bean;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;

@SuppressWarnings("serial")
public class Customer implements Serializable{
 private Long id;
 private String firstName = "N";
 private String lastName = "N";
 private int phone;
 private boolean married;
 private String sex;
 private byte[]image;
 private Timestamp registeredTime;
 private int count;
 private Address homeAddress;
 private Address companyAddress;
 
 
 private Set<Order> orderSet = new HashSet<Order>();
 
 public Customer(){
  //empty
 }
 
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

 public String getName() {
  return firstName + "-" + lastName;
 }
 public void setName(String name) {
  String [] names = name.split("-");
  if(names.length >= 1){
   this.firstName = names[0];
  }
  if(names.length >= 2){
   this.lastName = names[1];
  }
 }
 public int getPhone() {
  return phone;
 }
 public void setPhone(int phone) {
  this.phone = phone;
 }
 public boolean isMarried() {
  return married;
 }
 public void setMarried(boolean married) {
  this.married = married;
 }
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }

针对这部分有个注意事项,下面有:
 public byte[] getImage() {
  return image;
 }
 public void setImage(byte[] image) {
  this.image = image;
 }
 public Timestamp getRegisteredTime() {
  return registeredTime;
 }
 public void setRegisteredTime(Timestamp registeredTime) {
  this.registeredTime = registeredTime;
 }

 public int getCount() {
  return count;
 }
 public void setCount(int count) {
  this.count = count;
 }

 public Set<Order> getOrderSet() {
  return orderSet;
 }

 public void setOrderSet(Set<Order> orderSet) {
  this.orderSet = orderSet;
 }

 public Address getHomeAddress() {
  return homeAddress;
 }

 public void setHomeAddress(Address homeAddress) {
  this.homeAddress = homeAddress;
 }

 public Address getCompanyAddress() {
  return companyAddress;
 }

 public void setCompanyAddress(Address companyAddress) {
  this.companyAddress = companyAddress;
 }
 
}

 

 

 

package bean;

/**
 *
 * @author zwc
 *
 */
public class Address {
 private long id;
 private String name;
 private Customer customer;
 
 
 public long getId() {
  return id;
 }
 public void setId(long id) {
  this.id = id;
 }
 public Customer getCustomer() {
  return customer;
 }
 public void setCustomer(Customer customer) {
  this.customer = customer;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}

说明:对应这里的bean均不能设置为保护性,和私有性,要不ibatis无法找到对应的属性

 


 

ibatis的配置文件保持不变,

可以参考例子一

 

sql配置文件:

 


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">

 

<sqlMap namespace="bean">
 <typeAlias alias="user" type="bean.User"/>
 <typeAlias alias="customer" type="bean.Customer"/>
 <typeAlias alias="order" type="bean.Order"/>
 <typeAlias alias="address" type="bean.Address"/>
 
 <resultMap id="orderMap" class="order">
  <result property="id" column="id"/>
  <result property="orderNumber" column="order_number"/>
  <result property="customer" column="customer_id" select="bean.getCustomer"/>
 </resultMap>
 <resultMap id="customerMap" class="customer">
  <result property="id" column="id"></result>
  <result property="name" column="name"></result>
  <result property="phone" column="phone"></result>
  <result property="married" column="married" javaType="java.lang.Boolean" jdbcType="bit"></result>
  <result property="sex" column="sex" javaType="java.lang.String" jdbcType="varchar"></result>

注意:这里的对java,和jdbc的类型的声明,其中,ibatis不支持char 类型,所以,本以为定义sex为char 的,这里被迫定义为string类型
  <result property="image" column="image"></result>
  <result property="registeredTime" column="registered_time"></result>
  <result property="homeAddress" column="id" select="bean.getAddress"></result>
  <result property="companyAddress" column="id" select="bean.getAddress"></result>

注意:一对多关联,就是通过这里的select语句,进行关联的,如果要关联一对一,可以<result property="homeAddress" column="t_customer.home_address" javaType="" jdbcType=""/>具体的,我没有测试,大家可以尝试下!!

下面是我截图的参考:


 </resultMap>
 <resultMap id="addressMap" class="address">
  <result property="id" column="id"></result>
  <result property="name" column="home_address"></result>
 </resultMap>
 
 
 <cacheModel id="userCache" type="LRU">
  <flushInterval hours="24"/>
  <!-- <flushOnExecute statement="updateUser"/>   -->
  <property name="size" value="100"/>
 </cacheModel>
 
 <select id="getUser" parameterClass="user" resultClass="user" cacheModel="userCache">
  <![CDATA[
   select id,name,sex from t_user where name like #name#
  ]]>
 </select>
 <insert id="InsertUser" parameterClass="user">
  <![CDATA[
   insert into t_user(name, sex) values( #name#, #sex# )
  ]]>
 </insert>
 <update id="updateUser" parameterClass="user">
  <![CDATA[
   update t_user set name = #name#, sex = #sex# where id = #id#
  ]]>
 </update>
 <delete id="deleteUser" parameterClass="user">
  <![CDATA[
   delete from t_user where id = #id#
  ]]>
 </delete>

 <select id="getCustomer" parameterClass="java.lang.Integer" resultMap="customerMap">
  <![CDATA[
   select id,name,phone,married,sex,image,registered_time from t_customer where id = #customer_id#
  ]]>
 </select>
 <select id="getOrder" resultMap="orderMap">
  <![CDATA[
   select id,order_number,customer_id from t_order
  ]]>
 </select> 
 <select id="getAddress" parameterClass="java.lang.Integer" resultMap="addressMap">

注意:这里的参数传递,可以为类,也可以为一般类型
  <![CDATA[
   select id,home_address from t_customer where id = #id#
  ]]>
 </select>  
 
</sqlMap>


测试例子:

package servlet;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import bean.Order;

import bean.User;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.engine.builder.xml.XmlSqlMapClientBuilder;

public class OperateIBatis extends HttpServlet {

 private Logger logger = Logger.getLogger(OperateOrder.class);

调用了log4j日志插件
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doPost(request, response);
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setCharacterEncoding("UTF-8");
  request.setCharacterEncoding("UTF-8");
  response.setContentType("text/html;charset=UTF-8");
  PrintWriter out = response.getWriter();
  
  XmlSqlMapClientBuilder xsmcb = new XmlSqlMapClientBuilder();
  try {
   Reader reader = Resources.getResourceAsReader("sql-map-config.xml");
   SqlMapClient smc = xsmcb.buildSqlMap(reader);
   smc.startTransaction();
   
   Iterator<Order> i = (Iterator<Order>) smc.queryForList("bean.getOrder", null).iterator();
   while(i.hasNext()){
    out.println("<br>===========================================<br>");
    Order o = i.next();
    out.println(o.getOrderNumber() + ">>" + o.getCustomer().getName() + ">>" + o.getCustomer().getSex() + ">>" + o.getCustomer().getHomeAddress().getName());
   }
   smc.commitTransaction();
  } catch (Exception e) {
   logger.debug("读取IBatis配置文件失败",e);
  }
 }
}


 

 

 

 

这里再给出,官方的sql配置的dad文档,有些,属性,可以在这里面查找:不需背诵!!O(∩_∩)O哈哈~


 

 


 

 <?xml version="1.0" encoding="UTF-8" ?>

<!--
   Copyright 2004 Clinton Begin

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
 -->

<!ELEMENT sqlMap (typeAlias* | cacheModel* | resultMap* | parameterMap* | statement* | insert* | update* | delete* | select* | procedure*)+>
<!ATTLIST sqlMap
xmlns:fo CDATA #IMPLIED
namespace CDATA #IMPLIED
>

<!ELEMENT parameterMap (parameter+)>
<!ATTLIST parameterMap
id CDATA #REQUIRED
class CDATA #REQUIRED
>
<!ELEMENT parameter EMPTY>
<!ATTLIST parameter
property CDATA #REQUIRED
javaType CDATA #IMPLIED
jdbcType CDATA #IMPLIED
nullValue CDATA #IMPLIED
mode (IN | OUT | INOUT) #IMPLIED
typeHandler CDATA #IMPLIED
>
<!ELEMENT resultMap (result+)>
<!ATTLIST resultMap
id CDATA #REQUIRED
class CDATA #REQUIRED
extends CDATA #IMPLIED
xmlName CDATA #IMPLIED
>
<!ELEMENT result EMPTY>
<!ATTLIST result
property CDATA #REQUIRED
javaType CDATA #IMPLIED
column CDATA #IMPLIED
columnIndex CDATA #IMPLIED
jdbcType CDATA #IMPLIED
nullValue CDATA #IMPLIED
select CDATA #IMPLIED
typeHandler CDATA #IMPLIED
>
<!ELEMENT cacheModel (flushInterval?, flushOnExecute*, property*)+>
<!ATTLIST cacheModel
id CDATA #REQUIRED
type CDATA #REQUIRED
readOnly (true | false) #IMPLIED
serialize (true | false) #IMPLIED
>
<!ELEMENT flushInterval EMPTY>
<!ATTLIST flushInterval
milliseconds CDATA #IMPLIED
seconds CDATA #IMPLIED
minutes CDATA #IMPLIED
hours CDATA #IMPLIED
>
<!ELEMENT flushOnExecute EMPTY>
<!ATTLIST flushOnExecute
statement CDATA #REQUIRED
>

<!ELEMENT property EMPTY>
<!ATTLIST property
name CDATA #REQUIRED
value CDATA #REQUIRED
>

<!ELEMENT typeAlias EMPTY>
<!ATTLIST typeAlias
alias CDATA #REQUIRED
type CDATA #REQUIRED
>

<!ELEMENT statement (#PCDATA | dynamic | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST statement
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterClass CDATA #IMPLIED
resultMap CDATA #IMPLIED
resultClass CDATA #IMPLIED
cacheModel CDATA #IMPLIED
resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) #IMPLIED
fetchSize CDATA #IMPLIED
xmlResultName CDATA #IMPLIED
>

<!ELEMENT select (#PCDATA | dynamic | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST select
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterClass CDATA #IMPLIED
resultMap CDATA #IMPLIED
resultClass CDATA #IMPLIED
cacheModel CDATA #IMPLIED
resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) #IMPLIED
fetchSize CDATA #IMPLIED
xmlResultName CDATA #IMPLIED
>

<!ELEMENT insert (#PCDATA | selectKey | dynamic | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST insert
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterClass CDATA #IMPLIED
>

<!ELEMENT selectKey (#PCDATA) >
<!ATTLIST selectKey
resultClass CDATA #IMPLIED
keyProperty CDATA #IMPLIED
>

<!ELEMENT update (#PCDATA | dynamic | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST update
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterClass CDATA #IMPLIED
>

<!ELEMENT delete (#PCDATA | dynamic | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST delete
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterClass CDATA #IMPLIED
>

<!ELEMENT procedure (#PCDATA | dynamic | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST procedure
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterClass CDATA #IMPLIED
resultMap CDATA #IMPLIED
resultClass CDATA #IMPLIED
cacheModel CDATA #IMPLIED
xmlResultName CDATA #IMPLIED
>

<!-- - - - - - - - - - - - - - - - - - - - - - - - -
                 DYNAMIC ELEMENTS
  - - - - - - - - - - - - - - - - - - - - - - - - -->

<!ELEMENT dynamic (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST dynamic
prepend CDATA #IMPLIED
>

<!ELEMENT isNotNull (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotNull
prepend CDATA #IMPLIED
property CDATA #IMPLIED
>

<!ELEMENT isNull (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNull
prepend CDATA #IMPLIED
property CDATA #IMPLIED
>

<!ELEMENT isNotPropertyAvailable (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotPropertyAvailable
prepend CDATA #IMPLIED
property CDATA #REQUIRED
>

<!ELEMENT isPropertyAvailable (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isPropertyAvailable
prepend CDATA #IMPLIED
property CDATA #REQUIRED
>

<!ELEMENT isEqual (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isEqual
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>

<!ELEMENT isNotEqual (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotEqual
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>

<!ELEMENT isGreaterThan (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isGreaterThan
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>

<!ELEMENT isGreaterEqual (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isGreaterEqual
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>

<!ELEMENT isLessThan (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isLessThan
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>

<!ELEMENT isLessEqual (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isLessEqual
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>

<!ELEMENT isEmpty (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isEmpty
prepend CDATA #IMPLIED
property CDATA #IMPLIED
>

<!ELEMENT isNotEmpty (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotEmpty
prepend CDATA #IMPLIED
property CDATA #IMPLIED
>

<!ELEMENT isParameterPresent (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isParameterPresent
prepend CDATA #IMPLIED
>

<!ELEMENT isNotParameterPresent (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotParameterPresent
prepend CDATA #IMPLIED
>

<!ELEMENT iterate (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST iterate
prepend CDATA #IMPLIED
property CDATA #IMPLIED
open CDATA #IMPLIED
close CDATA #IMPLIED
conjunction CDATA #IMPLIED
>

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值