mybatis-3-mapper

合集下载

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

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批量插入三种方式效率比较

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的返回值类型

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)

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映射⽂件中的<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的通⽤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系列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配置mapperxml文件没有代码提示这个问题应该是编写的xml文件中没有找到需要的dtd文件
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约束到项目中

MyBatis3用户指南中文版

MyBatis3用户指南中文版
1. SqlSessionFactoryBuilder..................................................................................................7 2. SqlSessionFactory............................................................................................................ 7 3. SqlSession....................................................................................................................... 7 4. Mapper 实例................................................................................................................... 8 第三章 Mapper 的 XML 配置文件........................................................................................................ 9 一、属性(properties)................................................................................................................. 9 二、设置(settings).............

使用MyBatis的mapper接口调用时有哪些要求?

使用MyBatis的mapper接口调用时有哪些要求?

使用MyBatis的mapper接口调用时有哪些要求?在使用 MyBatis 的 Mapper 接口调用时,有一些要求和约定,以确保正确地配置和使用。

以下是使用 MyBatis 的 Mapper 接口时的一些常见要求:接口命名规范:Mapper 接口的命名应该与对应的XML 配置文件的namespace 一致。

接口的方法名应该与 XML 配置文件中的 SQL 语句的 id 一致。

javaCopy code// UserMapper.javapublic interface UserMapper {User getUserById(Long id);}xmlCopy code<!-- UserMapper.xml --><mapper namespace="erMapper"><select id="getUserById" parameterType="Long" resultType="er">SELECT * FROM users WHERE id = #{id}</select></mapper>方法参数和返回值:Mapper 接口的方法参数和返回值应该与XML 配置文件中SQL 语句的参数类型和结果类型相匹配。

javaCopy code// UserMapper.javapublic interface UserMapper {User getUserById(Long id);}xmlCopy code<!-- UserMapper.xml --><mapper namespace="erMapper"><select id="getUserById" parameterType="Long" resultType="er">SELECT * FROM users WHERE id = #{id}</select></mapper>注解使用:如果使用注解方式配置SQL 语句,确保在MyBatis 配置文件中启用了注解。

Mybatis3

Mybatis3

Mybatis笔记1、环境配置:可以配置多个环境,一般来说,可以有三个环境,分别是开发、测试以及正式环境,每一个环境都可以单独配置。

2、Mybatis的事务管理器:Mybatis支持两种事务管理器,一种是jdbc就是利用应用程序管理事物(数据库的生命周期),另一种是managed(托管),这种是利用应用服务器来管理,这种是商业服务器才有的功能,Tomcat是没有的。

3、配置数据源:①首先引入属性文件,和以前Spring一样:②设置dataSource:<!-- 配置数据源 --><dataSource type="pooled"><property name="driver" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/> </dataSource>dataSource的类型一共有以下几种:①unpooled 不使用连接池,就是原生的数据库连接,每次出现一个请求都会请求一个数据库链接,用完后马上关闭。

②pooled 使用连接池③jndi使用应用服务器通过jndi获取数据库连接。

4、配置别名:<!-- 配置别名 --><typeAliases><!-- <typeAlias type="Student" alias="model.Student"/> --><!-- 这种才是最好的 --><package name="model"/></typeAliases>应该使用下面的package的方式,这样的话整个包下面的类都不用加完整的路径名了,否则的话有一百个类,还要写100个?千万注意,这个的配置一定要放在环境配置之前,fuck5、配置映射文件:和配置别名的原因都是一样的。

关于Mybatis的@Param注解及mybatisMapper中各种传递参数的方法

关于Mybatis的@Param注解及mybatisMapper中各种传递参数的方法

关于Mybatis的@Param注解及mybatisMapper中各种传递参数的⽅法关于Mybatis的@Param注解Mybatis 作为⼀个轻量级的数据持久化框架,⽬前(2018)的应⽤⾮常⼴泛,基本可以取代Hibernate。

关于 @param 这个注解的使⽤,作者这⾥整理了⼀些笔记。

关于Mybatis @Param 注解,官⽅⽂档:其中关于 @param部分的说明是:@Param Parameter N/A 如果你的映射器的⽅法需要多个参数, 这个注解可以被应⽤于映射器的⽅法参数来给每个参数⼀个名字。

否则,多参数将会以它们的顺序位置来被命名 (不包括任何 RowBounds 参数) ⽐如。

#{param1} , #{param2} 等 , 这是默认的。

使⽤ @Param(“person”),参数应该被命名为 #{person}。

也就是说如果有多个参数的时候,可以使⽤@Param 这个注解,但是不是⼀定需要⽤到 @Param 这个注解呢?作者在这⾥列出以下⼏种情景1.传递单个参数,不使⽤ @Param 注解代码如下:DAO 层CommodityDao.javapackage com.ljq.cs.dao;/*** @description: 商品信息 DAO 接⼝* @author: lujunqiang* @email: flying9001@* @date: 2017/12/17*/@Repositorypublic interface CommodityDao {// 查询某⼀件商品Commodity queryOne(Commodity commodity);// 省略其他⽅法}Mapper ⽂件: commoditymapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="modityDao" ><select id="queryOne" resultType="Commodity">select *from t_commodity comwhere id = #{id}</select></mapper>这⾥只有⼀个参数,java 接⼝不使⽤ @Param 注解,同时 mapper ⽂件也不需要使⽤ parameterType 这个参数,Mybatis会根据实体类(entity)的类型⾃动识别并匹配javaBean(这⼀部分在 spring配置⽂件关于数据源那⼀部分)2.传递单个参数,使⽤@Param注解代码如下:DAO 层CommodityDao.javapackage com.ljq.cs.dao;/*** @description: 商品信息 DAO 接⼝* @author: lujunqiang* @email: flying9001@* @date: 2017/12/17*/@Repositorypublic interface CommodityDao {// 查询某⼀件商品Commodity queryOne(@Param("commodity")Commodity commodity);// 省略其他⽅法}Mapper ⽂件: commoditymapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="modityDao" ><select id="queryOne" parameterType="modity" resultType="Commodity">select *from t_commodity comwhere id = #{commodity.id}</select></mapper>当使⽤javaBean作为对象的时候,在写 SQL 语句的时候,必须指定参数类型parameterType="modity",同时在#{ }取值的时候不能直接填⼊javaBean的属性,必须这样使⽤commodity.id ;否则,会抛出参数类型不匹配异常如果不是javaBean,则需要在写 SQL 语句的时候, #{ }中的属性必须与 @Param中定义的⼀致,eg: @Param("username") , #{username} ,这样才可以3.传递多个参数,使⽤ @Param 注解为了精简代码,作者这⾥只写关键部分DAO 层, UserInfoDao.java// ⽤户登录UserInfo signin(@Param("account")String account,@Param("passcode")String passcode);mapper⽂件userInfomapper.xml<!-- ⽤户登录 --><select id="signin" resultType="UserInfo">select *from t_userinfo infowhere account=#{account} and passcode=#{passcode}</select>这⾥ @Param 中定义的变量名必须和 mapper 中保持⼀致才可以4.传递多个参数,不使⽤ @Param 注解其实从第⼀种场景中已经可以实现传递多个参数了,即把多个参数封装到⼀个javaBean中就可以实现了,但是如果是两个或者多个javaBean 的时候,可以通过使⽤@Param注解的⽅式来实现,但是需要把每个javaBean中的属性全部拆分出来,这样就增加了巨⼤的代码量,因此不推荐这么做那么有没有可以不使⽤@Param注解,同样也可以传递多个参数(尤其是多个javaBean)呢?答案是有的,废话不多说,直接上代码同上,这⾥只贴出关键部分DAO 层, UserInfoDao.java// 搜索⽤户,对结果进⾏分页List searchUser(Map<String,Object>);使⽤DAO,UserService.javaUserInfo userInfo = new UserInfo();Pagination page = new Pagination();Map<String,Object> map = new HashMap<>;map.put("userInfo",userInfo);pam.put("page",page);userService.searchUser(map);mapper⽂件userInfomapper.xml<select id="searchUser" parameterType="java.util.Map" resultType="UserInfo">select *from t_userinfo userwhere 1 =1<if test="user.uname != null and ''!= user.uname ">and user.uname like '%${userInfo.uname}$%'</if><if test="page.order != null and page.order == 10" >order by user.id asc</if>limit ${page.pagenum * page.limitnum}, #{page.limitnum}</select>作者通过上边的4种情况,主要是为了说明,Mybatis⽆论是传单个参数,还是传递多个参数,没有必要使⽤@Param注解啊使⽤@param 注解增添了不少代码不说,还容易导致错误,尤其是在 mapper ⽂件中(paraterType属性)以上只是作者的列举的部分代码,源码请看这⾥:。

6、MyBatis的SQL映射(mapper)文件

6、MyBatis的SQL映射(mapper)文件

6、MyBatis的SQL映射(mapper)⽂件学习资源:动⼒节点⽬录MyBatis 的真正强⼤在于它的映射语句,也是它的魔⼒所在。

由于它的异常强⼤,映射器的 XML ⽂件就显得相对简单。

如果拿它跟具有相同功能的 JDBC 代码进⾏对⽐,你会⽴即发现省掉了将近 95% 的代码。

MyBatis 就是针对 SQL 构建的,并且⽐普通的⽅法做的更好。

SQL 映射⽂件有很少的⼏个顶级元素(按照它们应该被定义的顺序):cache:给定命名空间的缓存配置。

cache-ref:其他命名空间缓存配置的引⽤。

resultMap – 是最复杂也是最强⼤的元素,⽤来描述如何从数据库结果集中来加载对象。

parameterMap:已废弃!⽼式风格的参数映射。

sql:可被其他语句引⽤的可重⽤语句块。

详见:insert:映射插⼊语句update:映射更新语句delete:映射删除语句select:映射查询语1、指定约束⽂件mybatis-3-mapper.dtd 是约束⽂件的名称,扩展名是 dtd。

<!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd">约束⽂件作⽤:限制和检查在当前⽂件中出现的标签,属性必须符合 MyBatis 的要求。

2、Mapper标签<mapper> 标签是 SQL 映射⽂件的根标签,对应 dao 包下的⼀个接⼝,在这个标签内部使⽤ sql 对应实现 dao 接⼝中的⽅法即可。

<mapper namespace="">CRUD操作<mapper>namespace意为命名空间,是<mapper>标签的⼀个属性,⽤于绑定连接 SQL 映射⽂件和 dao 接⼝。

⼀个 dao 接⼝对应⼀个 SQL 映射⽂件,所以为了区分不同的 dao 接⼝,命名空间要求是唯⼀的,推荐使⽤ dao 接⼝的全限定名称(可以⾃定义)。

Mybatis中接口和对应的mapper文件位置配置详解

Mybatis中接口和对应的mapper文件位置配置详解

Mybatis中接⼝和对应的mapper⽂件位置配置详解Mybatis中接⼝和对应的mapper⽂件位置配置详解原链接为:https:///fanfanzk1314/article/details/71480954今天遇到⼀个问题是mybatis中接⼝和对应的mapper⽂件位置不同,⽽引起的操作也会不同,在⽹上找了好久最终找到了⽅法,这⾥就简单的解析⼀下:我们知道在典型的maven⼯程中,⽬录结构有:src/main/java和src/main/resources,前者是⽤来存放java源代码的,后者则是存放⼀些资源⽂件,⽐如配置⽂件等.Mybatis中接⼝和对应的mapper⽂件不⼀定要放在同⼀个包下,如果放在⼀起的⽬的是为了Mybatis进⾏⾃动扫描,并且要注意此时Java 接⼝的名称和mapper⽂件的名称要相同,否则会报异常,由于此时Mybatis会⾃动解析对应的接⼝和相应的配置⽂件,所以就不需要配置mapper⽂件的位置了。

1:接⼝和⽂件放在同⼀个包中如下:在默认的情况下maven打包的时候,对于src/main/java⽬录只打包源代码,⽽不会打包其他⽂件。

所以此时如果把对应的mapper⽂件放到src/main/java⽬录下时,不会打包到最终的jar⽂件夹中,也不会输出到target⽂件夹中,由于在进⾏单元测试的时候执⾏的是/target⽬录下/test-classes下的代码,所以在测试的时候也不会成功。

为了实现在maven默认环境下打包时,Mybatis的接⼝和mapper⽂件在同⼀包中,可以通过将接⼝⽂件放在src/main/java某个包中,⽽在src/main/resources⽬录中建⽴同样的包,这是⼀种约定优于配置的⽅式,这样在maven打包的时候就会将src/main/java和src/main/resources相同包下的⽂件合并到同⼀包中。

在默认maven打包的环境下,不要将接⼝⽂件和mapper⽂件全部放到src/main/java,这样也不会把mapper⽂件打包进去在src/main/java和src/main/resources中相同的包名,相同的⽂件名,默认打包后的结构如下:发现打包之后已经到同⼀个包下了。

Mybatis3中文文档

Mybatis3中文文档

Mybatis3中⽂⽂档⼊门安装要使⽤ MyBatis,只需将⽂件置于类路径(classpath)中即可。

如果使⽤ Maven 来构建项⽬,则需将下⾯的依赖代码置于 pom.xml ⽂件中:<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version></dependency>从 XML 中构建 SqlSessionFactory每个基于 MyBatis 的应⽤都是以⼀个 SqlSessionFactory 的实例为核⼼的。

SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。

⽽ SqlSessionFactoryBuilder 则可以从 XML 配置⽂件或⼀个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

从 XML ⽂件中构建 SqlSessionFactory 的实例⾮常简单,建议使⽤类路径下的资源⽂件进⾏配置。

但也可以使⽤任意的输⼊流(InputStream)实例,⽐如⽤⽂件路径字符串或 file:// URL 构造的输⼊流。

MyBatis 包含⼀个名叫 Resources 的⼯具类,它包含⼀些实⽤⽅法,使得从类路径或其它位置加载资源⽂件更加容易。

String resource = "org/mybatis/example/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);XML 配置⽂件中包含了对 MyBatis 系统的核⼼设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作⽤域和控制⽅式的事务管理器(TransactionManager)。

MyBatis的mapper文件的写法

MyBatis的mapper文件的写法

MyBatis的mapper⽂件的写法1.插⼊1<mapper namespace="需要实现接⼝的全类名">2<insert id="需要实现的接⼝⾥的⽅法名" parameterType="⽅法参数类型,如果是对象要写全类名">3 INSERT sql命令(命令⾥通过#{}获取对象属性)4<!--注意属性名区分⼤⼩写 -->5</insert>6<mapper>⽰例:1<mapper namespace="com.mlj.dao.PersonDao">2<insert id="insertPerson" parameterType="com.mlj.entity.Prac_Person">3 INSERT INTO PRAC_PERSON(p_NAME,P_PASSWORD) VALUES(#{name},#{password})4</insert>5</mapper>2.查询<select id="⽅法名" parameterType="⽅法参数类型" resultType="⽅法返回值类型,全类名">SELECT 表⾥字段名 AS 结果字段名 FROM 表名 WHERE 条件<!--注意:结果字段名与属性名保持⼀致,区分⼤⼩写--></select>⽰例:<resultMap type="Address" id="address"><result column="A_PERSON" property="personId"/><result column="A_ADDRESS" property="address"/><result column="A_NUMBER" property="number"/></resultMap><select id="selectAddressByPersonId"parameterType="ng.String" resultMap="address">SELECT * FROM PRAC_ADDRESS LEFT JOIN PRAC_PERSON ON A_PERSON=#{personId} AND PRAC_ADDRESS.A_PERSON=PRAC_PERSON.P_ID </select>3.修改<update id="updatePersonInformation" parameterType="com.mlj.entity.Prac_Person">UPDATE PRAC_PERSON SET P_NAME=#{name},P_PASSWORD=#{password} WHERE P_ID=#{id}<!-- 属性字段名区分⼤⼩写 --></update>4.删除<delete id="deletePerson" parameterType="ng.Integer">DELETE FROM PRAC_PERSON WHERE P_ID=#{id}</delete>完整的mapper⽂件⽰例<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd"><mapper namespace="modityCategoryManager"><cache-ref namespace="com.hzcominfo.dataggr.cloud"/><insert id="insertCommodityCategoryManager" parameterType="modityCategoryManager" keyProperty="id">INSERT INTO COMMODITY_CATEGORY_MANAGER (<include refid="fields"/>) VALUES (<include refid="values"/>)</insert><update id="updateCommodityCategoryManager" parameterType="modityCategoryManagerKey">UPDATE COMMODITY_CATEGORY_MANAGER<include refid="set"/><include refid="where"/></update><update id="deleteCommodityCategoryManager" parameterType="modityCategoryManagerKey">DELETE FROM COMMODITY_CATEGORY_MANAGER <include refid="where"/></update><select id="selectCommodityCategoryManager" parameterType="String"resultType="modityCategoryManager">SELECT * FROM COMMODITY_CATEGORY_MANAGER <include refid="where"/></select><select id="selectCommodityCategoryManagerByCriteria" parameterType="net.butfly.albacore.dbo.criteria.Criteria"resultType="modityCategoryManagerKey">SELECT CATEGORY_ID, USER_ID FROM COMMODITY_CATEGORY_MANAGER <include refid="where"/></select><select id="countCommodityCategoryManagerByCriteria" parameterType="net.butfly.albacore.dbo.criteria.Criteria"resultType="long">SELECT count(*) FROM COMMODITY_CATEGORY_MANAGER <include refid="where"/> </select><sql id="fields"><if test="categoryId!=null">CATEGORY_ID</if><if test="userId!=null">,USER_ID</if></sql><sql id="values"><if test="categoryId!=null">#{categoryId}</if><if test="userId!=null">,#{userId}</if></sql><sql id="set"><set><trim prefix="" prefixOverrides=","><if test="categoryId!=null">,CATEGORY_ID=#{categoryId}</if><if test="userId!=null">,USER_ID=#{userId}</if></trim></set></sql><sql id="where"><where><trim prefix="" prefixOverrides="and|or"><if test="categoryId!=null">AND CATEGORY_ID=#{categoryId}</if><if test="userId!=null">AND USER_ID=#{userId}</if></trim></where></sql></mapper>。

MyBatis子查询

MyBatis子查询

MyBatis⼦查询⼀、⽗查询BaseChildResultMap:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.dayhr.web.module.hr.td.elearn.mapper.TrainerMapper"><!-- 表中字段 --><resultMap id="BaseResultMap" type="com.dayhr.web.module.hr.td.elearn.model.Trainer"><id column="id" property="id" jdbcType="CHAR"/><result column="name" property="name" jdbcType="VARCHAR"/><result column="title" property="title" jdbcType="VARCHAR"/><result column="recommend" property="recommend" jdbcType="INTEGER"/><result column="trainer_type_id" property="trainerTypeId" jdbcType="CHAR"/><result column="phone" property="phone" jdbcType="VARCHAR"/><result column="email" property="email" jdbcType="VARCHAR"/><result column="address" property="address" jdbcType="VARCHAR"/><result column="pro_field" property="proField" jdbcType="VARCHAR"/><result column="intro" property="intro" jdbcType="VARCHAR"/><result column="head_img" property="headImg" jdbcType="VARCHAR"/><result column="labels" property="labels" jdbcType="VARCHAR"/><result column="corp_id" property="corpId" jdbcType="INTEGER"/><result column="creater_id" property="createrId" jdbcType="INTEGER"/><result column="create_time" property="createTime" jdbcType="TIMESTAMP"/><result column="modifier_id" property="modifierId" jdbcType="INTEGER"/><result column="modify_time" property="modifyTime" jdbcType="TIMESTAMP"/></resultMap><!-- 返回页⾯Bean --><resultMap id="BaseResultRespMap" type="com.dayhr.web.module.hr.td.elearn.response.TrainerResp"><id column="id" property="id" jdbcType="CHAR"/><result column="name" property="name" jdbcType="VARCHAR"/><result column="title" property="title" jdbcType="VARCHAR"/><result column="recommend" property="recommend" jdbcType="INTEGER"/><result column="trainer_type_id" property="trainerTypeId" jdbcType="CHAR"/><result column="phone" property="phone" jdbcType="VARCHAR"/><result column="email" property="email" jdbcType="VARCHAR"/><result column="address" property="address" jdbcType="VARCHAR"/><result column="pro_field" property="proField" jdbcType="VARCHAR"/><result column="intro" property="intro" jdbcType="VARCHAR"/><result column="head_img" property="headImg" jdbcType="VARCHAR"/><result column="labels" property="labels" jdbcType="VARCHAR"/><result column="corp_id" property="corpId" jdbcType="INTEGER"/><result column="creater_id" property="createrId" jdbcType="INTEGER"/><result column="create_time" property="createTime" jdbcType="TIMESTAMP"/><result column="modifier_id" property="modifierId" jdbcType="INTEGER"/><result column="modify_time" property="modifyTime" jdbcType="TIMESTAMP"/><result column="trainerTypeName" property="trainerTypeName"/><result column="trainerLabels" property="trainerLabels"/></resultMap><!-- ⼦查询 --><resultMap id="BaseChildResultMap" type="com.dayhr.web.module.hr.td.elearn.response.TrainerResp" extends="BaseResultRespMap"> <collection property="trainerLabels"ofType="com.dayhr.web.module.hr.td.elearn.response.TrainerLabelResp"select="com.dayhr.web.module.hr.td.elearn.mapper.TrainerLabelMapper.selecLabels" column="labels"> </collection></resultMap><!-- 表中基础字段 --><sql id="Base_Column_List">t.id, , t.title, t.recommend, t.trainer_type_id, AS trainerTypeName,t.phone, t.email, t.address, t.pro_field, t.intro, t.head_img, bels, t.corp_id,t.creater_id, t.create_time, t.modifier_id, t.modify_time</sql><!-- 查询条件 --><sql id="select_Where_Clause"><where>1=1<if test="id != null and id != ''">AND t.id = #{id }</if><if test="name != null and name != ''">AND like CONCAT('%',#{name },'%' )<if test="corpId != null and corpId != ''">AND corp_id = #{corpId }</if><if test="trainerTypeId != null and trainerTypeId != ''">AND t.trainer_type_id = #{trainerTypeId }</if><if test="orderBy != null and orderBy != ''">ORDER BY ${orderBy } ${sortType }</if></where></sql><delete id="deleteByPrimaryKey" parameterType="ng.String">delete from t_hr_td_trainerwhere id = #{id }</delete><insert id="insert" parameterType="com.dayhr.web.module.hr.td.elearn.model.Trainer" useGeneratedKeys="true" keyProperty="id"> insert into t_hr_td_trainer (id, name, title,recommend, trainer_type_id, phone,email, address, pro_field,intro, head_img, labels,corp_id, creater_id, create_time,modifier_id, modify_time)values (#{id,jdbcType=CHAR}, #{name,jdbcType=VARCHAR}, #{title,jdbcType=VARCHAR},#{recommend,jdbcType=INTEGER}, #{trainerTypeId,jdbcType=CHAR}, #{phone,jdbcType=VARCHAR},#{email,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR}, #{proField,jdbcType=VARCHAR},#{intro,jdbcType=VARCHAR}, #{headImg,jdbcType=VARCHAR}, #{labels,jdbcType=VARCHAR},#{corpId,jdbcType=INTEGER}, #{createrId,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP},#{modifierId,jdbcType=INTEGER}, #{modifyTime,jdbcType=TIMESTAMP})</insert><update id="updateByPrimaryKey" parameterType="com.dayhr.web.module.hr.td.elearn.model.Trainer">UPDATE t_hr_td_trainer<set><if test="name != null and name != ''">name = #{name },</if><if test="title != null and title != ''">title = #{title },</if><if test="recommend != null and recommend != ''">recommend = #{recommend },</if><if test="trainerTypeId != null and trainerTypeId != ''">trainer_type_id = #{trainerTypeId },</if><if test="phone != null and phone != ''">phone = #{phone },</if><if test="email != null and email != ''">email = #{email },</if><if test="address != null and address != ''">address = #{address },</if><if test="proField != null and proField != ''">pro_field = #{proField },</if><if test="intro != null and intro != ''">intro = #{intro },</if><if test="headImg != null and headImg != ''">head_img = #{headImg },</if><if test="labels != null and labels != ''">labels = #{labels },</if><if test="corpId != null and corpId != ''">corp_id = #{corpId },</if><if test="createrId != null and createrId != ''">creater_id = #{createrId },</if><if test="createTime != null and createTime != ''">create_time = #{createTime },</if><if test="modifierId != null and modifierId != ''">modifier_id = #{modifierId },</if><if test="modifyTime != null and modifyTime != ''">modify_time = #{modifyTime }</if>WHERE id = #{id }</update><select id="selectByPrimaryKey" resultMap="BaseChildResultMap" parameterType="ng.String">SELECT<include refid="Base_Column_List"/>FROM t_hr_td_trainer tLEFT JOIN t_hr_td_trainertype t1 ON t.trainer_type_id = t1.idWHERE t.id = #{id }</select><select id="selectAll" resultMap="BaseResultMap">selectid, name, title, recommend, trainer_type_id, phone, email, address, pro_field,intro, head_img, labels, corp_id, creater_id, create_time, modifier_id, modify_timefrom t_hr_td_trainer</select><select id="selectListByCondition" parameterType="com.dayhr.web.module.hr.td.elearn.param.TrainerQueryParam" resultMap="BaseChildResultMap"> SELECT<include refid="Base_Column_List"/>FROM t_hr_td_trainer tLEFT JOIN t_hr_td_trainertype t1 ON t.trainer_type_id = t1.id<include refid="select_Where_Clause"/></select></mapper>⼆:⼦查询id="selecLabels":注意此处value对应⽗查询结果中labels:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.dayhr.web.module.hr.td.elearn.mapper.TrainerLabelMapper"><!-- 对应表中字段 --><resultMap id="BaseResultMap" type="com.dayhr.web.module.hr.td.elearn.model.TrainerLabel"><id column="id" property="id"/><result column="trainer_label" property="trainerLabel" jdbcType="VARCHAR"/><result column="built_in" property="builtIn" jdbcType="INTEGER"/><result column="corp_id" property="corpId" jdbcType="INTEGER"/><result column="creater_id" property="createrId" jdbcType="INTEGER"/><result column="creater_time" property="createrTime" jdbcType="TIMESTAMP"/><result column="modifier_id" property="modifierId" jdbcType="INTEGER"/><result column="modify_time" property="modifyTime" jdbcType="TIMESTAMP"/></resultMap><!-- 返回字段 --><resultMap id="BaseResultRespMap" type="com.dayhr.web.module.hr.td.elearn.response.TrainerLabelResp"><id column="id" property="id"/><result column="trainer_label" property="trainerLabel" jdbcType="VARCHAR"/><result column="built_in" property="builtIn" jdbcType="INTEGER"/><result column="corp_id" property="corpId" jdbcType="INTEGER"/><result column="creater_id" property="createrId" jdbcType="INTEGER"/><result column="creater_time" property="createrTime" jdbcType="TIMESTAMP"/><result column="modifier_id" property="modifierId" jdbcType="INTEGER"/><result column="modify_time" property="modifyTime" jdbcType="TIMESTAMP"/><result column="labels" property="labels"/></resultMap><!-- 表中基础字段 --><sql id="Base_Column_List">id, trainer_label, built_in, corp_id, creater_id, creater_time, modifier_id, modify_time</sql><!-- 查询条件 --><sql id="select_Where_Clause"><where>1=1<if test="id != null and id != ''">AND id = #{id }</if><if test="corpId != null and corpId != ''">AND corp_id = #{corpId }</if><if test="trainerLabel != null and trainerLabel != ''">AND trainer_label like CONCAT('%',#{trainerLabel },'%' )</if>ORDER BY ${orderBy } ${sortType }</if></where></sql><delete id="deleteByPrimaryKey" parameterType="ng.String">delete from t_hr_td_trainerlabelwhere id = #{id,jdbcType=CHAR}</delete><insert id="insert" parameterType="com.dayhr.web.module.hr.td.elearn.model.TrainerLabel" useGeneratedKeys="true" keyProperty="id">insert into t_hr_td_trainerlabel (id, trainer_label, built_in, corp_id,creater_id, creater_time, modifier_id,modify_time)values (#{id },#{trainerLabel,jdbcType=VARCHAR}, #{builtIn,jdbcType=INTEGER}, #{corpId,jdbcType=INTEGER},#{createrId,jdbcType=INTEGER}, #{createrTime,jdbcType=TIMESTAMP}, #{modifierId,jdbcType=INTEGER},#{modifyTime,jdbcType=TIMESTAMP})</insert><update id="updateByPrimaryKey" parameterType="com.dayhr.web.module.hr.td.elearn.model.TrainerLabel">UPDATE t_hr_td_trainerlabel<set><if test="trainerLabel != null and trainerLabel != ''">trainer_label = #{trainerLabel },</if><if test="builtIn != null and builtIn != ''">built_in = #{builtIn },</if><if test="corpId != null and corpId != ''">corp_id = #{corpId },</if><if test="createrId != null and createrId != ''">creater_id = #{createrId },</if><if test="createTime != null and createTime != ''">create_time = #{createTime },</if><if test="modifierId != null and modifierId != ''">modifier_id = #{modifierId },</if><if test="modifyTime != null and modifyTime != ''">modify_time = #{modifyTime }</if></set>WHERE id = #{id }</update><select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="ng.String">selectid, trainer_label, built_in, corp_id, creater_id, creater_time, modifier_id, modify_timefrom t_hr_td_trainerlabelwhere id = #{id }</select><select id="selectAll" resultMap="BaseResultMap">selectid, trainer_label, built_in, corp_id, creater_id, creater_time, modifier_id, modify_timefrom t_hr_td_trainerlabel</select><!-- 验证标签是否存在 --><select id="checkLabel" parameterType="com.dayhr.web.module.hr.td.elearn.param.TrainerLabelQueryParam" resultType="Integer">SELECT COUNT(*)FROM t_hr_td_trainerlabel<include refid="select_Where_Clause"/></select><!-- 按条件查询标签 --><select id="selectLabelList" resultMap="BaseResultRespMap" parameterType="com.dayhr.web.module.hr.td.elearn.param.TrainerLabelQueryParam"> SELECT<include refid="Base_Column_List"/>FROM t_hr_td_trainerlabel<include refid="select_Where_Clause"/></select><!-- ⼦查询 in()会报错,加'0'处理 --><select id="selecLabels" resultMap="BaseResultRespMap">selectid, trainer_label, built_in, corp_id, creater_id, creater_time, modifier_id, modify_timefrom t_hr_td_trainerlabelwhere id in ('0' <if test="value != null and value.length !=0"></if> )</select> </mapper>。

MyBatisPlus将查询结果封装到指定实体的方法步骤

MyBatisPlus将查询结果封装到指定实体的方法步骤

MyBatisPlus将查询结果封装到指定实体的⽅法步骤思路⾃定义⽅法,使⽤Wrapper,⾃定义映射结果集Mapper接⼝package com.mozq.boot.mpsand01.dao;import com.baomidou.mybatisplus.core.conditions.Wrapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.baomidou.mybatisplus.core.toolkit.Constants;import com.mozq.boot.mpsand01.pojo.OrderInfo;import com.mozq.boot.mpsand01.vo.OrderVO;import org.apache.ibatis.annotations.*;import java.util.List;@Mapperpublic interface OrderInfoDao extends BaseMapper<OrderInfo> {@Select("select * from order_info ${ew.customSqlSegment}")/* 只指定2个,其他列能⾃动匹配的,也会被映射。

@Results({@Result(id = true, column = "ORDER_ID", property = "orderId", jdbcType = JdbcType.VARCHAR),@Result(column = "USER_ID", property = "userId", jdbcType = JdbcType.INTEGER)})*/List<OrderVO> findByCondition(@Param(Constants.WRAPPER)Wrapper wrapper);List<OrderVO> selectOrderVOList(@Param(Constants.WRAPPER)Wrapper wrapper);}Mapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.mozq.boot.mpsand01.dao.OrderInfoDao"><resultMap id="BaseResultMapVO" type="com.mozq.boot.mpsand01.vo.OrderVO"><id column="ORDER_ID" property="orderId" jdbcType="VARCHAR" /><result column="USER_ID" property="userId" jdbcType="INTEGER" /><result column="COMPANY_ID" property="companyId" jdbcType="INTEGER" /><result column="CUSTOMER_ID" property="customerId" jdbcType="INTEGER" /><result column="CUSTOMER_NAME" property="customerName" jdbcType="VARCHAR" /><result column="MOBILE_PHONE" property="mobilePhone" jdbcType="VARCHAR" /><result column="ACCOUNT_ID" property="accountId" jdbcType="VARCHAR" /><result column="PRODUCT_ID" property="productId" jdbcType="INTEGER" /><result column="PRODUCT_NAME" property="productName" jdbcType="VARCHAR" /><result column="ORDER_TYPE" property="orderType" jdbcType="INTEGER" /><result column="QUANTITY" property="quantity" jdbcType="DECIMAL" /><result column="LICENSE_PLATE_NUMBER" property="licensePlateNumber" jdbcType="VARCHAR" /><result column="PRICE" property="price" jdbcType="DECIMAL" /><result column="TOTAL_MONEY" property="totalMoney" jdbcType="DECIMAL" /><result column="PAY_QUANTITY" property="payQuantity" jdbcType="DECIMAL" /><result column="PAY_MONEY" property="payMoney" jdbcType="DECIMAL" /><result column="THE_WEIGHT" property="theWeight" jdbcType="INTEGER" /><result column="DELIVERY_ADDRESS" property="deliveryAddress" jdbcType="VARCHAR" /><result column="RECEIVE_ADDRESS" property="receiveAddress" jdbcType="VARCHAR" /><result column="ORDER_STATUS" property="orderStatus" jdbcType="INTEGER" /><result column="REMARK" property="remark" jdbcType="VARCHAR" /><result column="PICKUP_TIME" property="pickupTime" jdbcType="TIMESTAMP" /><result column="CREATE_TIME" property="createTime" jdbcType="TIMESTAMP" /><result column="UPDATE_TIME" property="updateTime" jdbcType="TIMESTAMP" /></resultMap><sql id="Base_Column_List">ORDER_ID,USER_ID,COMPANY_ID,CUSTOMER_ID,CUSTOMER_NAME,MOBILE_PHONE,ACCOUNT_ID,PRODUCT_ID,PRODUCT_NAME,ORDER_TYPE,QUANTITY,LICENSE_PLATE_NUMBER,PRICE,TOTAL_MONEY,PAY_QUANTITY,PAY_MONEY,THE_WEIGHT,DELIVERY_ADDRESS,RECEIVE_ADDRESS,ORDER_STATUS,REMARK,PICKUP_TIME,CREATE_TIME,UPDATE_TIME</sql><select id="selectOrderVOList" resultMap="BaseResultMapVO">select <include refid="Base_Column_List"></include>from order_info${ew.customSqlSegment}</select></mapper>测试类@Testpublic void selectOrderVOList(){List<OrderVO> orderVOList = orderInfoDao.selectOrderVOList(Wrappers.<OrderInfo>lambdaQuery().eq(OrderInfo::getUserId, 123456).eq(OrderInfo::getCompanyId, 1));System.out.println(orderVOList.size());List<OrderVO> byCondition = orderInfoDao.findByCondition(Wrappers.<OrderInfo>lambdaQuery().eq(OrderInfo::getUserId, 123456).eq(OrderInfo::getCompanyId, 1));System.out.println(byCondition.size());List<OrderInfo> orderInfoList = orderInfoDao.selectList(Wrappers.<OrderInfo>lambdaQuery().eq(OrderInfo::getUserId, 123456).eq(OrderInfo::getCompanyId, 1));System.out.println(orderInfoList.size());}到此这篇关于MyBatis Plus 将查询结果封装到指定实体的⽅法步骤的⽂章就介绍到这了,更多相关MyBatis Plus查询结果封装到指定实体内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

mybatis中的mapper.xml使用循环语句

mybatis中的mapper.xml使用循环语句

mybatis中的mapper.xml使⽤循环语句⽬录mapper.xml使⽤循环语句mapper.java,传的参数是mapmapper.xml参数,数组,list都⾏mybatis xml循环语句⾸先创建DAO⽅法除了批量插⼊,使⽤SQL in查询多个⽤户时也会使⽤mapper.xml使⽤循环语句mapper.java,传的参数是mapList<实体类> getList(Map<String,Object> paraMap);mapper.xml<!--select:对应sql的select语句, id:⽅法名,parameterType:参数类型,resultMap:返回对象类型(BaseResultMap:标签--> <!--<resultMap id="BaseResultMap" type="实体类包路径"> 实体类的映射不改的话⼀般都是这个名字)--><select id="getList" parameterType="java.util.Map" resultMap="BaseResultMap">select * from table where<!-- 判断--><if test="a!= null">a = #{a,jdbcType=VARCHAR}</if><if test="list!= null">and id in<!-- for循环, item:循环后的值, index:循环下标列式for循环的 i ,collection:参数名--><!-- open="(" close=")" separator="," 就是把循环的值组成 (item1,item2,item3)的格式--><foreach item="item" index="index" collection="list" open="(" close=")" separator=",">#{item}</foreach></if></select>参数,数组,list都⾏Map<String,Object> map = new HashMap<String, Object>();map.put("a","参数");map.put("list",数组、List都⾏)List<实体类> list = mapper.getList(map);mybatis xml循环语句MyBatis很好的⽀持批量插⼊,使⽤foreach即可满⾜⾸先创建DAO⽅法package ment.dao;import erDO;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;import java.time.LocalDateTime;import java.util.List;@Mapperpublic interface UserDAO {int batchAdd(@Param("list") List<UserDO> userDOs);}<insert id="batchAdd" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">INSERT INTO user (user_name, pwd, nick_name,avatar,gmt_created,gmt_modified)VALUES<foreach collection="list" item="it" index="index" separator =",">(#{erName}, #{it.pwd}, #{it.nickName}, #{it.avatar},now(),now())</foreach ></insert>foreach相当于执⾏⼒java的for循环,他的属性:collection指定集合的上下⽂参数名称⽐如这⾥的@Param("list")item指定遍历的每⼀个数据的变量,⼀般叫it,可以使⽤erName来获取具体的值index集合的索引值,从0开始separator遍历每条记录并添加分隔符除了批量插⼊,使⽤SQL in查询多个⽤户时也会使⽤package ment.dao;import erDO;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;import java.time.LocalDateTime;import java.util.List;@Mapperpublic interface UserDAO {List<UserDO> findByIds(@Param("ids") List<Long> ids);}<select id="findByIds" resultMap="userResultMap">select * from user<where>id in<foreach item="item" index="index" collection="ids"open="(" separator="," close=")">#{item}</foreach></where></select>open表⽰的是节点开始时⾃定义的分隔符close表⽰是节点结束时⾃定义的分隔符执⾏后会变成:select * from user where id in (?,?,?)以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

浅谈@mapper引入不到引入的是@MapperScan的问题

浅谈@mapper引入不到引入的是@MapperScan的问题

浅谈@mapper引⼊不到引⼊的是@MapperScan的问题两种防⽔都可以,但是使⽤⽅式不同。

@mapper需要mybatis和mybatis-spring的版本⾜够的⾼才可以。

不然导⼊不到@mapper。

补充知识:关于MyBatis的@Mapper和@MapperScan注解的⼀点思考最近有空回顾mybatis,想起@Mapper注解⼀直没弄明⽩是⼲嘛的,代码上的注释写的很简单(Marker interface for MyBatis mappers),开发过程中也没⽤到,但⽹上各种资料偶有出现他的⾝影。

问了度娘,都没讲清楚,我决定⾃⼰思考下这个问题,看看他究竟是⼲嘛⽤的。

1、来源Mapper来⾃mybatis-3.5.3.jar包MapperScan来⾃mybatis-spring-2.0.3.jar包2、作⽤Mapper注解没有被任何类接⼝引⽤,看不出来有何作⽤MapperScan注解被MapperScannerRegistrar的registerBeanDefinitions⽅法所引⽤,⽬的是将basePackages定义的所有包下的所有接⼝⽣成⼀个org.apache.ibatis.binding.MapperProxy代理bean,这样就可以⽤@Autowired注解进⾏装配使⽤了。

3、疑问Mapper注解没有被任何类使⽤,那他⽤来⼲嘛的,MapperScan⽤来扫描定义包下的所有的接⼝,⽆论这个接⼝你的设计⽬的是⽤来⼲嘛的,他都会⽣成⼀个bean(经测试,@Service实现的接⼝和@FeignClient注解的接⼝,即使他已经都相关的程序注册了⼀个bean,MapperScan还是会将这些接⼝再注册⼀个bean,导致出错)。

如此不合理的地⽅,到底是哪⾥出现问题?4、我的思考带着上⾯的问题,我⼜在重新查看了@MapperScan,发现⾥⾯有个annotationClass,默认值是Annotation.classs。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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>。

相关文档
最新文档