diff --git a/pom.xml b/pom.xml index 3d26db8..34fa768 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,7 @@ 1.5.0 2.0.0 3.1.68 + 1.9.7-spring-boot4 5.8.43 @@ -120,7 +121,7 @@ cn.xbatis xbatis-spring-boot-parent - 1.9.6-spring-boot4 + ${xbatis.version} pom import diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-common-test/src/main/java/com/lanyuanxiaoyao/service/template/database/common/test/AbstractTestApplication.java b/spring-boot-service-template-database/spring-boot-service-template-database-common-test/src/main/java/com/lanyuanxiaoyao/service/template/database/common/test/AbstractTestApplication.java index 42645a9..130a826 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-common-test/src/main/java/com/lanyuanxiaoyao/service/template/database/common/test/AbstractTestApplication.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-common-test/src/main/java/com/lanyuanxiaoyao/service/template/database/common/test/AbstractTestApplication.java @@ -26,9 +26,7 @@ public class AbstractTestApplication { var cid3 = saveItem("company", randomCompany()).get("data").asLong(); formatLog("List"); - var companies1 = listItems("company"); - Assert.isTrue(companies1.at("/data/items").size() == 3, "数量错误"); - Assert.isTrue(companies1.at("/data/total").asLong() == 3, "返回数量错误"); + assertListItems(listItems("company"), 3, 3); formatLog("Detail"); var company1 = detailItem("company", cid1); @@ -51,9 +49,7 @@ public class AbstractTestApplication { } } """; - var companies2 = listItems("company", pageRequest); - Assert.isTrue(companies2.at("/data/items").size() == 2, "数量错误"); - Assert.isTrue(companies2.at("/data/total").asLong() == 3, "返回数量错误"); + assertListItems(listItems("company", pageRequest), 2, 3); formatLog("List Queryable"); // language=JSON @@ -104,18 +100,21 @@ public class AbstractTestApplication { } } """; - var companies3 = listItems("company", queryRequest); - Assert.isTrue(companies3.at("/data/items").size() == 1, "数量错误"); - Assert.isTrue(companies3.at("/data/total").asLong() == 1, "返回数量错误"); + assertListItems(listItems("company", queryRequest), 1, 1); formatLog("Clean"); removeItem("company", cid1); - Assert.isTrue(listItems("company").at("/data/items").size() == 2, "数量错误"); - Assert.isTrue(listItems("company").at("/data/total").asLong() == 2, "返回数量错误"); + assertListItems(listItems("company"), 2, 2); removeItem("company", cid2); removeItem("company", cid3); - Assert.isTrue(listItems("company").at("/data/items").isEmpty(), "数量错误"); - Assert.isTrue(listItems("company").at("/data/total").asLong() == 0, "返回数量错误"); + assertListItems(listItems("company"), 0, 0); + } + + protected void assertListItems(JsonNode node, int itemSizeTarget, int itemTotalTarget) { + var itemSize = node.at("/data/items").size(); + var itemTotal = node.at("/data/total").asLong(); + Assert.isTrue(itemSize == itemSizeTarget, "数量错误 (%d)".formatted(itemSize)); + Assert.isTrue(itemTotal == itemTotalTarget, "分页总数错误 (%d)".formatted(itemTotal)); } protected void formatLog(String text) { diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/pom.xml b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/pom.xml index 63cb516..afe7219 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/pom.xml +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/pom.xml @@ -29,8 +29,8 @@ - com.h2database - h2 + com.lanyuanxiaoyao + spring-boot-service-template-database-common-test test diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/configuration/MybatisConfiguration.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/configuration/MybatisConfiguration.java similarity index 64% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/configuration/MybatisConfiguration.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/configuration/MybatisConfiguration.java index 57ab8af..f97cf4e 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/configuration/MybatisConfiguration.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/configuration/MybatisConfiguration.java @@ -1,9 +1,9 @@ -package com.lanyuanxiaoyao.service.template.xbatis.configuration; +package com.lanyuanxiaoyao.service.template.database.xbatis.configuration; import cn.xbatis.core.incrementer.GeneratorFactory; import cn.xbatis.core.mybatis.mapper.BasicMapper; -import com.lanyuanxiaoyao.service.template.xbatis.entity.SnowflakeIdGenerator; -import com.lanyuanxiaoyao.service.template.xbatis.mapper.MybatisBasicMapper; +import com.lanyuanxiaoyao.service.template.database.xbatis.entity.SnowflakeIdGenerator; +import com.lanyuanxiaoyao.service.template.database.xbatis.mapper.MybatisBasicMapper; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/controller/SimpleControllerSupport.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/controller/SimpleControllerSupport.java similarity index 96% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/controller/SimpleControllerSupport.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/controller/SimpleControllerSupport.java index 5b4e81b..b524769 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/controller/SimpleControllerSupport.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/controller/SimpleControllerSupport.java @@ -1,11 +1,11 @@ -package com.lanyuanxiaoyao.service.template.xbatis.controller; +package com.lanyuanxiaoyao.service.template.database.xbatis.controller; import com.lanyuanxiaoyao.service.template.common.helper.ObjectHelper; import com.lanyuanxiaoyao.service.template.database.common.controller.SimpleController; import com.lanyuanxiaoyao.service.template.database.common.entity.GlobalResponse; import com.lanyuanxiaoyao.service.template.database.common.entity.Query; -import com.lanyuanxiaoyao.service.template.xbatis.entity.SimpleEntity; -import com.lanyuanxiaoyao.service.template.xbatis.service.SimpleServiceSupport; +import com.lanyuanxiaoyao.service.template.database.xbatis.entity.SimpleEntity; +import com.lanyuanxiaoyao.service.template.database.xbatis.service.SimpleServiceSupport; import java.util.function.Function; import lombok.extern.slf4j.Slf4j; import org.springframework.transaction.annotation.Transactional; diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/entity/IdOnlyEntity.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/IdOnlyEntity.java similarity index 83% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/entity/IdOnlyEntity.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/IdOnlyEntity.java index 5923478..44eeaa4 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/entity/IdOnlyEntity.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/IdOnlyEntity.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.xbatis.entity; +package com.lanyuanxiaoyao.service.template.database.xbatis.entity; import cn.xbatis.db.IdAutoType; import cn.xbatis.db.annotations.TableId; diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/LogicDeleteEntity.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/LogicDeleteEntity.java new file mode 100644 index 0000000..a9df500 --- /dev/null +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/LogicDeleteEntity.java @@ -0,0 +1,20 @@ +package com.lanyuanxiaoyao.service.template.database.xbatis.entity; + +import cn.xbatis.db.annotations.LogicDelete; +import cn.xbatis.db.annotations.LogicDeleteTime; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.FieldNameConstants; + +@Getter +@Setter +@ToString +@FieldNameConstants +public class LogicDeleteEntity extends IdOnlyEntity { + @LogicDelete + private Boolean deleted = false; + @LogicDeleteTime + private LocalDateTime deletedTime; +} diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/entity/SimpleEntity.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/SimpleEntity.java similarity index 81% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/entity/SimpleEntity.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/SimpleEntity.java index 0d033d4..12fb23f 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/entity/SimpleEntity.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/SimpleEntity.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.xbatis.entity; +package com.lanyuanxiaoyao.service.template.database.xbatis.entity; import cn.xbatis.db.annotations.TableField; import java.time.LocalDateTime; @@ -11,7 +11,7 @@ import lombok.experimental.FieldNameConstants; @Setter @ToString(callSuper = true) @FieldNameConstants -public class SimpleEntity extends IdOnlyEntity { +public class SimpleEntity extends LogicDeleteEntity { @TableField(defaultValue = "{NOW}", defaultValueFillAlways = true) private LocalDateTime createdTime; @TableField(defaultValue = "{NOW}", defaultValueFillAlways = true, updateDefaultValue = "{NOW}", updateDefaultValueFillAlways = true) diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/entity/SnowflakeIdGenerator.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/SnowflakeIdGenerator.java similarity index 80% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/entity/SnowflakeIdGenerator.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/SnowflakeIdGenerator.java index 2824536..80969b6 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/entity/SnowflakeIdGenerator.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/SnowflakeIdGenerator.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.xbatis.entity; +package com.lanyuanxiaoyao.service.template.database.xbatis.entity; import cn.xbatis.core.incrementer.Generator; import com.lanyuanxiaoyao.service.template.database.common.helper.SnowflakeHelper; diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/mapper/MybatisBasicMapper.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/mapper/MybatisBasicMapper.java similarity index 62% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/mapper/MybatisBasicMapper.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/mapper/MybatisBasicMapper.java index b506f71..9e1a151 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/mapper/MybatisBasicMapper.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/mapper/MybatisBasicMapper.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.xbatis.mapper; +package com.lanyuanxiaoyao.service.template.database.xbatis.mapper; import cn.xbatis.core.mybatis.mapper.BasicMapper; diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/service/SimpleServiceSupport.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/service/SimpleServiceSupport.java similarity index 91% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/service/SimpleServiceSupport.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/service/SimpleServiceSupport.java index 21d7417..60a4009 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/xbatis/service/SimpleServiceSupport.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/main/java/com/lanyuanxiaoyao/service/template/database/xbatis/service/SimpleServiceSupport.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.xbatis.service; +package com.lanyuanxiaoyao.service.template.database.xbatis.service; import cn.xbatis.core.mybatis.mapper.context.Pager; import cn.xbatis.core.sql.MybatisCmdFactory; @@ -9,8 +9,8 @@ import com.lanyuanxiaoyao.service.template.database.common.entity.Query; import com.lanyuanxiaoyao.service.template.database.common.exception.IdNotFoundException; import com.lanyuanxiaoyao.service.template.database.common.service.QueryParser; import com.lanyuanxiaoyao.service.template.database.common.service.SimpleService; -import com.lanyuanxiaoyao.service.template.xbatis.entity.SimpleEntity; -import com.lanyuanxiaoyao.service.template.xbatis.mapper.MybatisBasicMapper; +import com.lanyuanxiaoyao.service.template.database.xbatis.entity.SimpleEntity; +import com.lanyuanxiaoyao.service.template.database.xbatis.mapper.MybatisBasicMapper; import db.sql.api.cmd.LikeMode; import db.sql.api.impl.cmd.basic.OrderByDirection; import db.sql.api.impl.cmd.struct.Where; @@ -37,13 +37,14 @@ public abstract class SimpleServiceSupport implemen @Transactional(rollbackFor = Throwable.class) @Override public Long save(ENTITY entity) { - return (long) mapper.save(entity); + mapper.saveOrUpdate(entity); + return entity.getId(); } @Transactional(rollbackFor = Throwable.class) @Override public void save(Iterable entities) { - mapper.save(entities); + mapper.saveOrUpdate(entities); } @Override @@ -75,7 +76,6 @@ public abstract class SimpleServiceSupport implemen var size = Math.max(ObjectHelper.defaultIfNull(query.page().size(), DEFAULT_PAGE_SIZE), 1); paging = Pager.of(index, size); } - chain.paging(paging); if (ObjectHelper.isNotEmpty(query.sort())) { query.sort().forEach(sort -> chain.orderBy(OrderByDirection.valueOf(sort.direction().name()), sort.column())); @@ -85,14 +85,16 @@ public abstract class SimpleServiceSupport implemen commonPredicates(where); new XBatisQueryParser<>(query.query(), where, target, factory).build(); - return new Page<>(chain.list(), chain.count()); + var pager = chain.paging(paging); + + return new Page<>(pager.getResults(), pager.getTotal()); } private Optional detailOptional(Long id) { if (ObjectHelper.isNull(id)) { return Optional.empty(); } - return Optional.ofNullable(mapper.getById(target, id)); + return mapper.getOptionalById(target, id); } @Named("detail") @@ -181,22 +183,22 @@ public abstract class SimpleServiceSupport implemen @Override protected void startWith(Query.Queryable queryable, Where where) { - queryable.startWith().forEach((column, value) -> where.like(LikeMode.LEFT, factory.field(target, column), value)); + queryable.startWith().forEach((column, value) -> where.like(LikeMode.RIGHT, factory.field(target, column), value)); } @Override protected void notStartWith(Query.Queryable queryable, Where where) { - queryable.notStartWith().forEach((column, value) -> where.notLike(LikeMode.LEFT, factory.field(target, column), value)); + queryable.notStartWith().forEach((column, value) -> where.notLike(LikeMode.RIGHT, factory.field(target, column), value)); } @Override protected void endWith(Query.Queryable queryable, Where where) { - queryable.endWith().forEach((column, value) -> where.like(LikeMode.RIGHT, factory.field(target, column), value)); + queryable.endWith().forEach((column, value) -> where.like(LikeMode.LEFT, factory.field(target, column), value)); } @Override protected void notEndWith(Query.Queryable queryable, Where where) { - queryable.notEndWith().forEach((column, value) -> where.notLike(LikeMode.RIGHT, factory.field(target, column), value)); + queryable.notEndWith().forEach((column, value) -> where.notLike(LikeMode.LEFT, factory.field(target, column), value)); } @Override diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/initial.sql b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/initial.sql index 8fa3786..51fc51e 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/initial.sql +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/initial.sql @@ -4,7 +4,9 @@ create table if not exists Company name varchar(255) not null, members int not null, created_time timestamp not null, - modified_time timestamp not null + modified_time timestamp not null, + deleted tinyint not null default 0, + deleted_time timestamp ); create table if not exists Employee @@ -12,6 +14,9 @@ create table if not exists Employee id bigint primary key, name varchar(255) not null, age int not null, + company_id bigint not null, created_time timestamp not null, - modified_time timestamp not null + modified_time timestamp not null, + deleted tinyint not null default 0, + deleted_time timestamp ); diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/TestApplication.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/TestApplication.java new file mode 100644 index 0000000..09e55a6 --- /dev/null +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/TestApplication.java @@ -0,0 +1,82 @@ +package com.lanyuanxiaoyao.service.template.database.xbatis; + +import cn.xbatis.core.sql.executor.chain.QueryChain; +import com.lanyuanxiaoyao.service.template.database.common.test.AbstractTestApplication; +import com.lanyuanxiaoyao.service.template.database.xbatis.entity.Company; +import com.lanyuanxiaoyao.service.template.database.xbatis.entity.Employee; +import com.lanyuanxiaoyao.service.template.database.xbatis.entity.vo.EmployeeWithCompanyName; +import com.lanyuanxiaoyao.service.template.database.xbatis.mapper.MybatisBasicMapper; +import db.sql.api.cmd.LikeMode; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.util.Assert; + +@Slf4j +@RequiredArgsConstructor +@MapperScan("com.lanyuanxiaoyao.service.template.database.xbatis.mapper") +@SpringBootApplication +public class TestApplication extends AbstractTestApplication { + private final MybatisBasicMapper mapper; + + public static void main(String[] args) { + SpringApplication.run(TestApplication.class, args); + } + + @EventListener(ApplicationReadyEvent.class) + public void runTests() { + testCrud(); + testDelete(); + testQuery(); + + System.exit(0); + } + + private void testDelete() { + formatLog("Delete"); + saveItem("company", randomCompany()); + saveItem("company", randomCompany()); + mapper.deleteAll(Company.class); + } + + private void testQuery() { + formatLog("Added"); + var company1 = Company.builder().name(randomString(5)).members(randomInt(100)).build(); + mapper.saveOrUpdate(company1); + var company2 = Company.builder().name(randomString(5)).members(randomInt(100)).build(); + mapper.saveOrUpdate(company2); + var employee1 = Employee.builder().name("Tom").age(randomInt(100)).companyId(company1.getId()).build(); + mapper.saveOrUpdate(employee1); + var employee2 = Employee.builder().name(randomString(10)).age(randomInt(100)).companyId(company2.getId()).build(); + mapper.saveOrUpdate(employee2); + + formatLog("Query"); + var employees1 = QueryChain.of(mapper, Employee.class) + .isNotNull(Employee::getName) + .eq(Employee::getName, "Tom") + .like(Employee::getName, "To") + .like(LikeMode.RIGHT, Employee::getName, "To") + .like(LikeMode.LEFT, Employee::getName, "om") + .lt(Employee::getAge, 200) + .gt(Employee::getAge, 0) + .in(Employee::getName, "Tom", "Mike") + .between(Employee::getAge, 0, 200) + .list(); + Assert.isTrue(employees1.size() == 1, "查询数量错误"); + + formatLog("Query Join"); + var employees2 = QueryChain.of(mapper, Employee.class) + .select(Employee::getName, Employee::getAge) + .select(Company::getId, c -> c.as(EmployeeWithCompanyName::getCompanyName)) + .leftJoin(Employee.class, Company.class, on -> on.eq(Employee::getCompanyId, Company::getId).gt(Company::getMembers, 0)) + .eq(Employee::getName, "Tom") + .lt(Company::getMembers, 200) + .returnType(EmployeeWithCompanyName.class) + .list(); + Assert.isTrue(employees2.size() == 1, "查询数量错误"); + } +} diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/controller/CompanyController.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/controller/CompanyController.java similarity index 87% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/controller/CompanyController.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/controller/CompanyController.java index 939fd01..6f13f4d 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/controller/CompanyController.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/controller/CompanyController.java @@ -1,7 +1,7 @@ -package com.lanyuanxiaoyao.service.template.xbatis.controller; +package com.lanyuanxiaoyao.service.template.database.xbatis.controller; -import com.lanyuanxiaoyao.service.template.xbatis.entity.Company; -import com.lanyuanxiaoyao.service.template.xbatis.service.CompanyService; +import com.lanyuanxiaoyao.service.template.database.xbatis.entity.Company; +import com.lanyuanxiaoyao.service.template.database.xbatis.service.CompanyService; import java.time.LocalDateTime; import java.util.function.Function; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/entity/Company.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/Company.java similarity index 61% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/entity/Company.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/Company.java index c936ece..5872e84 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/entity/Company.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/Company.java @@ -1,7 +1,10 @@ -package com.lanyuanxiaoyao.service.template.xbatis.entity; +package com.lanyuanxiaoyao.service.template.database.xbatis.entity; import cn.xbatis.db.annotations.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.FieldNameConstants; @@ -10,6 +13,9 @@ import lombok.experimental.FieldNameConstants; @Setter @ToString(callSuper = true) @FieldNameConstants +@AllArgsConstructor +@NoArgsConstructor +@Builder @Table public class Company extends SimpleEntity { private String name; diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/Employee.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/Employee.java new file mode 100644 index 0000000..61b4a80 --- /dev/null +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/Employee.java @@ -0,0 +1,25 @@ +package com.lanyuanxiaoyao.service.template.database.xbatis.entity; + +import cn.xbatis.db.annotations.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.FieldNameConstants; + +@Getter +@Setter +@ToString(callSuper = true) +@FieldNameConstants +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Table +public class Employee extends SimpleEntity { + private String name; + private Integer age; + + private Long companyId; +} diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/entity/Employee.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/vo/EmployeeWithCompanyName.java similarity index 60% rename from spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/entity/Employee.java rename to spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/vo/EmployeeWithCompanyName.java index a14f017..b93250e 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/entity/Employee.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/entity/vo/EmployeeWithCompanyName.java @@ -1,6 +1,5 @@ -package com.lanyuanxiaoyao.service.template.xbatis.entity; +package com.lanyuanxiaoyao.service.template.database.xbatis.entity.vo; -import cn.xbatis.db.annotations.Table; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -10,8 +9,8 @@ import lombok.experimental.FieldNameConstants; @Setter @ToString(callSuper = true) @FieldNameConstants -@Table -public class Employee extends SimpleEntity { +public class EmployeeWithCompanyName { private String name; private Integer age; + private String companyName; } diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/service/CompanyService.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/service/CompanyService.java new file mode 100644 index 0000000..8ec6159 --- /dev/null +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/service/CompanyService.java @@ -0,0 +1,12 @@ +package com.lanyuanxiaoyao.service.template.database.xbatis.service; + +import com.lanyuanxiaoyao.service.template.database.xbatis.entity.Company; +import com.lanyuanxiaoyao.service.template.database.xbatis.mapper.MybatisBasicMapper; +import org.springframework.stereotype.Service; + +@Service +public class CompanyService extends SimpleServiceSupport { + public CompanyService(MybatisBasicMapper mapper) { + super(Company.class, mapper); + } +} diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/service/EmployeeService.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/service/EmployeeService.java new file mode 100644 index 0000000..0a20962 --- /dev/null +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/database/xbatis/service/EmployeeService.java @@ -0,0 +1,12 @@ +package com.lanyuanxiaoyao.service.template.database.xbatis.service; + +import com.lanyuanxiaoyao.service.template.database.xbatis.entity.Employee; +import com.lanyuanxiaoyao.service.template.database.xbatis.mapper.MybatisBasicMapper; +import org.springframework.stereotype.Service; + +@Service +public class EmployeeService extends SimpleServiceSupport { + public EmployeeService(MybatisBasicMapper mapper) { + super(Employee.class, mapper); + } +} diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/TestApplication.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/TestApplication.java deleted file mode 100644 index 918d9db..0000000 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/TestApplication.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.lanyuanxiaoyao.service.template.xbatis; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.event.EventListener; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.util.Assert; -import org.springframework.web.client.RestTemplate; -import tools.jackson.databind.JsonNode; -import tools.jackson.databind.ObjectMapper; - -@Slf4j -@MapperScan("com.lanyuanxiaoyao.service.template.xbatis.mapper") -@SpringBootApplication -public class TestApplication { - private static final String BASE_URL = "http://localhost:2490"; - private static final RestTemplate REST_CLIENT = new RestTemplate(); - private static final ObjectMapper MAPPER = new ObjectMapper(); - - public static void main(String[] args) { - SpringApplication.run(TestApplication.class, args); - } - - @EventListener(ApplicationReadyEvent.class) - public void runTests() { - // 增 - var cid1 = saveItem("company", "{\"name\": \"Apple\",\"members\": 10}").get("data").asLong(); - var cid2 = saveItem("company", "{\"name\": \"Banana\",\"members\": 20}").get("data").asLong(); - var cid3 = saveItem("company", "{\"name\": \"Cheery\",\"members\": 20}").get("data").asLong(); - - // 查 - var companies = listItems("company"); - Assert.isTrue(companies.at("/data/items").size() == 3, "数量错误"); - Assert.isTrue(companies.at("/data/total").asLong() == 3, "返回数量错误"); - - // language=JSON - var companies2 = listItems("company", "{\n" + - " \"page\": {\n" + - " \"index\": 1,\n" + - " \"size\": 2\n" + - " }\n" + - "}"); - Assert.isTrue(companies2.at("/data/items").size() == 2, "数量错误"); - Assert.isTrue(companies2.at("/data/total").asLong() == 3, "返回数量错误"); - // language=JSON - var companies3 = listItems("company", "{\n" + - " \"query\": {\n" + - " \"notNullEqual\": [\n" + - " \"name\"\n" + - " ],\n" + - " \"equal\": {\n" + - " \"name\": \"Apple\"\n" + - " },\n" + - " \"like\": {\n" + - " \"name\": \"Appl%\"\n" + - " },\n" + - " \"contain\": {\n" + - " \"name\": \"ple\"\n" + - " },\n" + - " \"startWith\": {\n" + - " \"name\": \"Appl\"\n" + - " },\n" + - " \"endWith\": {\n" + - " \"name\": \"le\"\n" + - " },\n" + - " \"less\": {\n" + - " \"members\": 50\n" + - " },\n" + - " \"greatEqual\": {\n" + - " \"members\": 0,\n" + - " \"createdTime\": \"2025-01-01 00:00:00\"\n" + - " },\n" + - " \"inside\": {\n" + - " \"name\": [\n" + - " \"Apple\",\n" + - " \"Banana\"\n" + - " ]\n" + - " },\n" + - " \"between\": {\n" + - " \"members\": {\n" + - " \"start\": 0,\n" + - " \"end\": 50\n" + - " }\n" + - " }\n" + - " },\n" + - " \"page\": {\n" + - " \"index\": 1,\n" + - " \"size\": 2\n" + - " }\n" + - "}"); - Assert.isTrue(companies3.at("/data/items").size() == 1, "数量错误"); - Assert.isTrue(companies3.at("/data/total").asLong() == 1, "返回数量错误"); - - var company1 = detailItem("company", cid1); - Assert.isTrue(cid1 == company1.at("/data/id").asLong(), "id错误"); - Assert.isTrue("Apple".equals(company1.at("/data/name").asText()), "name错误"); - - // 改 - var cid4 = saveItem("company", "{\"id\": %d, \"name\": \"Dog\"}".formatted(cid2)).get("data").asLong(); - Assert.isTrue(cid2 == cid4, "id错误"); - var company2 = detailItem("company", cid2); - Assert.isTrue("Dog".equals(company2.at("/data/name").asText()), "name错误"); - - // 删 - removeItem("company", cid3); - Assert.isTrue(listItems("company").at("/data/items").size() == 2, "数量错误"); - Assert.isTrue(listItems("company").at("/data/total").asLong() == 2, "返回数量错误"); - - log.info(listItems("company").toPrettyString()); - System.exit(0); - } - - private HttpHeaders headers() { - var headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - return headers; - } - - private JsonNode saveItem(String path, String body) { - var response = REST_CLIENT.postForEntity( - "%s/%s/save".formatted(BASE_URL, path), - new HttpEntity<>(body, headers()), - String.class - ); - Assert.isTrue(response.getStatusCode().is2xxSuccessful(), "请求失败"); - Assert.notNull(response.getBody(), "请求失败"); - return MAPPER.readTree(response.getBody()); - } - - private JsonNode listItems(String path) { - var response = REST_CLIENT.getForEntity( - "%s/%s/list".formatted(BASE_URL, path), - String.class - ); - Assert.isTrue(response.getStatusCode().is2xxSuccessful(), "请求失败"); - Assert.notNull(response.getBody(), "请求失败"); - return MAPPER.readTree(response.getBody()); - } - - private JsonNode listItems(String path, String query) { - var response = REST_CLIENT.postForEntity( - "%s/%s/list".formatted(BASE_URL, path), - new HttpEntity<>(query, headers()), - String.class - ); - Assert.isTrue(response.getStatusCode().is2xxSuccessful(), "请求失败"); - Assert.notNull(response.getBody(), "请求失败"); - return MAPPER.readTree(response.getBody()); - } - - private JsonNode detailItem(String path, Long id) { - var response = REST_CLIENT.getForEntity( - "%s/%s/detail/%d".formatted(BASE_URL, path, id), - String.class - ); - Assert.isTrue(response.getStatusCode().is2xxSuccessful(), "请求失败"); - Assert.notNull(response.getBody(), "请求失败"); - return MAPPER.readTree(response.getBody()); - } - - private void removeItem(String path, Long id) { - var response = REST_CLIENT.getForEntity( - "%s/%s/remove/%d".formatted(BASE_URL, path, id), - Void.class - ); - Assert.isTrue(response.getStatusCode().is2xxSuccessful(), "请求失败"); - } -} diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/service/CompanyService.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/service/CompanyService.java deleted file mode 100644 index e751789..0000000 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/service/CompanyService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.lanyuanxiaoyao.service.template.xbatis.service; - -import com.lanyuanxiaoyao.service.template.xbatis.entity.Company; -import com.lanyuanxiaoyao.service.template.xbatis.mapper.MybatisBasicMapper; -import org.springframework.stereotype.Service; - -@Service -public class CompanyService extends SimpleServiceSupport { - public CompanyService(MybatisBasicMapper mapper) { - super(Company.class, mapper); - } -} diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/service/EmployeeService.java b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/service/EmployeeService.java deleted file mode 100644 index d55897d..0000000 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/java/com/lanyuanxiaoyao/service/template/xbatis/service/EmployeeService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.lanyuanxiaoyao.service.template.xbatis.service; - -import com.lanyuanxiaoyao.service.template.xbatis.entity.Employee; -import com.lanyuanxiaoyao.service.template.xbatis.mapper.MybatisBasicMapper; -import org.springframework.stereotype.Service; - -@Service -public class EmployeeService extends SimpleServiceSupport { - public EmployeeService(MybatisBasicMapper mapper) { - super(Employee.class, mapper); - } -} diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/resources/application.yml b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/resources/application.yml index 4d6a0de..b8a7106 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/resources/application.yml +++ b/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/resources/application.yml @@ -1,8 +1,6 @@ -server: - port: 2490 spring: - application: - name: Test + profiles: + include: test datasource: url: "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=MySQL;DATABASE_TO_LOWER=TRUE;INIT=runscript from '/Users/lanyuanxiaoyao/Project/IdeaProjects/spring-boot-service-template/spring-boot-service-template-database/spring-boot-service-template-database-xbatis/src/test/initial.sql'" username: test @@ -10,13 +8,4 @@ spring: driver-class-name: org.h2.Driver mybatis: configuration: - banner: false -decorator: - datasource: - p6spy: - multiline: false - exclude-categories: - - commit - - result - - resultset - log-format: "%(category)|%(executionTime)|%(sqlSingleLine)" \ No newline at end of file + banner: false \ No newline at end of file