mybatis-3-mapper
mybatis返回主键ID(自增和非自增)的两种方式

mybatis返回主键ID(⾃增和⾮⾃增)的两种⽅式⼀.mapper映射⽂件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.mybatis.mapper.TableNameMapper"><!-- 插⼊数据并返回⾃增ID有⾃增ID功能数据库可以采⽤useGeneratedKeys="true"开启判断是否是⾃增IDkeyProperty="id" 指定插⼊数据后⾃增ID返回时赋值给实体类的那个属性(这⾥是id属性)--><insert id="insertData" parameterType="java.util.HashMap" useGeneratedKeys="true" keyProperty="id">insert into tableName values(null,#{name})</insert><!--⾮⾃增主键像Oracle数据库采⽤序列来作为⾃增主键,通过 selectKey⼦来获取主键值MySQL同样适⽤(只是order属性处为after, 因为mysql⾃增完ID后才返回ID值)--><insert id="insertDataAgain"><!--selectKey中resultType属性指定期望主键的返回的数据类型,keyProperty属性指定实体类对象接收该主键的字段名order属性指定执⾏查询主键值SQL语句是在插⼊语句执⾏之前还是之后(可取值:after和before)--><!-- oracle --><selectKey resultType="integer" keyProperty="id" order="BEFORE">SELECT LAST_INSERT_ID()</selectKey><!--<selectKey resultType="integer" keyProperty="id" order="AFTER">SELECT id from tableName order by id desc limit 1</selectKey>-->insert into tableName values(null,#{name})</insert></mapper>注: ORACLE返回主键最好是在插⼊SQL执⾏之前执⾏,也就是order属性值设置为before⼆.mapper接⼝public interface TableNameMapper {//插⼊数据public Integer insertData(Map<String, Object> map);//插⼊数据public Integer insertDataAgain(Map<String, Object> map);}三.如何取到ID当数据添加成功之后,你打印接⼝中传⼊的map,会发现⾥⾯多了⼀个id属性,且值和数据库⾃增的id是⼀模⼀样的,这就是ID返回的实现。
mybatis批量插入三种方式效率比较

mybatis批量插⼊三种⽅式效率⽐较向数据库⾥插⼊10000条数据,分别使⽤三种插⼊⽅式,⽐较三种⽅式效率,第⼀种⽤时3000ms,第⼆种⽤时1500ms,第三种800ms,第三种效率最⾼。
1package com.zhanghw.mybatisbatch;23import er;4import erMapper;5import org.apache.ibatis.session.ExecutorType;6import org.apache.ibatis.session.SqlSession;7import org.junit.Test;8import org.junit.runner.RunWith;9import org.mybatis.spring.SqlSessionTemplate;10import org.springframework.beans.factory.annotation.Autowired;11import org.springframework.boot.test.context.SpringBootTest;12import org.springframework.test.context.junit4.SpringRunner;1314import java.util.ArrayList;15import java.util.List;1617 @RunWith(SpringRunner.class)18 @SpringBootTest19public class MybatisBatchApplicationTests {20 @Autowired21private UserMapper userMapper;2223 @Autowired24private SqlSessionTemplate sqlSessionTemplate;2526/**27 * 通过简单循环批量插⼊28 * @throws Exception29*/30 @Test31public void testInsertBatch1() throws Exception {32long start = System.currentTimeMillis();33for (int i = 0; i < 10000; i++) {34 User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("男").build();35int insert = userMapper.insert(user);36 System.out.println(insert);37 }38long end = System.currentTimeMillis();39 System.out.println("-------时间3188--------" + (start - end) + "---------------");40 }41/**42 * session使⽤批量模式插⼊数据43*/44 @Test45public void testInsertBatch2() {46long start = System.currentTimeMillis();47//跟上述sql区别,将session设置为批量形式48 SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory()49 .openSession(ExecutorType.BATCH, false);50 UserMapper mapper = sqlSession.getMapper(UserMapper.class);51for (int i = 0; i < 10000; i++) {52 User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("男").build();53int insert = mapper.insert(user);54 System.out.println(insert);55 }56 mit();57long end = System.currentTimeMillis();58 System.out.println("----时间1535-----------" + (start - end) + "---------------");59 }6061/**62 * 通过foreach标签完成批量插⼊63*/64 @Test65public void testInsertBatch3() {66long start = System.currentTimeMillis();67 List<User> list = new ArrayList<>();68for (int i = 0; i < 10000; i++) {69 User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("男").build();70 list.add(user);71 }72int i = userMapper.insertBatch(list);73 System.out.println(i);74long end = System.currentTimeMillis();75 System.out.println("----时间824-----------" + (start - end) + "---------------");76 }7778 }对应的mapper:package com.zhanghw.mybatisbatch.mapper;import er;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;import java.util.List;@Mapperpublic interface UserMapper {public int insert(User user);public int insertBatch(@Param("list") List<User> list);}对应mapper的xml配置:1<?xml version="1.0" encoding="UTF-8" ?>2<!DOCTYPE mapper3 PUBLIC "-////DTD Mapper 3.0//EN"4 "/dtd/mybatis-3-mapper.dtd">5<mapper namespace="erMapper">6<insert id="insert">7 INSERT INTO user ( name,password,sex,age)8 VALUES( #{name}, #{password}, #{sex}, #{age})9</insert>1011<insert id="insertBatch" parameterType="er">12 INSERT INTO user (name,password,sex,age)13 VALUES14<foreach collection ="list" item="user" separator =",">15 (#{}, #{user.password}, #{user.sex}, #{user.age})16</foreach >17</insert>18</mapper>特别注意:mysql默认接受sql的⼤⼩是1048576(1M),即第三种⽅式若数据量超过1M会报如下异常:(可通过调整MySQL安装⽬录下的my.ini⽂件中[mysqld]段的"max_allowed_packet = 1M")。
MyBatis中Mapper的返回值类型

MyBatis中Mapper的返回值类型ins e r t、up d ate、d e le te语句的返回值类型对数据库执⾏修改操作时,数据库会返回受影响的⾏数。
在MyBatis(使⽤版本3.4.6,早期版本不⽀持)中insert、update、delete语句的返回值可以是Integer、Long和Boolean。
在定义Mapper接⼝时直接指定需要的类型即可,⽆需在对应的<insert><update><delete>标签中显⽰声明。
对应的代码在 org.apache.ibatis.binding.MapperMethod 类中,如下:对于insert、update、delete语句,MyBatis都会使⽤ rowCountResult ⽅法对返回值进⾏转换;rowCountResult ⽅法会根据Mapper声明中⽅法的返回值类型来对参数进⾏转换;对于返回类型为Boolean的情况,如果返回的值⼤于0,则返回True,否则返回False1public Object execute(SqlSession sqlSession, Object[] args) {2 Object result;3switch (command.getType()) {4case INSERT: {5 Object param = method.convertArgsToSqlCommandParam(args);6 result = rowCountResult(sqlSession.insert(command.getName(), param));7break;8 }9case UPDATE: {10 Object param = method.convertArgsToSqlCommandParam(args);11 result = rowCountResult(sqlSession.update(command.getName(), param));12break;13 }14case DELETE: {15 Object param = method.convertArgsToSqlCommandParam(args);16 result = rowCountResult(sqlSession.delete(command.getName(), param));17break;18 }19case SELECT:20if (method.returnsVoid() && method.hasResultHandler()) {21 executeWithResultHandler(sqlSession, args);22 result = null;23 } else if (method.returnsMany()) {24 result = executeForMany(sqlSession, args);25 } else if (method.returnsMap()) {26 result = executeForMap(sqlSession, args);27 } else if (method.returnsCursor()) {28 result = executeForCursor(sqlSession, args);29 } else {30 Object param = method.convertArgsToSqlCommandParam(args);31 result = sqlSession.selectOne(command.getName(), param);32 }33break;34case FLUSH:35 result = sqlSession.flushStatements();36break;37default:38throw new BindingException("Unknown execution method for: " + command.getName());39 }40if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) {41throw new BindingException("Mapper method '" + command.getName()42 + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ").");43 }44return result;45 }4647private Object rowCountResult(int rowCount) {48final Object result;49if (method.returnsVoid()) {50 result = null;51 } else if (Integer.class.equals(method.getReturnType()) || Integer.TYPE.equals(method.getReturnType())) {52 result = rowCount;53 } else if (Long.class.equals(method.getReturnType()) || Long.TYPE.equals(method.getReturnType())) {54result = (long)rowCount;55 } else if (Boolean.class.equals(method.getReturnType()) || Boolean.TYPE.equals(method.getReturnType())) {56 result = rowCount > 0;57 } else {58throw new BindingException("Mapper method '" + command.getName() + "' has an unsupported return type: " + method.getReturnType());59 }60return result;61 }s e le ct语句的返回值类型对于select语句,必须在Mapper映射⽂件中显⽰声明返回值类型,否则会抛出异常,指出“A query was run and no Result Maps were found for the Mapped Statement”。
Mybatis3详解(四)----SQL映射文件详解(XxxMapper.xml)

Mybatis3详解(四)----SQL映射⽂件详解(XxxMapper.xml)1映射器是Mybatis中最复杂并且是最重要的组件。
它由⼀个接⼝和xml映射⽂件(或者注解)组成。
在映射器中我们可以配置各类SQL、动态SQL、缓存、存储过程、级联等复杂的内容。
并且通过简易的映射规则映射到指定的POJO或者其它对象上,映射器能有效的消除JDBC的底层代码。
在Mybatis的应⽤程序开发中,映射器的开发⼯作量占全部⼯作量的80%,可见其重要性。
映射⽂件的作⽤是⽤来配置SQL映射语句,根据不同的SQL语句性质,使⽤不同的标签,其中常⽤的标签有:<select>、<insert>、<update>、<delete>。
下⾯列出了SQL 映射⽂件的⼏个顶级元素(按照应被定义的顺序列出):元素描述cache该命名空间的缓存配置(会在缓存部分进⾏讲解)cache-ref引⽤其它命名空间的缓存配置resultMap描述如何从数据库结果集中加载对象,它是最复杂也是最强⼤的元素parameterMap定义参数映射。
此元素已被废弃,并可能在将来被移除!请使⽤⾏内参数映射parameType。
所以本⽂中不会介绍此元素sql可被其它语句引⽤的可重⽤语句块select映射查询语句insert映射插⼊语句update映射更新语句delete映射删除语句2select元素表⽰SQL 的select 语句,⽤于查询,⽽查询语句是我们⽇常中⽤的最多的,使⽤的多就意味它有着强⼤和复杂的功能,所以我们先来看看select元素的属性有哪些(加粗为最常⽤的)。
select元素中的属性属性描述id在命名空间中唯⼀的标识符,可以被⽤来引⽤这条语句parameterType将会传⼊这条语句的参数类的完全限定名或别名。
这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传⼊语句的参数,默认值为未设置(unset)parameterMap这是引⽤外部 parameterMap 的已经被废弃的⽅法。
MyBatis的关联映射,resultMap元素之collection子元素,实现多对多关。。。

MyBatis的关联映射,resultMap元素之collection⼦元素,实现多对多关。
MyBatis映射⽂件中的<resultMap>元素中,包含⼀个<collection>⼦元素,MyBatis通过它来处理多对多关联关系。
<collection>⼦元素的⼤部分属性与<association>⼦元素相同,但其还包含⼀个特殊属性——ofType。
ofType属性与javaType属性对应,它⽤于指定实体对象中集合类属性所包含的元素类型。
本⽂是、两篇⽂章的延续,如有配置上的问题,请参考上两篇⽂章。
情景:在实际项⽬开发中,多对多的关联关系是⾮常觉的。
以订单和商品为例,⼀个订单可以包含多种商品,⽽⼀种商品⼜可以属于多个订单,订单和商品就属于多对多的关联关系。
⼀、创建数据结构及插⼊数据(MySQL),注意:请先选择数据库# 创建⼀个名称为tb_product的表CREATE TABLE tb_product(id INT(32) PRIMARY KEY AUTO_INCREMENT,name VARCHAR(32),price DOUBLE);# 插⼊3条数据INSERT INTO tb_product VALUES ('1','Java基础⼊门','44.5');INSERT INTO tb_product VALUES ('2','Java Web程序开发⼊门','38.5');INSERT INTO tb_product VALUES ('3','SSM框架整合实战','50');# 创建⼀个名称为tb_ordersitem 的中间表CREATE TABLE tb_ordersitem(id INT(32) PRIMARY KEY AUTO_INCREMENT,orders_id INT(32),product_id INT(32),FOREIGN KEY(orders_id) REFERENCES tb_orders(id),FOREIGN KEY(product_id) REFERENCES tb_product(id));# 插⼊5条数据INSERT INTO tb_ordersitem VALUES ('1','1','1');INSERT INTO tb_ordersitem VALUES ('2','1','3');INSERT INTO tb_ordersitem VALUES ('3','3','1');INSERT INTO tb_ordersitem VALUES ('4','3','2');INSERT INTO tb_ordersitem VALUES ('5','3','3');⼆、创建实体类Product,并修改Orders实体类package com.itheima.po;import java.util.List;/*** 商品持久化类*/public class Product {private Integer id; //商品idprivate String name; //商品名称private Double price;//商品单价private List<Orders> orders; //与订单的关联属性public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public List<Orders> getOrders() {return orders;}public void setOrders(List<Orders> orders) {this.orders = orders;}@Overridepublic String toString() {return "Product [id=" + id + ", name=" + name+ ", price=" + price + "]";}}package com.itheima.po;import java.util.List;/*** 订单持久化类*/public class Orders {private Integer id; //订单idprivate String number;//订单编号//关联商品集合信息private List<Product> productList;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public List<Product> getProductList() {return productList;}public void setProductList(List<Product> productList) {this.productList = productList;}@Overridepublic String toString() {return "Orders [id=" + id + ", number=" + number + ", productList=" + productList + "]";}}三、创建映射⽂件ProductMapper.xml、OrdersMapper.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.itheima.mapper.ProductMapper"><select id="findProductById" parameterType="Integer"resultType="Product">SELECT * from tb_product where id IN(SELECT product_id FROM tb_ordersitem WHERE orders_id = #{id})</select></mapper><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.itheima.mapper.OrdersMapper"><!-- 多对多嵌套查询:通过执⾏另外⼀条SQL映射语句来返回预期的特殊类型 --><select id="findOrdersWithPorduct" parameterType="Integer"resultMap="OrdersWithProductResult">select * from tb_orders WHERE id=#{id}</select><resultMap type="Orders" id="OrdersWithProductResult"><id property="id" column="id"/><result property="number" column="number"/><collection property="productList" column="id" ofType="Product"select="com.itheima.mapper.ProductMapper.findProductById"></collection></resultMap><!-- 多对多嵌套结果查询:查询某订单及其关联的商品详情 --><select id="findOrdersWithPorduct2" parameterType="Integer"resultMap="OrdersWithPorductResult2">select o.*,p.id as pid,,p.pricefrom tb_orders o,tb_product p,tb_ordersitem oiWHERE oi.orders_id=o.idand oi.product_id=p.idand o.id=#{id}</select><!-- ⾃定义⼿动映射类型 --><resultMap type="Orders" id="OrdersWithPorductResult2"><id property="id" column="id"/><result property="number" column="number"/><!-- 多对多关联映射:collection --><collection property="productList" ofType="Product"><id property="id" column="pid"/><result property="name" column="name"/><result property="price" column="price"/></collection></resultMap></mapper>四、修改MyBatis配置⽂件(mybatis-config.xml),加⼊如下内容:<mapper resource="com/itheima/mapper/OrdersMapper.xml"/><mapper resource="com/itheima/mapper/ProductMapper.xml"/>五、修改测试程序MybatisAssociatedTest.java,加⼊如下内容:可以将findOrdersWithPorduct修改为findOrdersWithPorduct2,其输出仍然是⼀样的。
MyBatis通用Mapper中的通用example(排序)详解

MyBatis通⽤Mapper中的通⽤example(排序)详解⽬录MyBatis通⽤Mapper的通⽤example(排序)接⼝实现类MyBatis通⽤Mapper技巧⼀、排序⼆、处理oracle的null异常三、mapper的selectOne返回值可能是null四、看代码MyBatis通⽤Mapper的通⽤example(排序)Example example = new Example(TerminalType.class);//注意:排序使⽤的是列名example.setOrderByClause("TT_PROVIDERID DESC");//如果需要其他条件//掌机类型名字//条件查询使⽤的是属性名example.createCriteria().andEqualTo("terminalName", "计量现场服务终端");//⼚商id⼤于3// example.createCriteria().andGreaterThan("id",3);List<TerminalType> terminalTypeList = terminalTypeService.selectByExample(example);接⼝/*** 按照指定排序查询集合** @param example - 条件* @return count*/List<T> selectByExample(Object example);实现类@Overridepublic List<T> selectByExample(Object example) {return baseMapper.selectByExample(example);}MyBatis通⽤Mapper技巧⼀、排序错误代码:example.orderBy(BaseEntity.Field.GMTUpdate + " desc");正确⽅式:1、通过注解 @OrderBy(value = "DESC")2、example.setOrderByClause("GMT_UPDATE DESC");注意此处是列名称,不是属性名。
【MyBatis系列3】最全MyBatis中XML映射文件(Mapper)标签分析及示例

【MyBatis系列3】最全MyBatis中XML映射⽂件(Mapper)标签分析及⽰例前⾔MyBatis的强⼤之处就在于它的映射器⽂件,⽽这也正是MyBatis的魔⼒所在,对于任何MyBatis的使⽤者来说,MyBatis的映射⽂件是必须要掌握的。
Mapper⽂件标签Mapper中⼀个提供了9个顶层标签,除了1个已经过期的我们不需要去了解,另外8个都是必须要掌握的,只要熟练掌握了标签的使⽤,使⽤MyBatis才能如鱼得⽔。
接下来我们就⼀个个来分析⼀下这些标签的使⽤。
<cache> – 该命名空间的缓存配置。
<cache-ref> – 引⽤其它命名空间的缓存配置。
<resultMap> – 描述如何从数据库结果集中加载对象,是最复杂也是最强⼤的元素。
<parameterMap> – ⽼式风格的参数映射。
此元素已被废弃,并可能在将来被移除!请使⽤⾏内参数映射。
⽂档中不会介绍此元素。
<sql> – 可被其它语句引⽤的可重⽤语句块。
<insert> – 映射插⼊语句。
<update> – 映射更新语句。
<delete> – 映射删除语句。
<select> – 映射查询语句。
selectselect⽤来映射查询语句,是我们使⽤最多的⼀种标签,也是最复杂的⼀种标签。
⽐如下⾯就是⼀个简单的select标签的使⽤<select id="listUserByUserName" parameterType="String" resultType="lwUser">select user_id,user_name from lw_user where user_name=#{userName}</select>select标签内,提供了⼀些⼆级标签,下⾯就列举出了全部的⼆级标签:<selectid="selectPerson"parameterType="int"parameterMap="deprecated"resultType="hashmap"resultMap="personResultMap"flushCache="false"useCache="true"timeout="10000"fetchSize="256"statementType="PREPARED"resultSetType="FORWARD_ONLY"databaseId="mysql"resultOrdered="false"resultSets="xxx,xxx"lang=""></select>id必选标签。
IDEA中写xml配置文件的时候没有代码提示

IDEA中写 xml配置文件的时候没有代码提示
问题情境:如开发SSM应用的时候,编写xml配置mapper.xml文件没有代码提示,这个问题应该是编写的xml文件中没有找 到需要的dtd文件。 在xml文件中的引入约束的er PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd" > 并且"/dtd/mybatis-3-mapper.dtd"报红,不能简单地忽略,而是要引入资源解决爆红问题 解决方式1:鼠标悬浮在"/dtd/mybatis-3-mapper.dtd"是,点击 alt + enter 选择如图选项:从网上下载该资源
解决方式2:添加本地的dtd约束到项目中
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<?xml version="1.0" encoding="UTF-8" ?><!--此文件为dtdCopyright 2009-2011 The MyBatis TeamLicensed 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/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed 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 andlimitations under the License.--><!ELEMENT mapper (cache-ref | cache | resultMap* | parameterMap* | sql* | insert* | update* | delete* | select* )+><!ATTLIST mapperxmlns:fo CDATA #IMPLIEDnamespace CDATA #IMPLIED><!ELEMENT cache-ref EMPTY><!ATTLIST cache-refnamespace CDATA #REQUIRED><!ELEMENT cache (property*)><!ATTLIST cachetype CDATA #IMPLIEDeviction CDATA #IMPLIEDflushInterval CDATA #IMPLIEDsize CDATA #IMPLIEDreadOnly CDATA #IMPLIED><!ELEMENT parameterMap (parameter+)?><!ATTLIST parameterMapid CDATA #REQUIREDtype CDATA #REQUIRED><!ELEMENT parameter EMPTY><!ATTLIST parameterproperty CDATA #REQUIREDjavaType CDATA #IMPLIEDjdbcType CDATA #IMPLIEDmode (IN | OUT | INOUT) #IMPLIEDresultMap CDATA #IMPLIEDscale CDATA #IMPLIEDtypeHandler CDATA #IMPLIED><!ELEMENT resultMap (constructor?,id*,result*,association*,collection*, discriminator?)> <!ATTLIST resultMapid CDATA #REQUIREDtype CDATA #REQUIREDextends CDATA #IMPLIEDautoMapping (true|false) #IMPLIED><!ELEMENT constructor (idArg*,arg*)><!ELEMENT id EMPTY><!ATTLIST idproperty CDATA #IMPLIEDjavaType CDATA #IMPLIEDcolumn CDATA #IMPLIEDjdbcType CDATA #IMPLIEDtypeHandler CDATA #IMPLIED><!ELEMENT result EMPTY><!ATTLIST resultproperty CDATA #IMPLIEDjavaType CDATA #IMPLIEDcolumn CDATA #IMPLIEDjdbcType CDATA #IMPLIEDtypeHandler CDATA #IMPLIED><!ELEMENT idArg EMPTY><!ATTLIST idArgjavaType CDATA #IMPLIEDcolumn CDATA #IMPLIEDjdbcType CDATA #IMPLIEDtypeHandler CDATA #IMPLIEDselect CDATA #IMPLIEDresultMap CDATA #IMPLIED><!ELEMENT arg EMPTY><!ATTLIST argjavaType CDATA #IMPLIEDcolumn CDATA #IMPLIEDjdbcType CDATA #IMPLIEDtypeHandler CDATA #IMPLIEDselect CDATA #IMPLIEDresultMap CDATA #IMPLIED><!ELEMENT collection (constructor?,id*,result*,association*,collection*, discriminator?)> <!ATTLIST collectionproperty CDATA #REQUIREDcolumn CDATA #IMPLIEDjavaType CDATA #IMPLIEDofType CDATA #IMPLIEDjdbcType CDATA #IMPLIEDselect CDATA #IMPLIEDresultMap CDATA #IMPLIEDtypeHandler CDATA #IMPLIEDnotNullColumn CDATA #IMPLIEDcolumnPrefix CDATA #IMPLIED><!ELEMENT association (constructor?,id*,result*,association*,collection*, discriminator?)> <!ATTLIST associationproperty CDATA #REQUIREDcolumn CDATA #IMPLIEDjavaType CDATA #IMPLIEDjdbcType CDATA #IMPLIEDselect CDATA #IMPLIEDresultMap CDATA #IMPLIEDtypeHandler CDATA #IMPLIEDnotNullColumn CDATA #IMPLIEDcolumnPrefix CDATA #IMPLIED><!ELEMENT discriminator (case+)><!ATTLIST discriminatorcolumn CDATA #IMPLIEDjavaType CDATA #REQUIREDjdbcType CDATA #IMPLIEDtypeHandler CDATA #IMPLIED><!ELEMENT case (constructor?,id*,result*,association*,collection*, discriminator?)><!ATTLIST casevalue CDATA #REQUIREDresultMap CDATA #IMPLIEDresultType CDATA #IMPLIED><!ELEMENT property EMPTY><!ATTLIST propertyname CDATA #REQUIREDvalue CDATA #REQUIRED><!ELEMENT typeAlias EMPTY><!ATTLIST typeAliasalias CDATA #REQUIREDtype CDATA #REQUIRED><!ELEMENT select (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*> <!ATTLIST selectid CDATA #REQUIREDparameterMap CDATA #IMPLIEDparameterType CDATA #IMPLIEDresultMap CDATA #IMPLIEDresultType CDATA #IMPLIEDresultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) #IMPLIED statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIEDfetchSize CDATA #IMPLIEDtimeout CDATA #IMPLIEDflushCache (true|false) #IMPLIEDuseCache (true|false) #IMPLIEDdatabaseId CDATA #IMPLIEDlang CDATA #IMPLIEDresultOrdered (true|false) #IMPLIED><!ELEMENT insert (#PCDATA | selectKey | include | trim | where | set | foreach | choose | if | bind)*><!ATTLIST insertid CDATA #REQUIREDparameterMap CDATA #IMPLIEDparameterType CDATA #IMPLIEDtimeout CDATA #IMPLIEDflushCache (true|false) #IMPLIEDstatementType (STATEMENT|PREPARED|CALLABLE) #IMPLIEDkeyProperty CDATA #IMPLIEDuseGeneratedKeys (true|false) #IMPLIEDkeyColumn CDATA #IMPLIEDdatabaseId CDATA #IMPLIEDlang CDATA #IMPLIED><!ELEMENT selectKey (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*> <!ATTLIST selectKeyresultType CDATA #IMPLIEDstatementType (STATEMENT|PREPARED|CALLABLE) #IMPLIEDkeyProperty CDATA #IMPLIEDorder (BEFORE|AFTER) #IMPLIEDdatabaseId CDATA #IMPLIED><!ELEMENT update (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*><!ATTLIST updateid CDATA #REQUIREDparameterMap CDATA #IMPLIEDparameterType CDATA #IMPLIEDtimeout CDATA #IMPLIEDflushCache (true|false) #IMPLIEDstatementType (STATEMENT|PREPARED|CALLABLE) #IMPLIEDdatabaseId CDATA #IMPLIEDlang CDATA #IMPLIED><!ELEMENT delete (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*><!ATTLIST deleteid CDATA #REQUIREDparameterMap CDATA #IMPLIEDparameterType CDATA #IMPLIEDtimeout CDATA #IMPLIEDflushCache (true|false) #IMPLIEDstatementType (STATEMENT|PREPARED|CALLABLE) #IMPLIEDdatabaseId CDATA #IMPLIEDlang CDATA #IMPLIED><!-- Dynamic --><!ELEMENT include EMPTY><!ATTLIST includerefid CDATA #REQUIRED><!ELEMENT bind EMPTY><!ATTLIST bindname CDATA #REQUIREDvalue CDATA #REQUIRED><!ELEMENT sql (#PCDATA | include | trim | where | set | foreach | choose | if)*><!ATTLIST sqlid CDATA #REQUIREDlang CDATA #IMPLIEDdatabaseId CDATA #IMPLIED><!ELEMENT trim (#PCDATA | include | trim | where | set | foreach | choose | if)*><!ATTLIST trimprefix CDATA #IMPLIEDprefixOverrides CDATA #IMPLIEDsuffix CDATA #IMPLIEDsuffixOverrides CDATA #IMPLIED><!ELEMENT where (#PCDATA | include | trim | where | set | foreach | choose | if)*> <!ELEMENT set (#PCDATA | include | trim | where | set | foreach | choose | if)*><!ELEMENT foreach (#PCDATA | include | trim | where | set | foreach | choose | if)*> <!ATTLIST foreachcollection CDATA #REQUIREDitem CDATA #IMPLIEDindex CDATA #IMPLIEDopen CDATA #IMPLIEDclose CDATA #IMPLIEDseparator CDATA #IMPLIED><!ELEMENT choose (when* , otherwise?)><!ELEMENT when (#PCDATA | include | trim | where | set | foreach | choose | if)*><!ATTLIST whentest CDATA #REQUIRED><!ELEMENT otherwise (#PCDATA | include | trim | where | set | foreach | choose | if)*><!ELEMENT if (#PCDATA | include | trim | where | set | foreach | choose | if)*><!ATTLIST iftest CDATA #REQUIRED>。