From 388cf8b3fd2162d0a4acea2d2177a2cc3b69ce5d Mon Sep 17 00:00:00 2001 From: Zen Huifer Date: Mon, 18 Sep 2023 09:36:08 +0800 Subject: [PATCH] write a line into test.file --- ...sba694812-55c3-11ee-9bca-acde48001122.java | 48 ++++ ...sbaaf1c16-55c3-11ee-9bca-acde48001122.java | 241 ++++++++++++++++++ ...sbaf3026e-55c3-11ee-9bca-acde48001122.java | 44 ++++ ...sbb3cf1ee-55c3-11ee-9bca-acde48001122.java | 32 +++ ...sbb88eb4e-55c3-11ee-9bca-acde48001122.java | 67 +++++ ...sbbc41afc-55c3-11ee-9bca-acde48001122.java | 11 + ...sbc109a44-55c3-11ee-9bca-acde48001122.java | 18 ++ ...sbc5ab0fc-55c3-11ee-9bca-acde48001122.java | 114 +++++++++ ...sbca70c0e-55c3-11ee-9bca-acde48001122.java | 33 +++ ...sbcf1e2b0-55c3-11ee-9bca-acde48001122.java | 39 +++ ...sbd2eedea-55c3-11ee-9bca-acde48001122.java | 22 ++ 11 files changed, 669 insertions(+) create mode 100644 docs/spring/csba694812-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbaaf1c16-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbaf3026e-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbb3cf1ee-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbb88eb4e-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbbc41afc-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbc109a44-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbc5ab0fc-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbca70c0e-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbcf1e2b0-55c3-11ee-9bca-acde48001122.java create mode 100644 docs/spring/csbd2eedea-55c3-11ee-9bca-acde48001122.java diff --git a/docs/spring/csba694812-55c3-11ee-9bca-acde48001122.java b/docs/spring/csba694812-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..235628e4 --- /dev/null +++ b/docs/spring/csba694812-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,48 @@ +package com.huifer.concurrence.ch1; + +import java.util.ArrayList; +import java.util.List; + +/** + *

Title : ThreadYield

+ *

Description : yield

+ * + * @author huifer + * @date 2019-03-27 + */ +public class ThreadYield { + + public static void main(String[] args) { + Task task1 = new Task(true); + Task task2 = new Task(false); + new Thread(task1).start(); + new Thread(task2).start(); + } + + + private static class Task implements Runnable { + + private final boolean isYield; + private List stringList = new ArrayList<>(); + + public Task(boolean isYield) { + this.isYield = isYield; + } + + @Override + public void run() { + String name = Thread.currentThread().getName(); + System.out.println(name + " start:"); + for (int i = 0; i < 1000000; i++) { + if (isYield) { + stringList.add("NO." + i); + Thread.yield(); + } + } + System.out.println(name + " end:"); + + } + } + + +} diff --git a/docs/spring/csbaaf1c16-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbaaf1c16-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..89660784 --- /dev/null +++ b/docs/spring/csbaaf1c16-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,241 @@ +/** + * Copyright 2009-2019 the original author or authors. + *

+ * 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. + */ +package org.apache.ibatis.parsing; + +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.io.Resources; +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class XPathParserTest { + private String resource = "resources/nodelet_test.xml"; + + // InputStream Source + @Test + void constructorWithInputStreamValidationVariablesEntityResolver() throws Exception { + + try (InputStream inputStream = Resources.getResourceAsStream(resource)) { + XPathParser parser = new XPathParser(inputStream, false, null, null); + testEvalMethod(parser); + } + } + + @Test + void constructorWithInputStreamValidationVariables() throws IOException { + try (InputStream inputStream = Resources.getResourceAsStream(resource)) { + XPathParser parser = new XPathParser(inputStream, false, null); + testEvalMethod(parser); + } + } + + @Test + void constructorWithInputStreamValidation() throws IOException { + try (InputStream inputStream = Resources.getResourceAsStream(resource)) { + XPathParser parser = new XPathParser(inputStream, false); + testEvalMethod(parser); + } + } + + @Test + void constructorWithInputStream() throws IOException { + try (InputStream inputStream = Resources.getResourceAsStream(resource)) { + XPathParser parser = new XPathParser(inputStream); + testEvalMethod(parser); + } + } + + // Reader Source + @Test + void constructorWithReaderValidationVariablesEntityResolver() throws Exception { + + try (Reader reader = Resources.getResourceAsReader(resource)) { + XPathParser parser = new XPathParser(reader, false, null, null); + testEvalMethod(parser); + } + } + + @Test + void constructorWithReaderValidationVariables() throws IOException { + try (Reader reader = Resources.getResourceAsReader(resource)) { + XPathParser parser = new XPathParser(reader, false, null); + testEvalMethod(parser); + } + } + + @Test + void constructorWithReaderValidation() throws IOException { + try (Reader reader = Resources.getResourceAsReader(resource)) { + XPathParser parser = new XPathParser(reader, false); + testEvalMethod(parser); + } + } + + @Test + void constructorWithReader() throws IOException { + try (Reader reader = Resources.getResourceAsReader(resource)) { + XPathParser parser = new XPathParser(reader); + testEvalMethod(parser); + } + } + + // Xml String Source + @Test + void constructorWithStringValidationVariablesEntityResolver() throws Exception { + XPathParser parser = new XPathParser(getXmlString(resource), false, null, null); + testEvalMethod(parser); + } + + @Test + void constructorWithStringValidationVariables() throws IOException { + XPathParser parser = new XPathParser(getXmlString(resource), false, null); + testEvalMethod(parser); + } + + @Test + void constructorWithStringValidation() throws IOException { + XPathParser parser = new XPathParser(getXmlString(resource), false); + testEvalMethod(parser); + } + + @Test + void constructorWithString() throws IOException { + XPathParser parser = new XPathParser(getXmlString(resource)); + testEvalMethod(parser); + } + + // Document Source + @Test + void constructorWithDocumentValidationVariablesEntityResolver() { + XPathParser parser = new XPathParser(getDocument(resource), false, null, null); + testEvalMethod(parser); + } + + @Test + void constructorWithDocumentValidationVariables() { + XPathParser parser = new XPathParser(getDocument(resource), false, null); + testEvalMethod(parser); + } + + @Test + void constructorWithDocumentValidation() { + XPathParser parser = new XPathParser(getDocument(resource), false); + testEvalMethod(parser); + } + + @Test + void constructorWithDocument() { + XPathParser parser = new XPathParser(getDocument(resource)); + testEvalMethod(parser); + } + + private Document getDocument(String resource) { + try { + InputSource inputSource = new InputSource(Resources.getResourceAsReader(resource)); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(false); + factory.setIgnoringComments(true); + factory.setIgnoringElementContentWhitespace(false); + factory.setCoalescing(false); + factory.setExpandEntityReferences(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + return builder.parse(inputSource);// already closed resource in builder.parse method + } catch (Exception e) { + throw new BuilderException("Error creating document instance. Cause: " + e, e); + } + } + + private String getXmlString(String resource) throws IOException { + try (BufferedReader bufferedReader = new BufferedReader(Resources.getResourceAsReader(resource))) { + StringBuilder sb = new StringBuilder(); + String temp; + while ((temp = bufferedReader.readLine()) != null) { + sb.append(temp); + } + return sb.toString(); + } + } + + private void testEvalMethod(XPathParser parser) { + assertEquals((Long) 1970L, parser.evalLong("/employee/birth_date/year")); + assertEquals((short) 6, (short) parser.evalShort("/employee/birth_date/month")); + assertEquals((Integer) 15, parser.evalInteger("/employee/birth_date/day")); + assertEquals((Float) 5.8f, parser.evalFloat("/employee/height")); + assertEquals((Double) 5.8d, parser.evalDouble("/employee/height")); + assertEquals("${id_var}", parser.evalString("/employee/@id")); + assertEquals(Boolean.TRUE, parser.evalBoolean("/employee/active")); + assertEquals("${id_var}", parser.evalNode("/employee/@id").toString().trim()); + assertEquals(7, parser.evalNodes("/employee/*").size()); + XNode node = parser.evalNode("/employee/height"); + assertEquals("employee/height", node.getPath()); + assertEquals("employee[${id_var}]_height", node.getValueBasedIdentifier()); + } + + @Test + public void formatXNodeToString() { + XPathParser parser = new XPathParser("100Tom30BMWAudiBenz"); + String usersNodeToString = parser.evalNode("/users").toString(); + String userNodeToString = parser.evalNode("/users/user").toString(); + String carsNodeToString = parser.evalNode("/users/user/cars").toString(); + + String usersNodeToStringExpect = + "\n" + + " \n" + + " 100\n" + + " Tom\n" + + " 30\n" + + " \n" + + " BMW\n" + + " Audi\n" + + " Benz\n" + + " \n" + + " \n" + + "\n"; + + String userNodeToStringExpect = + "\n" + + " 100\n" + + " Tom\n" + + " 30\n" + + " \n" + + " BMW\n" + + " Audi\n" + + " Benz\n" + + " \n" + + "\n"; + + String carsNodeToStringExpect = + "\n" + + " BMW\n" + + " Audi\n" + + " Benz\n" + + "\n"; + + assertEquals(usersNodeToStringExpect, usersNodeToString); + assertEquals(userNodeToStringExpect, userNodeToString); + assertEquals(carsNodeToStringExpect, carsNodeToString); + } + +} \ No newline at end of file diff --git a/docs/spring/csbaf3026e-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbaf3026e-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..574edbe0 --- /dev/null +++ b/docs/spring/csbaf3026e-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,44 @@ +/** + * Copyright 2009-2019 the original author or authors. + *

+ * 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. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * The annotation that specify the parameter name. + * + *


+ * How to use: + *

+ * public interface UserMapper {
+ *   @Select("SELECT id, name FROM users WHERE name = #{name}")
+ *   User selectById(@Param("name") String value);
+ * }
+ * 
+ * 参数注解 + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +public @interface Param { + /** + * Returns the parameter name. + * + * @return the parameter name + */ + String value(); +} diff --git a/docs/spring/csbb3cf1ee-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbb3cf1ee-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..62f06f9a --- /dev/null +++ b/docs/spring/csbb3cf1ee-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,32 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * 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. + */ +package org.apache.ibatis.submitted.array_result_type; + +import org.apache.ibatis.annotations.Select; + +public interface Mapper { + + @Select("select * from users") + User[] getUsers(); + + User[] getUsersXml(); + + @Select("select id from users") + Integer[] getUserIds(); + + @Select("select id from users") + int[] getUserIdsPrimitive(); +} diff --git a/docs/spring/csbb88eb4e-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbb88eb4e-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..a84fd8e7 --- /dev/null +++ b/docs/spring/csbb88eb4e-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,67 @@ +package com.huifer.hystrix.aop; + +import com.huifer.hystrix.annotation.Fusing; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +import java.util.concurrent.*; + +/** + *

Title : MyHystrixControllerAspect

+ *

Description :

+ * + * @author huifer + * @date 2019-05-30 + */ +@Aspect +@Component +public class MyHystrixControllerAspect { + + private final ExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); + + + @Around(" execution(* com.huifer.hystrix.controller.MyHystrixController.v3(..) ) && args(msg)") + public Object timeout(ProceedingJoinPoint joinPoint, String msg) throws Throwable { + String s = doInvoke(joinPoint, msg, 100, msg); + return s; + + } + + + @Around("execution(* com.huifer.hystrix.controller.MyHystrixController.v4(..) ) && args(msg) && @annotation( fusing )") + public Object versionFour(ProceedingJoinPoint joinPoint, String msg, Fusing fusing) + throws Throwable { + int timeout = fusing.timeout(); + String s = doInvoke(joinPoint, msg, timeout, "注解形式 " + msg); + return s; + + } + + private String doInvoke(ProceedingJoinPoint joinPoint, String msg, int timeout, String s2) + throws InterruptedException, java.util.concurrent.ExecutionException { + Future submit = executorService.submit(() -> { + Object resout = null; + try { + resout = joinPoint.proceed(new String[]{msg}); + } catch (Throwable throwable) { + } + return resout; + }); + String s; + try { + s = (String) submit.get(timeout, TimeUnit.MILLISECONDS); + } catch (TimeoutException t) { + s = errorMsg(s2); + } + return s; + } + + + private String errorMsg(String msg) { + return "AOP 熔断 " + msg; + } + + +} diff --git a/docs/spring/csbbc41afc-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbbc41afc-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..fcf8d3cd --- /dev/null +++ b/docs/spring/csbbc41afc-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,11 @@ +package com.huifer.utils.entity.demo; + +import java.lang.annotation.*; + + +@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface JsonAnn { + Class clazz(); +} diff --git a/docs/spring/csbc109a44-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbc109a44-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..69e3562d --- /dev/null +++ b/docs/spring/csbc109a44-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,18 @@ +package com.huifer.design.decorate.cake; + +public class CreamCakeDecorate extends CakeDecorate { + + public CreamCakeDecorate(BaseCake baseCake) { + super(baseCake); + } + + @Override + protected String msg() { + return this.baseCake.msg() + "+奶油"; + } + + @Override + protected int price() { + return this.baseCake.price() + 1; + } +} diff --git a/docs/spring/csbc5ab0fc-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbc5ab0fc-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..07245bff --- /dev/null +++ b/docs/spring/csbc5ab0fc-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,114 @@ +/** + * Copyright 2009-2019 the original author or authors. + *

+ * 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. + */ +package org.apache.ibatis.scripting.xmltags; + +import org.apache.ibatis.parsing.GenericTokenParser; +import org.apache.ibatis.parsing.TokenHandler; +import org.apache.ibatis.scripting.ScriptingException; +import org.apache.ibatis.type.SimpleTypeRegistry; + +import java.util.regex.Pattern; + +/** + * @author Clinton Begin + */ +public class TextSqlNode implements SqlNode { + private final String text; + private final Pattern injectionFilter; + + public TextSqlNode(String text) { + this(text, null); + } + + public TextSqlNode(String text, Pattern injectionFilter) { + this.text = text; + this.injectionFilter = injectionFilter; + } + + /** + * 是否动态 + * @return + */ + public boolean isDynamic() { + DynamicCheckerTokenParser checker = new DynamicCheckerTokenParser(); + GenericTokenParser parser = createParser(checker); +// 转换"${", "}", + parser.parse(text); + return checker.isDynamic(); + } + + @Override + public boolean apply(DynamicContext context) { + GenericTokenParser parser = createParser(new BindingTokenParser(context, injectionFilter)); + context.appendSql(parser.parse(text)); + return true; + } + + private GenericTokenParser createParser(TokenHandler handler) { + return new GenericTokenParser("${", "}", handler); + } + + private static class BindingTokenParser implements TokenHandler { + + private DynamicContext context; + private Pattern injectionFilter; + + public BindingTokenParser(DynamicContext context, Pattern injectionFilter) { + this.context = context; + this.injectionFilter = injectionFilter; + } + + @Override + public String handleToken(String content) { + Object parameter = context.getBindings().get("_parameter"); + if (parameter == null) { + context.getBindings().put("value", null); + } else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) { + context.getBindings().put("value", parameter); + } + Object value = OgnlCache.getValue(content, context.getBindings()); + String srtValue = value == null ? "" : String.valueOf(value); // issue #274 return "" instead of "null" + checkInjection(srtValue); + return srtValue; + } + + private void checkInjection(String value) { + if (injectionFilter != null && !injectionFilter.matcher(value).matches()) { + throw new ScriptingException("Invalid input. Please conform to regex" + injectionFilter.pattern()); + } + } + } + + private static class DynamicCheckerTokenParser implements TokenHandler { + + private boolean isDynamic; + + public DynamicCheckerTokenParser() { + // Prevent Synthetic Access + } + + public boolean isDynamic() { + return isDynamic; + } + + @Override + public String handleToken(String content) { + this.isDynamic = true; + return null; + } + } + +} diff --git a/docs/spring/csbca70c0e-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbca70c0e-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..2cd0a326 --- /dev/null +++ b/docs/spring/csbca70c0e-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,33 @@ +package com.huifer.jdk.sub.processor; + +import java.util.Random; +import java.util.concurrent.SubmissionPublisher; +import java.util.concurrent.TimeUnit; + +/** + * 描述: + * + * @author huifer + * @date 2019-06-02 + */ +public class ProcessorTest { + public static void main(String[] args) throws InterruptedException { + SubmissionPublisher publisher = new SubmissionPublisher<>(); + + Processor processor = new Processor(); + SubscrioberForString subscrioberForString = new SubscrioberForString(); + + + publisher.subscribe(processor); + + processor.subscribe(subscrioberForString); + + + for (int i = 0; i < 300; i++) { + int i1 = new Random().nextInt(100); + publisher.submit(i1); + } + TimeUnit.SECONDS.sleep(500); + System.out.println("main work end"); + } +} diff --git a/docs/spring/csbcf1e2b0-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbcf1e2b0-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..bc40eda3 --- /dev/null +++ b/docs/spring/csbcf1e2b0-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * 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. + */ +package org.apache.ibatis.submitted.immutable_constructor; + +import java.io.Serializable; + +public class ImmutablePOJO implements Serializable { + + private static final long serialVersionUID = -7086198701202598455L; + private final Integer immutableId; + private final String immutableDescription; + + public ImmutablePOJO(Integer immutableId, String immutableDescription) { + this.immutableId = immutableId; + this.immutableDescription = immutableDescription; + } + + public Integer getImmutableId() { + return immutableId; + } + + public String getImmutableDescription() { + return immutableDescription; + } + +} diff --git a/docs/spring/csbd2eedea-55c3-11ee-9bca-acde48001122.java b/docs/spring/csbd2eedea-55c3-11ee-9bca-acde48001122.java new file mode 100644 index 00000000..e878c034 --- /dev/null +++ b/docs/spring/csbd2eedea-55c3-11ee-9bca-acde48001122.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * 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. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface MultipleReverseIncludePersonMapper { + Person select(Integer id); + + Pet selectPet(Integer id); +}