diff --git a/build.gradle b/build.gradle index 1cfd7b8271638ac37e177e1d83b84eb86b25dd52..da9c6096cc370a836b832a52e77e7666cda753d1 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ apply plugin: 'signing' buildscript { ext { mybatisPlusVersion = "3.5.9" - solonVersion = "3.0.1" + solonVersion = "3.0.2" } // 仓库配置 @@ -42,9 +42,13 @@ dependencies { api("org.noear:mybatis-solon-plugin:${solonVersion}") api("org.noear:solon-aot:${solonVersion}") + testImplementation("com.baomidou:mybatis-plus-jsqlparser-4.9:${mybatisPlusVersion}") testImplementation("org.noear:solon-test:${solonVersion}") - testImplementation("io.github.classgraph:classgraph:4.8.176") + testImplementation("org.noear:solon-data-sqlutils:${solonVersion}") + testImplementation("org.noear:solon-web:${solonVersion}") testImplementation("com.zaxxer:HikariCP:4.0.3") + testImplementation("com.h2database:h2:2.3.232") + testImplementation("org.projectlombok:lombok:1.18.34") } // 编译环境 JDK-1.8+ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..a7af2001befe504065f01017a9cd46cc2771f6aa --- /dev/null +++ b/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + com.baomidou + mybatis-plus-solon-plugin + 3.5.9 + jar + + + 3.0.2 + + + + + com.baomidou + mybatis-plus-extension + ${project.version} + + + + org.noear + mybatis-solon-plugin + ${solon.version} + + + + org.noear + solon-aot + ${solon.version} + provided + + + + org.noear + solon-test + ${solon.version} + test + + + + org.noear + solon-data-sqlutils + ${solon.version} + test + + + + org.noear + solon-web + ${solon.version} + test + + + + com.baomidou + mybatis-plus-jsqlparser-4.9 + ${project.version} + test + + + + com.zaxxer + HikariCP + 4.0.3 + test + + + + com.h2database + h2 + 2.3.232 + test + + + + org.projectlombok + lombok + 1.18.34 + test + + + + diff --git a/src/main/java/com/baomidou/mybatisplus/extension/repository/CrudRepository.java b/src/main/java/com/baomidou/mybatisplus/extension/repository/CrudRepository.java index 7e4e46b28fd8e3456ecce3008d69ad29917cb709..2ba65139705e887f465b8a2ba4340b2d9e5b7f0e 100644 --- a/src/main/java/com/baomidou/mybatisplus/extension/repository/CrudRepository.java +++ b/src/main/java/com/baomidou/mybatisplus/extension/repository/CrudRepository.java @@ -47,6 +47,15 @@ public abstract class CrudRepository, T> extends Abstrac return this.baseMapper; } + /** + * 设置 baseMapper(用于支持 Db 注入 CrudRepository) + * + * @author noear + * */ + public void setBaseMapper(M baseMapper) { + this.baseMapper = baseMapper; + } + /** * 批量插入 * diff --git a/src/main/java/com/baomidou/mybatisplus/solon/integration/MybatisAdapterPlus.java b/src/main/java/com/baomidou/mybatisplus/solon/integration/MybatisAdapterPlus.java index 7bf9bde8fe1fb3a4a564c33766ae03a310c398f1..5f470df8d3b8ce7c4ec78b79cecb3605c557c373 100644 --- a/src/main/java/com/baomidou/mybatisplus/solon/integration/MybatisAdapterPlus.java +++ b/src/main/java/com/baomidou/mybatisplus/solon/integration/MybatisAdapterPlus.java @@ -3,8 +3,11 @@ package com.baomidou.mybatisplus.solon.integration; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.MybatisSqlSessionFactoryBuilder; import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.override.SolonMybatisMapperProxy; import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils; +import com.baomidou.mybatisplus.extension.repository.CrudRepository; +import com.baomidou.mybatisplus.extension.repository.IRepository; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; @@ -105,6 +108,7 @@ public class MybatisAdapterPlus extends MybatisAdapterDefault { return sqlSession; } + @SuppressWarnings("unchecked") @Override public T getMapper(Class mapperClz) { Object mapper = mapperCached.get(mapperClz); @@ -134,13 +138,72 @@ public class MybatisAdapterPlus extends MybatisAdapterDefault { } @Override - public void injectTo(VarHolder varH) { - super.injectTo(varH); + public void injectTo(VarHolder vh) { + if (IRepository.class.isAssignableFrom(vh.getType())) { + vh.context().getWrapAsync(vh.getType(), serviceBw -> { + if (serviceBw.raw() instanceof CrudRepository) { + //如果是 ServiceImpl + injectService(vh, serviceBw); + } else { + //如果不是 ServiceImpl + vh.setValue(serviceBw.get()); + } + }); + return; + } //@Db("db1") SqlSessionFactory factory; - if (GlobalConfig.class.isAssignableFrom(varH.getType())) { - varH.setValue(this.getGlobalConfig()); + if (GlobalConfig.class.isAssignableFrom(vh.getType())) { + vh.setValue(this.getGlobalConfig()); return; } + + super.injectTo(vh); + + + } + + /** + * 服务缓存 + */ + private Map, CrudRepository> repositoryCached = new HashMap<>(); + + /** + * 注入服务 IService + */ + @SuppressWarnings("unchecked") + private void injectService(VarHolder vh, BeanWrap serviceBw) { + CrudRepository repository = serviceBw.raw(); + + if (repositoryCached.containsKey(vh.getType())) { + //从缓存获取 + repository = repositoryCached.get(vh.getType()); + } else { + Object baseMapperOld = repository.getBaseMapper(); + + if (baseMapperOld != null) { + Class baseMapperClass = null; + for (Class clz : baseMapperOld.getClass().getInterfaces()) { + //baseMapperOld.getClass() 是个代理类,所以要从基类接口拿 + if (BaseMapper.class.isAssignableFrom(clz)) { + baseMapperClass = clz; + break; + } + } + + if (baseMapperClass != null) { + //如果有 baseMapper ,说明正常;;创建新实例,并更换 baseMapper + repository = serviceBw.create(); + + BaseMapper baseMapper = (BaseMapper) this.getMapper(baseMapperClass); + repository.setBaseMapper(baseMapper); + + //缓存 + repositoryCached.put(vh.getType(), repository); + } + } + } + + vh.setValue(repository); } } diff --git a/src/test/java/demo/Config.java b/src/test/java/demo/Config.java index c3ed33dbd4ee9d8680d770a5d6d688aae991cf8d..f585152c8994d1f47ea252d538ae4bae3ff71a77 100644 --- a/src/test/java/demo/Config.java +++ b/src/test/java/demo/Config.java @@ -1,29 +1,49 @@ package demo; +import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.MybatisConfiguration; -import com.baomidou.mybatisplus.core.MybatisSqlSessionFactoryBuilder; import com.baomidou.mybatisplus.core.config.GlobalConfig; -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import demo.dso.MetaObjectHandlerImpl; -import demo.dso.MybatisSqlSessionFactoryBuilderImpl; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import demo.dso.mybatisplus_ext.MyLogicSqlInjector; import org.apache.ibatis.solon.annotation.Db; -import org.noear.solon.Solon; import org.noear.solon.annotation.Bean; import org.noear.solon.annotation.Configuration; import org.noear.solon.annotation.Inject; - -import javax.sql.DataSource; +import org.noear.solon.core.util.ResourceUtil; +import org.noear.solon.data.sql.SqlUtils; @Configuration public class Config { +//有 “solon.dataSources” 配置后,不需要手动构建 bean +// @Bean(value = "db1", typed = true) +// public DataSource db1(@Inject("${test.db1}") HikariDataSource ds) { +// return ds; +// } + @Bean - public void db1_cfg(@Db("db1") MybatisConfiguration cfg, - @Db("db1") GlobalConfig globalConfig) { - //增加 mybatis-plus 的自带分页插件 + public void db1_cfg( + @Inject SqlUtils sqlUtils, + @Db("db1") MybatisConfiguration cfg, + @Db("db1") GlobalConfig globalConfig) throws Exception { + + String sql = ResourceUtil.getResourceAsString("db.sql"); + + for (String s1 : sql.split(";")) { + if (s1.trim().length() > 10) { + sqlUtils.sql(s1).update(); + } + } + + //// + MybatisPlusInterceptor plusInterceptor = new MybatisPlusInterceptor(); - plusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + plusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2)); + cfg.setCacheEnabled(false); cfg.addInterceptor(plusInterceptor); + + globalConfig.setSqlInjector(new MyLogicSqlInjector()); } // @Bean @@ -31,4 +51,3 @@ public class Config { // return new MybatisSqlSessionFactoryBuilderImpl(); // } } - diff --git a/src/test/java/demo/DemoApp.java b/src/test/java/demo/DemoApp.java index 3ce885e1ffd0c14df0755286f8059ed68609a5a1..a48270dc4734018fa1f2e37fcb02871d6dd488a9 100644 --- a/src/test/java/demo/DemoApp.java +++ b/src/test/java/demo/DemoApp.java @@ -1,22 +1,31 @@ package demo; -import com.baomidou.mybatisplus.core.toolkit.Assert; -import demo.dso.service.UserService; -import demo.model.User; import org.noear.solon.Solon; - -import java.util.List; +import org.noear.solon.annotation.SolonMain; /** - * @author noear 2021/7/12 created - */ + * + * 演示用到的表结构:: + * + * CREATE TABLE `appx` ( + * `app_id` int NOT NULL AUTO_INCREMENT COMMENT '应用ID', + * `app_key` varchar(40) DEFAULT NULL COMMENT '应用访问KEY', + * `akey` varchar(40) DEFAULT NULL COMMENT '(用于取代app id 形成的唯一key) //一般用于推广注册之类', + * `ugroup_id` int DEFAULT '0' COMMENT '加入的用户组ID', + * `agroup_id` int DEFAULT NULL COMMENT '加入的应用组ID', + * `name` varchar(50) DEFAULT NULL COMMENT '应用名称', + * `note` varchar(50) DEFAULT NULL COMMENT '应用备注', + * `ar_is_setting` int NOT NULL DEFAULT '0' COMMENT '是否开放设置', + * `ar_is_examine` int NOT NULL DEFAULT '0' COMMENT '是否审核中(0: 没审核 ;1:审核中)', + * `ar_examine_ver` int NOT NULL DEFAULT '0' COMMENT '审核 中的版本号', + * `log_fulltime` datetime DEFAULT NULL, + * PRIMARY KEY (`app_id`), + * UNIQUE KEY `IX_akey` (`akey`) USING BTREE + * ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='应用表'; + * */ +@SolonMain public class DemoApp { public static void main(String[] args) { Solon.start(DemoApp.class, args); - - //test - UserService userService = Solon.context().getBean(UserService.class); - - Assert.notNull(userService.getUserList(), "查询结果异常"); } } diff --git a/src/test/java/demo/controller/DemoController.java b/src/test/java/demo/controller/DemoController.java new file mode 100644 index 0000000000000000000000000000000000000000..74bd842b244b89d81577fe407e95c37ee78ab3ad --- /dev/null +++ b/src/test/java/demo/controller/DemoController.java @@ -0,0 +1,23 @@ +package demo.controller; + +import demo.dso.mapper.AppxMapper; +import demo.model.AppxModel; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Mapping; + +/** + * 分包模式,一开始就被会话工厂mapperScan()并关联好了 + * */ +@Mapping("/demo/") +@Controller +public class DemoController { + @Db + AppxMapper appxMapper; + + @Mapping("test") + public AppxModel test(){ + return appxMapper.appx_get(); + } + +} diff --git a/src/test/java/demo/controller/IndexController.java b/src/test/java/demo/controller/IndexController.java deleted file mode 100644 index d3313718394074ae7a6c64fd8be684dd644d88e9..0000000000000000000000000000000000000000 --- a/src/test/java/demo/controller/IndexController.java +++ /dev/null @@ -1,21 +0,0 @@ -package demo.controller; - -import demo.dso.service.UserService; -import demo.model.User; -import org.noear.solon.annotation.Controller; -import org.noear.solon.annotation.Inject; -import org.noear.solon.annotation.Mapping; - -import java.util.List; - -@Controller -public class IndexController { - - @Inject - UserService userService; - - @Mapping("/") - public List index() { - return userService.getUserList(); - } -} diff --git a/src/test/java/demo/controller/PageController.java b/src/test/java/demo/controller/PageController.java new file mode 100644 index 0000000000000000000000000000000000000000..21099ce5dcd414a3df2b4b1e7e8d30f452b5f6c4 --- /dev/null +++ b/src/test/java/demo/controller/PageController.java @@ -0,0 +1,26 @@ +package demo.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import demo.dso.mapper.AppxMapper; +import demo.model.AppxModel; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Mapping; + +/** + * 分面演示(使用sqlhelper组件) + * + * */ +@Mapping("/page/") +@Controller +public class PageController { + @Db + AppxMapper appxMapper; + + @Mapping("test") + public Object test() throws Throwable { + Page page = new Page<>(2, 2); + + return appxMapper.appx_get_page(page); + } +} diff --git a/src/test/java/demo/controller/PlusController.java b/src/test/java/demo/controller/PlusController.java new file mode 100644 index 0000000000000000000000000000000000000000..81d4b495d806a5e6dc69235caa903d69fe1d199d --- /dev/null +++ b/src/test/java/demo/controller/PlusController.java @@ -0,0 +1,22 @@ +package demo.controller; + +import demo.dso.service.AppServicePlus; +import demo.model.AppxModel; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Mapping; + +/** + * @author noear 2022/3/28 created + */ +@Mapping("/plus/") +@Controller +public class PlusController { + @Db + AppServicePlus appServicePlus; + + @Mapping("test") + public AppxModel test() { + return appServicePlus.getById(12); + } +} diff --git a/src/test/java/demo/controller/TranController.java b/src/test/java/demo/controller/TranController.java new file mode 100644 index 0000000000000000000000000000000000000000..5a405f2776e0824456cee6b5feaaf16e30c172c4 --- /dev/null +++ b/src/test/java/demo/controller/TranController.java @@ -0,0 +1,119 @@ +package demo.controller; + +import demo.dso.service.AppService; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.data.annotation.Tran; + +@Mapping("/tran/") +@Controller +public class TranController { + @Inject + AppService appService; + + @Tran + @Mapping("test") + public void test() throws Exception { + //添加会成功 + // + appService.addApp(); + appService.addApp(); + } + + @Tran + @Mapping("test2") + public void test2() throws Exception { + //添加会失败,因为在事务里出异常了 + // + appService.addApp(); + appService.addApp(); + + throw new RuntimeException("不让你加"); + } + + @Mapping("test11") + public void test11() throws Exception { + //添加会成功 + // + appService.addApp2(); + } + + @Mapping("test12") + public void test12() throws Exception { + //添加会成功(因为异常在事务之外) // addApp2 有事务 + // + appService.addApp2(); + + throw new RuntimeException("不让你加;但还是加了:("); + } + + @Tran + @Mapping("test21") + public void test21() throws Exception { + appService.addApp2(); + } + + @Tran + @Mapping("test22") + public void test22() throws Exception { + //添加会失败,因为在事务里出异常了 + // + appService.addApp2(); + + throw new RuntimeException("不让你加"); + } + + @Tran + @Mapping("test41") + public void test41() throws Exception { + //添加会成功 + // + appService.addApp3(); + + throw new RuntimeException("不让你加,但还是成功了:("); + } + + @Tran + @Mapping("test51") + public void test51() throws Exception { + //添加会成功,因为addApp4是独立的新事务 + // + appService.addApp4(); + + throw new RuntimeException("不让你加,但还是成功了:("); + } + + @Tran + @Mapping("test61") + public void test61() throws Exception { + //会失败 + // + appService.addApp5(); + + } + + + @Mapping("test63") + public void test63() throws Exception { + //添加会成功 + // + appService.addApp5(); + } + + @Tran + @Mapping("test71") + public void test71() throws Exception { + //会成功 + // + appService.addApp6(); + + } + + @Mapping("test73") + public void test73() throws Exception { + //会失败 + // + appService.addApp6(); + } +} diff --git a/src/test/java/demo/dso/MetaObjectHandlerImpl.java b/src/test/java/demo/dso/MetaObjectHandlerImpl.java index 3e7bc842f0d04b602212b7483b5f67dd8a11cbc5..93cc74088458a519ab11abafa8f34c817006d91c 100644 --- a/src/test/java/demo/dso/MetaObjectHandlerImpl.java +++ b/src/test/java/demo/dso/MetaObjectHandlerImpl.java @@ -7,6 +7,9 @@ import org.apache.ibatis.reflection.MetaObject; * @author noear 2022/4/17 created */ public class MetaObjectHandlerImpl implements MetaObjectHandler { + public MetaObjectHandlerImpl(){ + System.out.println("....MetaObjectHandlerImpl"); + } @Override public void insertFill(MetaObject metaObject) { diff --git a/src/test/java/demo/dso/MybatisSqlSessionFactoryBuilderImpl.java b/src/test/java/demo/dso/MybatisSqlSessionFactoryBuilderImpl.java index 184fc9a7d64d316ec1185df82f0fbdd764f6a730..ac2305a2569db3488a4439c2c9d0b9a7b3193d87 100644 --- a/src/test/java/demo/dso/MybatisSqlSessionFactoryBuilderImpl.java +++ b/src/test/java/demo/dso/MybatisSqlSessionFactoryBuilderImpl.java @@ -1,9 +1,16 @@ package demo.dso; import com.baomidou.mybatisplus.core.MybatisSqlSessionFactoryBuilder; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSessionFactory; /** * @author noear 2021/10/20 created */ public class MybatisSqlSessionFactoryBuilderImpl extends MybatisSqlSessionFactoryBuilder { + @Override + public SqlSessionFactory build(Configuration configuration) { + System.out.println(".进来了."); + return super.build(configuration); + } } diff --git a/src/test/java/demo/dso/mapper/AppxMapper.java b/src/test/java/demo/dso/mapper/AppxMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..66457c4a272f52801b089373ba4c13ef67ac2b24 --- /dev/null +++ b/src/test/java/demo/dso/mapper/AppxMapper.java @@ -0,0 +1,26 @@ +package demo.dso.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import demo.model.AppxModel; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface AppxMapper { + AppxModel appx_get(); + + Page appx_get_page(Page page); + + AppxModel appx_get2(int app_id); + + void appx_add(); + + Long appx_add2(int v1); + + @Select("SELECT * FROM appx") + List> listTables(); +} + diff --git a/src/test/java/demo/dso/mapper/AppxMapper2.java b/src/test/java/demo/dso/mapper/AppxMapper2.java new file mode 100644 index 0000000000000000000000000000000000000000..d57b9705e45ee0713771d26d9784f5b64f93ae64 --- /dev/null +++ b/src/test/java/demo/dso/mapper/AppxMapper2.java @@ -0,0 +1,10 @@ +package demo.dso.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import demo.model.AppxModel; + +/** + * @author noear 2021/9/3 created + */ +public interface AppxMapper2 extends BaseMapper { +} diff --git a/src/test/java/demo/dso/mapper/AppxMapperPlus.java b/src/test/java/demo/dso/mapper/AppxMapperPlus.java new file mode 100644 index 0000000000000000000000000000000000000000..21d0749c04e9b91e57c5fbd68ab6d2f35b37b529 --- /dev/null +++ b/src/test/java/demo/dso/mapper/AppxMapperPlus.java @@ -0,0 +1,10 @@ +package demo.dso.mapper; + +import demo.dso.mybatisplus_ext.MyBaseMapper; +import demo.model.AppxModel; + +/** + * @author noear 2022/3/28 created + */ +public interface AppxMapperPlus extends MyBaseMapper { +} diff --git a/src/test/java/demo/dso/mapper/AppxMapperPlusEx.java b/src/test/java/demo/dso/mapper/AppxMapperPlusEx.java new file mode 100644 index 0000000000000000000000000000000000000000..3fd098e9ec8bac54c04fde52e62c02a4cd632a99 --- /dev/null +++ b/src/test/java/demo/dso/mapper/AppxMapperPlusEx.java @@ -0,0 +1,10 @@ +package demo.dso.mapper; + +import org.apache.ibatis.annotations.Mapper; + +/** + * @author noear 2022/10/5 created + */ +@Mapper +public interface AppxMapperPlusEx extends AppxMapperPlus{ +} diff --git a/src/test/java/demo/dso/mapper/UserMapper.java b/src/test/java/demo/dso/mapper/UserMapper.java index 8986e2a9443ffab2dfe0096bbe6119e512627111..5141704d40ab2b429794b248a96b681b956a96a1 100644 --- a/src/test/java/demo/dso/mapper/UserMapper.java +++ b/src/test/java/demo/dso/mapper/UserMapper.java @@ -1,10 +1,12 @@ package demo.dso.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import demo.model.User; +import demo.model.UserModel; +import org.apache.ibatis.annotations.Mapper; /** - * @author 颖 + * @author noear 2022/4/5 created */ -public interface UserMapper extends BaseMapper { -} \ No newline at end of file +@Mapper +public interface UserMapper extends BaseMapper { +} diff --git a/src/test/java/demo/dso/mybatisplus_ext/MyBaseMapper.java b/src/test/java/demo/dso/mybatisplus_ext/MyBaseMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..51f20a0857635d596f9392dd60dcc3d43035423e --- /dev/null +++ b/src/test/java/demo/dso/mybatisplus_ext/MyBaseMapper.java @@ -0,0 +1,6 @@ +package demo.dso.mybatisplus_ext; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface MyBaseMapper extends BaseMapper { +} diff --git a/src/test/java/demo/dso/mybatisplus_ext/MyLogicSqlInjector.java b/src/test/java/demo/dso/mybatisplus_ext/MyLogicSqlInjector.java new file mode 100644 index 0000000000000000000000000000000000000000..e5851568134235a45203f54d71b8f451be382746 --- /dev/null +++ b/src/test/java/demo/dso/mybatisplus_ext/MyLogicSqlInjector.java @@ -0,0 +1,26 @@ +package demo.dso.mybatisplus_ext; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; +import com.baomidou.mybatisplus.core.injector.methods.SelectById; +import com.baomidou.mybatisplus.core.metadata.TableInfo; + +import java.util.List; + +/** + * 参考官网:https://baomidou.com/pages/42ea4a/ + */ +public class MyLogicSqlInjector extends DefaultSqlInjector { + + /** + * 如果只需增加方法,保留MP自带方法 + * 可以super.getMethodList() 再add + * @return + */ + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + List methodList = super.getMethodList(mapperClass, tableInfo); + methodList.add(new SelectById()); + return methodList; + } +} \ No newline at end of file diff --git a/src/test/java/demo/dso/service/AppService.java b/src/test/java/demo/dso/service/AppService.java new file mode 100644 index 0000000000000000000000000000000000000000..c4d96f477a0ff6f77f5b1dd5822cd41fcb243b38 --- /dev/null +++ b/src/test/java/demo/dso/service/AppService.java @@ -0,0 +1,50 @@ +package demo.dso.service; + +import demo.dso.mapper.AppxMapper; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; +import org.noear.solon.data.annotation.Tran; +import org.noear.solon.data.tran.TranPolicy; + +@Component +public class AppService { + @Db + AppxMapper sqlMapper1; + + public Object getApp(int app_id) throws Exception { + return sqlMapper1.appx_get2(app_id); + } + + public Object getApp(String app_id) throws Exception { + return sqlMapper1.appx_get2(Integer.parseInt(app_id)); + } + + public void addApp(){ + sqlMapper1.appx_add(); + } + + @Tran + public void addApp2(){ + sqlMapper1.appx_add(); + } + + @Tran(policy = TranPolicy.nested) + public void addApp3(){ + sqlMapper1.appx_add(); + } + + @Tran(policy = TranPolicy.requires_new) + public void addApp4(){ + sqlMapper1.appx_add(); + } + + @Tran(policy = TranPolicy.never) + public void addApp5(){ + sqlMapper1.appx_add(); + } + + @Tran(policy = TranPolicy.mandatory) + public void addApp6(){ + sqlMapper1.appx_add(); + } +} diff --git a/src/test/java/demo/dso/service/AppServicePlus.java b/src/test/java/demo/dso/service/AppServicePlus.java new file mode 100644 index 0000000000000000000000000000000000000000..7ade763620735ae88b8a98427c1b3a7ee43f9674 --- /dev/null +++ b/src/test/java/demo/dso/service/AppServicePlus.java @@ -0,0 +1,11 @@ +package demo.dso.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import demo.model.AppxModel; +//import org.noear.solon.extend.mybatisplus.service.IService; + +/** + * @author noear 2022/3/28 created + */ +public interface AppServicePlus extends IService { +} diff --git a/src/test/java/demo/dso/service/AppServicePlusImpl.java b/src/test/java/demo/dso/service/AppServicePlusImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..e027a7df92681bc8303b9a264c926c94330ed464 --- /dev/null +++ b/src/test/java/demo/dso/service/AppServicePlusImpl.java @@ -0,0 +1,13 @@ +package demo.dso.service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import demo.dso.mapper.AppxMapperPlusEx; +import demo.model.AppxModel; +import org.noear.solon.annotation.Component; + +/** + * @author noear 2022/3/28 created + */ +@Component +public class AppServicePlusImpl extends ServiceImpl implements AppServicePlus { +} diff --git a/src/test/java/demo/dso/service/TestService.java b/src/test/java/demo/dso/service/TestService.java new file mode 100644 index 0000000000000000000000000000000000000000..178aa0092a0de687bf77a86c4438c34f8251596d --- /dev/null +++ b/src/test/java/demo/dso/service/TestService.java @@ -0,0 +1,14 @@ +package demo.dso.service; + +import demo.model.AppxModel; +import org.noear.solon.annotation.Component; + +/** + * @author noear 2022/4/26 created + */ +@Component +public class TestService extends TestServiceBase { + public AppxModel getApp(int app_id) throws Exception { + return sqlMapper1.appx_get2(app_id); + } +} diff --git a/src/test/java/demo/dso/service/TestServiceBase.java b/src/test/java/demo/dso/service/TestServiceBase.java new file mode 100644 index 0000000000000000000000000000000000000000..c55e7e935b981d5ddfcb344c68dcefb5c2cb2a13 --- /dev/null +++ b/src/test/java/demo/dso/service/TestServiceBase.java @@ -0,0 +1,12 @@ +package demo.dso.service; + +import demo.dso.mapper.AppxMapper; +import org.apache.ibatis.solon.annotation.Db; + +/** + * @author noear 2022/4/26 created + */ +public abstract class TestServiceBase { + @Db + protected AppxMapper sqlMapper1; +} \ No newline at end of file diff --git a/src/test/java/demo/dso/service/UserService.java b/src/test/java/demo/dso/service/UserService.java deleted file mode 100644 index 5724e23a9f3f925e0bd8572e4208265d898a1581..0000000000000000000000000000000000000000 --- a/src/test/java/demo/dso/service/UserService.java +++ /dev/null @@ -1,24 +0,0 @@ -package demo.dso.service; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import demo.dso.mapper.UserMapper; -import demo.model.User; -import org.noear.solon.annotation.Component; -import org.noear.solon.annotation.Inject; - -import java.util.List; - -/** - * @author noear 2021/9/9 created - */ -@Component -public class UserService { - @Inject - UserMapper userMapper; - - public List getUserList() { - assert userMapper != null; - - return userMapper.selectList(new QueryWrapper<>()); - } -} diff --git a/src/test/java/demo/model/AppxModel.java b/src/test/java/demo/model/AppxModel.java new file mode 100644 index 0000000000000000000000000000000000000000..c35b515f76b5cf78adcde0231029c26248aef71e --- /dev/null +++ b/src/test/java/demo/model/AppxModel.java @@ -0,0 +1,34 @@ +package demo.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +@TableName("appx") +public class AppxModel { + @TableId("app_id") + private Integer appId; + private Integer agroupId; + private String note; + private String appKey; + private Integer arIsExamine; + + public Integer getAgroupId() { + return agroupId; + } + + public Integer getAppId() { + return appId; + } + + public Integer getArIsExamine() { + return arIsExamine; + } + + public String getAppKey() { + return appKey; + } + + public String getNote() { + return note; + } +} diff --git a/src/test/java/demo/model/DbColumn.java b/src/test/java/demo/model/DbColumn.java new file mode 100644 index 0000000000000000000000000000000000000000..b59c114758d11b0bd4190306ef2b2401909a9afe --- /dev/null +++ b/src/test/java/demo/model/DbColumn.java @@ -0,0 +1,72 @@ +package demo.model; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * @author JcYen + * @Date 2020/5/27 + * @Version 1.0 + */ +@Getter +@Setter +@ToString +public class DbColumn { + + /** + * 是否主键 + */ + private Boolean isKey; + + /** + * 是否为空 + */ + private Boolean isNull; + + /** + * 是否创建列 + */ + private Boolean isCreate; + + /** + * 是否更新列 + */ + private Boolean isUpdate; + + /** + * 表名 + */ + private String tableName; + + /** + * 列名 + */ + private String columnName; + + /** + * 数据类型 + */ + private String dataType; + + /** + * 最大长度 + */ + private Long maxLength; + + /** + * 备注 + */ + private String comment; + + /** + * 整数位精确度 + */ + private Integer numericPrecision; + + /** + * 小数位精确度 + */ + private Integer numericScale; + +} diff --git a/src/test/java/demo/model/DbTable.java b/src/test/java/demo/model/DbTable.java new file mode 100644 index 0000000000000000000000000000000000000000..fac721e68783b272ff30d478fe637dd329ba9e30 --- /dev/null +++ b/src/test/java/demo/model/DbTable.java @@ -0,0 +1,19 @@ +package demo.model; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * @author noear 2021/7/5 created + */ +@Getter +@Setter +@ToString +public class DbTable { + + private String tableName; + + private String tableComment; + +} diff --git a/src/test/java/demo/model/User.java b/src/test/java/demo/model/User.java deleted file mode 100644 index faff025dabffc8093a3fd5b45b8dc07991556cc8..0000000000000000000000000000000000000000 --- a/src/test/java/demo/model/User.java +++ /dev/null @@ -1,31 +0,0 @@ -package demo.model; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; - -/** - * @author iYarnFog - */ -@TableName(value = "users") -public class User { - @TableId(type = IdType.AUTO) - private Long id; - private String uuid; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } -} diff --git a/src/test/java/demo/model/UserModel.java b/src/test/java/demo/model/UserModel.java new file mode 100644 index 0000000000000000000000000000000000000000..7d24e35f789b3803860f7941e16298beb6c9e223 --- /dev/null +++ b/src/test/java/demo/model/UserModel.java @@ -0,0 +1,22 @@ +package demo.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; + +/** + * @author noear 2022/4/5 created + */ +@Setter +@Getter +@TableName("user") +public class UserModel { + @TableId("id") + Long id; + Long userId; + String nickname; + String password; +// @TableLogic + Integer deleted; +} diff --git a/src/test/java/features/AnnoTest.java b/src/test/java/features/AnnoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8359b9a3007cd2e2570ee093260b0f638cfd175b --- /dev/null +++ b/src/test/java/features/AnnoTest.java @@ -0,0 +1,23 @@ +package features; + +import demo.DemoApp; +import demo.dso.mapper.AppxMapper; +import org.apache.ibatis.solon.annotation.Db; +import org.junit.jupiter.api.Test; +import org.noear.solon.test.SolonTest; + +/** + * @author noear 2021/5/16 created + */ + +@SolonTest(DemoApp.class) +public class AnnoTest { + + @Db + AppxMapper appxMapper; + + @Test + public void test() { + assert appxMapper.listTables().size() > 0; + } +} diff --git a/src/test/java/features/InsertTest.java b/src/test/java/features/InsertTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c79e89dbd424364c661d4bbfe07ed48d347ffcf4 --- /dev/null +++ b/src/test/java/features/InsertTest.java @@ -0,0 +1,25 @@ +package features; + +import demo.DemoApp; +import demo.dso.mapper.AppxMapper; +import org.apache.ibatis.solon.annotation.Db; +import org.junit.jupiter.api.Test; +import org.noear.solon.test.SolonTest; + +/** + * @author noear 2021/5/16 created + */ + +@SolonTest(DemoApp.class) +public class InsertTest { + + @Db + AppxMapper appxMapper; + + @Test + public void test(){ + + long id = appxMapper.appx_add2(12912); + System.out.println(id); + } +} diff --git a/src/test/java/features/PageTest.java b/src/test/java/features/PageTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5ade12bc49fa535fe88968534357501f4a00a0f6 --- /dev/null +++ b/src/test/java/features/PageTest.java @@ -0,0 +1,17 @@ +package features; + +import demo.DemoApp; +import org.junit.jupiter.api.Test; +import org.noear.snack.ONode; +import org.noear.solon.test.HttpTester; +import org.noear.solon.test.SolonTest; + + +@SolonTest(DemoApp.class) +public class PageTest extends HttpTester { + @Test + public void test() throws Exception { + String json = path("/page/test").get(); + assert ONode.loadStr(json).get("records").count() == 2; + } +} diff --git a/src/test/java/features/PlusServiceTest.java b/src/test/java/features/PlusServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..79810b06d45f9272b05ac8e312c7cbf6443f5cfa --- /dev/null +++ b/src/test/java/features/PlusServiceTest.java @@ -0,0 +1,88 @@ +package features; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import demo.DemoApp; +import demo.dso.mapper.AppxMapperPlus; +import demo.dso.mapper.AppxMapperPlusEx; +import demo.dso.service.AppServicePlus; +import demo.model.AppxModel; +import org.apache.ibatis.solon.annotation.Db; +import org.junit.jupiter.api.Test; +import org.noear.solon.annotation.Inject; +import org.noear.solon.test.SolonTest; + +/** + * @author noear 2022/3/28 created + */ +@SolonTest(DemoApp.class) +public class PlusServiceTest { + + @Db + AppServicePlus appServicePlus; + @Inject + AppServicePlus appServicePlus2; + + @Db + AppxMapperPlus appxMapperPlus; + @Db + AppxMapperPlus appxMapperPlus2; + + @Db + AppxMapperPlusEx appxMapperPlusEx; + @Db + AppxMapperPlusEx appxMapperPlusEx2; + + @Test + public void selectById() { + AppxModel app = appServicePlus.getById(2); + System.out.println(app); + + assert app != null; + assert app.getAppId() == 2; + } + + @Test + public void selectById1() { + AppxModel app = appxMapperPlus.selectById(2); + System.out.println(app); + + assert app != null; + assert app.getAppId() == 2; + } + + @Test + public void selectById2() { + AppxModel app = appxMapperPlusEx.selectById(2); + System.out.println(app); + + assert app != null; + assert app.getAppId() == 2; + } + + @Test + public void selectOne() { + AppxModel app = appServicePlus.getOne(new QueryWrapper().eq("app_id",2)); + System.out.println(app); + + assert app != null; + assert app.getAppId() == 2; + } + + + @Test + public void selectPage() { + Page page = new Page<>(1, 10); + IPage iPage = appServicePlus.page(page, new QueryWrapper<>()); + + + assert iPage != null; + + System.out.println("iPage.getRecords().size(): " + iPage.getRecords().size()); + assert iPage.getRecords().size() > 0; + + System.out.println("iPage.getTotal(): " + iPage.getTotal()); + assert iPage.getTotal() > 0; + } +} diff --git a/src/test/java/features/PlusTest.java b/src/test/java/features/PlusTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d4f25969383b2817e39909299e173bd64eca2918 --- /dev/null +++ b/src/test/java/features/PlusTest.java @@ -0,0 +1,56 @@ +package features; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import demo.DemoApp; +import demo.dso.mapper.AppxMapper2; +import demo.model.AppxModel; +import org.junit.jupiter.api.Test; +import org.noear.solon.annotation.Inject; +import org.noear.solon.test.SolonTest; + + +/** + * @author noear 2021/9/3 created + */ +@SolonTest(DemoApp.class) +public class PlusTest { + + @Inject + AppxMapper2 appxMapper2; + + @Test + public void selectById() { + AppxModel app = appxMapper2.selectById(2); + System.out.println(app); + + assert app != null; + assert app.getAppId() == 2; + } + + @Test + public void selectOne() { + AppxModel app = appxMapper2.selectOne(new QueryWrapper().eq("app_id",2)); + System.out.println(app); + + assert app != null; + assert app.getAppId() == 2; + } + + + @Test + public void selectPage() { + Page page = new Page<>(1, 10); + IPage iPage = appxMapper2.selectPage(page, new QueryWrapper<>()); + + + assert iPage != null; + + System.out.println("iPage.getRecords().size(): " + iPage.getRecords().size()); + assert iPage.getRecords().size() > 0; + + System.out.println("iPage.getTotal(): " + iPage.getTotal()); + assert iPage.getTotal() > 0; + } +} diff --git a/src/test/java/features/TranTest.java b/src/test/java/features/TranTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a555a44d07c453189a02059a7b8a3152aa857667 --- /dev/null +++ b/src/test/java/features/TranTest.java @@ -0,0 +1,153 @@ +package features; + +import demo.DemoApp; +import org.junit.jupiter.api.Test; +import org.noear.solon.annotation.Inject; +import org.noear.solon.data.sql.SqlUtils; +import org.noear.solon.test.HttpTester; +import org.noear.solon.test.SolonTest; + +import java.sql.SQLException; + +@SolonTest(DemoApp.class) +public class TranTest extends HttpTester { + @Inject + SqlUtils sqlUtils; + + private void clear() throws Exception { + sqlUtils.sql("DELETE FROM test").update(); + } + + private long count() throws SQLException { + return sqlUtils.sql("select count(1) from test").queryValue(); + } + + @Test + public void test() throws Exception { + clear(); + path("/tran/test").get(); + path("/tran/test").get(); + path("/tran/test").get(); + assert count() == 6; + } + + @Test + public void test2() throws Exception { + clear(); + path("/tran/test2").get(); + path("/tran/test2").get(); + path("/tran/test2").get(); + assert count() == 0; + } + + @Test + public void test11() throws Exception { + clear(); + path("/tran/test11").get(); + path("/tran/test11").get(); + path("/tran/test11").get(); + assert count() == 3; + } + + @Test + public void test12() throws Exception { + clear(); + path("/tran/test12").get(); + path("/tran/test12").get(); + path("/tran/test12").get(); + assert count() == 3; + } + + @Test + public void test21() throws Exception { + clear(); + path("/tran/test21").get(); + path("/tran/test21").get(); + path("/tran/test21").get(); + assert count() == 3; + } + + @Test + public void test22() throws Exception { + clear(); + path("/tran/test22").get(); + path("/tran/test22").get(); + path("/tran/test22").get(); + long count = count(); + System.out.println(count); + assert count == 0; + } + + + @Test + public void test41() throws Exception { + clear(); + path("/tran/test41").get(); + path("/tran/test41").get(); + path("/tran/test41").get(); + + long count = count(); + System.out.println(count); + assert count == 0; + } + + @Test + public void test51() throws Exception { + clear(); + path("/tran/test51").get(); + path("/tran/test51").get(); + path("/tran/test51").get(); + + long count = count(); + System.out.println(count); + assert count == 3; + } + + @Test + public void test61() throws Exception { + clear(); + path("/tran/test61").get(); + path("/tran/test61").get(); + path("/tran/test61").get(); + + long count = count(); + System.out.println(count); + assert count == 0; + } + + @Test + public void test63() throws Exception { + clear(); + path("/tran/test63").get(); + path("/tran/test63").get(); + path("/tran/test63").get(); + + long count = count(); + System.out.println(count); + assert count == 3; + } + + @Test + public void test71() throws Exception { + clear(); + path("/tran/test71").get(); + path("/tran/test71").get(); + path("/tran/test71").get(); + + long count = count(); + System.out.println(count); + assert count == 3; + } + + @Test + public void test73() throws Exception { + clear(); + path("/tran/test73").get(); + path("/tran/test73").get(); + path("/tran/test73").get(); + + long count = count(); + System.out.println(count); + assert count == 0; + } +} diff --git a/src/test/java/features/IGenericTypeResolverImplTest.java b/src/test/java/labs/IGenericTypeResolverImplTest.java similarity index 91% rename from src/test/java/features/IGenericTypeResolverImplTest.java rename to src/test/java/labs/IGenericTypeResolverImplTest.java index a2307e9040770f0f65189adf84e889a73de0cd0f..35ebb0d09bf4d905bd8b0bc427dbcb07e4e3a481 100644 --- a/src/test/java/features/IGenericTypeResolverImplTest.java +++ b/src/test/java/labs/IGenericTypeResolverImplTest.java @@ -1,4 +1,4 @@ -package features; +package labs; import com.baomidou.mybatisplus.core.mapper.Mapper; @@ -21,7 +21,7 @@ public class IGenericTypeResolverImplTest { } private interface Demo {} - private abstract static class DemoImpl implements Map, IGenericTypeResolverImplTest.Demo { + private abstract static class DemoImpl implements Map, Demo { } } \ No newline at end of file diff --git a/src/test/resources/app.yml b/src/test/resources/app.yml index 6d738e2fea7889e347ee59c0c41e39b7c668d2b7..e7dba81032394af8ff5d6b5798df8553da58af36 100644 --- a/src/test/resources/app.yml +++ b/src/test/resources/app.yml @@ -1,24 +1,30 @@ -server: - port: 6040 +solon.app: + name: demoapp + group: demo + +solon.output.meta: 1 -# 配置数据源 solon.dataSources: db1!: class: "com.zaxxer.hikari.HikariDataSource" - jdbcUrl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true - driverClassName: com.mysql.cj.jdbc.Driver - username: root - password: 1234 + jdbcUrl: "jdbc:h2:mem:test;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL;DATABASE_TO_LOWER=TRUE;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE" + driverClassName: "org.h2.Driver" -mybatis: - db1: - mappers: - - "demo.dso.mapper.*" - configuration: - cacheEnabled: false - mapUnderscoreToCamelCase: true - globalConfig: - banner: false - metaObjectHandler: "demo.dso.MetaObjectHandlerImpl" - dbConfig: - logicDeleteField: "deleted" +#默认 +mybatis.db1: + typeAliases: #支持包名 或 类名 //支持 ** 和 * + - "demo.model" + mappers: #支持包名 或 类名 或 xml(.xml结尾)//支持 ** 和 * + - "demo.dso.mapper" + - "classpath:mapper/*.xml" + configuration: + cacheEnabled: false + mapperVerifyEnabled: false + mapUnderscoreToCamelCase: true + logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl + globalConfig: + banner: false + metaObjectHandler: "demo.dso.MetaObjectHandlerImpl" + dbConfig: + logicDeleteField: "deleted" + logicDeleteValue: "2" diff --git a/src/test/resources/db.sql b/src/test/resources/db.sql new file mode 100644 index 0000000000000000000000000000000000000000..1ef951ec9daa0eba8756f9f2f8e0d67e3f10f22e --- /dev/null +++ b/src/test/resources/db.sql @@ -0,0 +1,45 @@ + +CREATE TABLE `appx` ( + `app_id` int NOT NULL AUTO_INCREMENT COMMENT '应用ID', + `app_key` varchar(40) DEFAULT NULL COMMENT '应用访问KEY', + `akey` varchar(40) DEFAULT NULL COMMENT '(用于取代app id 形成的唯一key) //一般用于推广注册之类', + `ugroup_id` int DEFAULT '0' COMMENT '加入的用户组ID', + `agroup_id` int DEFAULT NULL COMMENT '加入的应用组ID', + `name` varchar(50) DEFAULT NULL COMMENT '应用名称', + `note` varchar(50) DEFAULT NULL COMMENT '应用备注', + `ar_is_setting` int NOT NULL DEFAULT '0' COMMENT '是否开放设置', + `ar_is_examine` int NOT NULL DEFAULT '0' COMMENT '是否审核中(0: 没审核 ;1:审核中)', + `ar_examine_ver` int NOT NULL DEFAULT '0' COMMENT '审核 中的版本号', + `log_fulltime` datetime DEFAULT NULL, + PRIMARY KEY (`app_id`) +); + +CREATE TABLE `test` ( + `id` int NOT NULL AUTO_INCREMENT, + `v1` int DEFAULT NULL, + `v2` int DEFAULT NULL, + PRIMARY KEY (`id`) +); + +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (1, '1', 'a', 1, 1, 'iOS-0', '', 1, 0, 0, '2017-08-25 10:59:44'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (2, '2', 'b', 1, 1, 'Android-0', '', 0, 0, 0, '2017-08-11 18:05:27'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (3, '3', 'c', 1, 1, 'Android-yyb', '000', 1, 0, 0, '2017-08-25 10:59:44'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (4, '4', 'd', 1, 1, 'Android-bd', '', 0, 0, 0, '2017-08-04 17:19:41'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (5, '5', 'e', 1, 1, 'Android-91', '', 0, 0, 0, '2017-08-04 17:16:18'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (6, '6', 'f', 1, 1, 'Android-92', '', 0, 0, 0, '2017-08-04 17:23:45'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (7, '7', 'g', 1, 1, 'Android-93', '', 0, 0, 0, '2017-08-25 10:47:44'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (8, '8', 'h', 1, 1, 'HarmonyOS-hw', NULL, 1, 0, 0, '2017-08-25 10:59:44'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (9, '9', 'i', 1, 1, 'Android-op', '', 0, 0, 0, '2017-08-25 10:47:44'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (10, '10', 'j', 1, 1, 'Android-pp', '', 0, 0, 0, '2017-08-04 17:36:20'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (11, '11', 'k', 1, 1, 'Android-1', '', 0, 0, 0, '2017-08-04 17:36:32'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (12, '12', 'n', 1, 1, 'Android-2', '', 0, 0, 0, '2017-08-04 17:36:46'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (13, '13', 'm', 1, 1, 'Android-3', '', 0, 0, 0, '2017-08-04 17:37:00'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (14, '14', 'o', 1, 1, 'Android-4', '', 0, 0, 0, '2017-08-25 10:55:37'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (15, '15', 'x', 1, 1, 'Android-5', '', 0, 0, 0, '2017-08-25 10:55:37'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (16, '16', 'y', 1, 1, 'iOS-Pro', NULL, 0, 0, 0, '2017-08-04 17:38:15'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (17, '17', 'z', 1, 1, 'iOS-2', NULL, 0, 0, 0, '2017-08-04 17:38:26'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (18, '18', 'u', 1, 1, 'iOS-3', NULL, 0, 0, 0, '2017-08-04 17:38:40'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (19, '19', 'w', 1, 1, 'Android-a', NULL, 0, 0, 0, '2017-08-04 17:38:57'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (20, '20', 'a1', 1, 1, 'Android-b', NULL, 0, 0, 0, '2017-08-04 17:39:09'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (21, '21', 'b1', 1, 1, 'Android-c', NULL, 0, 0, 0, '2017-08-04 17:39:23'); +INSERT INTO `appx` (`app_id`, `app_key`, `akey`, `ugroup_id`, `agroup_id`, `name`, `note`, `ar_is_setting`, `ar_is_examine`, `ar_examine_ver`, `log_fulltime`) VALUES (22, '22', 'c1', 1, 1, 'Android-d', NULL, 1, 0, 0, '2017-08-04 17:39:39'); diff --git a/src/test/resources/mapper/AppxMapper.xml b/src/test/resources/mapper/AppxMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..5cd713cc7fef782a1e9f59633edcdda2acff5c6d --- /dev/null +++ b/src/test/resources/mapper/AppxMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + insert into test (v1) values (1024); + + + + insert into test (v1) values (#{v1}); + + + \ No newline at end of file