diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java index 8620ba8..a6a28ff 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java @@ -87,18 +87,7 @@ public class MPJSqlInjector extends DefaultSqlInjector { private List getJoinMethod() { List list = new ArrayList<>(); - - int v1, v2; - try { - String version = MybatisPlusVersion.getVersion(); - String[] split = version.split("\\."); - v1 = Integer.parseInt(split[0]); - v2 = Integer.parseInt(split[1]); - } catch (Exception e) { - v1 = 3; - v2 = 4; - } - if ((v1 == 3 && v2 >= 5) || v1 > 3) { + if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.5.0") >= 0) { list.add(new SelectJoinCount(SqlMethod.SELECT_JOIN_COUNT.getMethod())); list.add(new SelectJoinOne(SqlMethod.SELECT_JOIN_ONE.getMethod())); list.add(new SelectJoinList(SqlMethod.SELECT_JOIN_LIST.getMethod())); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SqlMethod.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SqlMethod.java index 7fcf61e..05bafc1 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SqlMethod.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SqlMethod.java @@ -10,21 +10,6 @@ import java.util.stream.Collectors; * @since 2021/1/15 */ public enum SqlMethod { - -// /** -// * 修改 -// */ - - /** - * 删除 - */ - DELETE("delete", "根据 entity 条件删除记录", ""), - - /** - * 逻辑删除 - */ - LOGIC_DELETE("delete", "根据 entity 条件逻辑删除记录", ""), - /** * 连表查询 */ diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/UpdateWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/UpdateWrapperTest.java deleted file mode 100644 index 32a2023..0000000 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/UpdateWrapperTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.github.yulichang.test.join; - -import com.github.yulichang.test.join.entity.UserDO; -import com.github.yulichang.test.join.entity.UserDto; -import com.github.yulichang.test.join.mapper.UserDTOMapper; -import com.github.yulichang.test.join.mapper.UserMapper; -import com.github.yulichang.test.util.ThreadLocalUtils; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -/** - * springboot3 & jdk17+ - */ -@SuppressWarnings("unused") -@SpringBootTest -class UpdateWrapperTest { - @Autowired - private UserMapper userMapper; - - @Autowired - private UserDTOMapper userDTOMapper; - - - /** - * 逻辑删除 - */ - @Test - public void testUpdate() { - ThreadLocalUtils.set("UPDATE `user` t SET del=true WHERE t.del=false AND (t.id = ?)"); - MPJLambdaWrapper wrapper = new MPJLambdaWrapper() - .eq(UserDO::getId, 1); - - userMapper.delete(wrapper); - - assert userMapper.selectById(1) == null; - } - - /** - * 非逻辑删除 - */ - @Test - public void testUpdate1() { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); - wrapper.eq(UserDto::getId, 1); - userDTOMapper.delete(wrapper); - - assert userDTOMapper.selectById(1) == null; - } - - - /** - * 修改 - */ - @Test - public void testUpdate2() { -// MPJLambdaWrapper wrapper = new MPJLambdaWrapper() -// .leftJoin(UserDO.class, UserDO::getId, UserDto::getUserId) -// .eq(UserDto::getId, 1); - MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); - wrapper.eq(UserDto::getId, 1); - userDTOMapper.update(new UserDto() {{ - setUserId(2222); - }}, wrapper); - } - - -} diff --git a/mybatis-plus-join-test/test-springboot3-jdk17/src/test/java/com/yulichang/test/springboot3jdk17/LambdaWrapperTest.java b/mybatis-plus-join-test/test-springboot3-jdk17/src/test/java/com/yulichang/test/springboot3jdk17/LambdaWrapperTest.java new file mode 100644 index 0000000..12a06a1 --- /dev/null +++ b/mybatis-plus-join-test/test-springboot3-jdk17/src/test/java/com/yulichang/test/springboot3jdk17/LambdaWrapperTest.java @@ -0,0 +1,700 @@ +package com.yulichang.test.springboot3jdk17; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.MPJWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.yulichang.test.springboot3jdk17.dto.AddressDTO; +import com.yulichang.test.springboot3jdk17.dto.UserDTO; +import com.yulichang.test.springboot3jdk17.entity.AddressDO; +import com.yulichang.test.springboot3jdk17.entity.AreaDO; +import com.yulichang.test.springboot3jdk17.entity.UserDO; +import com.yulichang.test.springboot3jdk17.entity.UserDto; +import com.yulichang.test.springboot3jdk17.mapper.UserDTOMapper; +import com.yulichang.test.springboot3jdk17.mapper.UserMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.sql.Timestamp; +import java.util.List; +import java.util.Map; + +/** + * 连表测试类 + *

+ * 支持mybatis-plus 查询枚举字段 + * 支持mybatis-plus typeHandle功能 + *

+ * 移除了mybatis-plus 逻辑删除支持,逻辑删除需要在连表查询时自己添加对应的条件 + */ +@SuppressWarnings("unused") +@SpringBootTest +class LambdaWrapperTest { + @Autowired + private UserMapper userMapper; + + @Autowired + private UserDTOMapper userDTOMapper; + + @Test + void testJoin() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by, + t1.id AS joina_id, + t1.user_id, + t1.area_id, + t1.tel, + t1.address, + t1.del AS joina_del, + t2.id AS joinb_id, + t2.province, + t2.city, + t2.area, + t2.postcode, + t2.del AS joinb_del + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + LEFT JOIN area t2 ON (t2.id = t1.area_id) + WHERE t.del = false + AND t1.del = false + AND t2.del = false + AND (t.id <= ?) + ORDER BY t.id DESC"""); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(UserDO.class) + .selectCollection(AddressDO.class, UserDTO::getAddressList, addr -> addr + .association(AreaDO.class, AddressDTO::getArea)) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .leftJoin(AreaDO.class, AreaDO::getId, AddressDO::getAreaId) + .le(UserDO::getId, 10000) + .orderByDesc(UserDO::getId); + List list = userMapper.selectJoinList(UserDTO.class, wrapper); + + assert list.get(0).getAddressList() != null && list.get(0).getAddressList().get(0).getId() != null; + list.forEach(System.out::println); + } + + @Test + void testJoinField() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by, + t1.id AS joina_id + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + WHERE t.del = false + AND t1.del = false + AND (t.id <= ?) + ORDER BY t.id DESC"""); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(UserDO.class) + + .selectCollection(AddressDO.class, UserDTO::getAddressIds, e -> e + .id(AddressDO::getId)) + + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .le(UserDO::getId, 10000) + .orderByDesc(UserDO::getId); + List list = userMapper.selectJoinList(UserDTO.class, wrapper); + + assert list.get(0).getAddressIds() != null; + list.forEach(System.out::println); + } + + + @Test + void testJoin1() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by, + t1.id AS joina_id, + t1.user_id, + t1.area_id, + t1.tel, + t1.address, + t1.del AS joina_del, + t2.id AS joinb_id, + t2.province, + t2.city, + t2.area, + t2.postcode, + t2.del AS joinb_del + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + LEFT JOIN area t2 ON (t2.id = t1.area_id) + WHERE t.del = false + AND t1.del = false + AND t2.del = false + ORDER BY t.id DESC"""); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(UserDO.class) + .selectCollection(AddressDO.class, UserDTO::getAddressList, addr -> addr + .association(AreaDO.class, AddressDTO::getArea)) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .leftJoin(AreaDO.class, AreaDO::getId, AddressDO::getAreaId) + .orderByDesc(UserDO::getId); + List list = userMapper.selectJoinList(UserDTO.class, wrapper); + + assert list.get(0).getAddressList().get(0).getId() != null; + list.forEach(System.out::println); + } + + /** + * 基本数据类型测试 + */ + @Test + void testWrapper() { + ThreadLocalUtils.set(""" + SELECT t.id + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + LEFT JOIN area t2 ON (t2.id = t1.area_id) + WHERE t.del = false + AND t1.del = false + AND t2.del = false"""); + //基本数据类型 和 String + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .select(UserDO::getId) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .leftJoin(AreaDO.class, AreaDO::getId, AddressDO::getAreaId); + List list = userMapper.selectJoinList(Integer.class, wrapper); + + assert list.get(0) != null; + System.out.println(list); + + + ThreadLocalUtils.set(""" + SELECT t.create_time + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + LEFT JOIN area t2 ON (t2.id = t1.area_id) + WHERE t.del = false + AND t1.del = false + AND t2.del = false"""); + //java.sql包下的类 + MPJLambdaWrapper wrapper1 = new MPJLambdaWrapper() + .select(UserDO::getCreateTime) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .leftJoin(AreaDO.class, AreaDO::getId, AddressDO::getAreaId); + List list1 = userMapper.selectJoinList(Timestamp.class, wrapper1); + + assert list1.get(0) != null; + System.out.println(list); + } + + + @Test + @SuppressWarnings("unchecked") + void testMSCache() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by + FROM `user` t + WHERE t.id = ? + AND t.del = false + AND (t.id <= ?) + ORDER BY t.id ASC, t.`name` ASC"""); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper(new UserDO() {{ + setId(1); + }}) + .selectAll(UserDO.class) +// .setEntity(new UserDO() {{ +// setId(1); +// }}) + .le(UserDO::getId, 100) + .orderByAsc(UserDO::getId, UserDO::getName); + + List list = userMapper.selectList(wrapper); + list.forEach(System.out::println); + } + + @Test + void testTableAliasR() { + ThreadLocalUtils.set(""" + SELECT tt.id, + tt.user_id, + tt.create_by, + tt.update_by, + ua.`name` AS userName, + ub.`name` AS createName, + uc.`name` AS updateName + FROM user_dto tt + LEFT JOIN `user` ua ON (ua.id = tt.user_id) + LEFT JOIN `user` ub ON (ub.id = tt.create_by) + LEFT JOIN `user` uc ON (uc.id = tt.update_by) + WHERE ua.del = false + AND ub.del = false + AND uc.del = false + AND (ua.id <= ? AND ub.id >= ?)"""); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper("tt") + .selectAll(UserDto.class) + .leftJoin(UserDO.class, "ua", UserDO::getId, UserDto::getUserId, ext -> ext + .selectAs(UserDO::getName, UserDto::getUserName) + .le(UserDO::getId, 100)) + .leftJoin(UserDO.class, "ub", UserDO::getId, UserDto::getCreateBy, ext -> ext + .selectAs(UserDO::getName, UserDto::getCreateName) + .ge(UserDO::getId, 0)) + .leftJoin(UserDO.class, "uc", UserDO::getId, UserDto::getUpdateBy, ext -> ext + .selectAs(UserDO::getName, UserDto::getUpdateName)); + List userDtos = userDTOMapper.selectJoinList(UserDto.class, wrapper); + assert StringUtils.isNotBlank(userDtos.get(0).getUserName()); + assert StringUtils.isNotBlank(userDtos.get(0).getCreateName()); + assert StringUtils.isNotBlank(userDtos.get(0).getUpdateName()); + + + ThreadLocalUtils.set(""" + SELECT tt.id, + tt.pid, + tt.`name`, + tt.`json`, + tt.sex, + tt.head_img, + tt.create_time, + tt.address_id, + tt.address_id2, + tt.del, + tt.create_by, + tt.update_by, + ua.id, + ub.head_img + FROM `user` tt + LEFT JOIN `user` ua ON (ua.id = tt.pid) + LEFT JOIN `user` ub ON (ub.id = tt.create_by) + LEFT JOIN `user` uc ON (uc.id = tt.update_by) + WHERE tt.del = false + AND ua.del = false + AND ub.del = false + AND uc.del = false + AND (ua.head_img = tt.`name` AND tt.id = ua.id)"""); + MPJLambdaWrapper w = new MPJLambdaWrapper("tt") + .selectAll(UserDO.class) + .leftJoin(UserDO.class, "ua", UserDO::getId, UserDO::getPid, ext -> ext + .select(UserDO::getId) + .eq(UserDO::getImg, UserDO::getName)) + .leftJoin(UserDO.class, "ub", UserDO::getId, UserDO::getCreateBy, ext -> ext + .select(UserDO::getImg)) + .leftJoin(UserDO.class, "uc", UserDO::getId, UserDO::getUpdateBy) + .eq(UserDO::getId, UserDO::getId); + userMapper.selectJoinList(UserDO.class, w); + System.out.println(1); + } + + /** + * 自连接测试 + */ + @Test + void testInner() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by, + t1.id AS joina_id, + t1.pid AS joina_pid, + t1.`name` AS joina_name, + t1.`json` AS joina_json, + t1.sex AS joina_sex, + t1.head_img AS joina_head_img, + t1.create_time AS joina_create_time, + t1.address_id AS joina_address_id, + t1.address_id2 AS joina_address_id2, + t1.del AS joina_del, + t1.create_by AS joina_create_by, + t1.update_by AS joina_update_by + FROM `user` t + LEFT JOIN `user` t1 ON (t1.pid = t.id) + WHERE t.del = false + AND (t.id > ?)"""); + //自连接 + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .disableSubLogicDel()//关闭副表逻辑删除 + .selectAll(UserDO.class) + .selectCollection(UserDO.class, UserDO::getChildren) + .leftJoin(UserDO.class, UserDO::getPid, UserDO::getId) + .gt(UserDO::getId, 0); + List list = userMapper.selectJoinList(UserDO.class, wrapper); + System.out.println(list); + + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by, + t1.`name` AS createName, + t2.`name` AS updateName + FROM `user` t + LEFT JOIN `user` t1 ON (t1.id = t.create_by) + LEFT JOIN `user` t2 ON (t2.id = t.update_by) + WHERE (t2.id = t.update_by AND t.id = t1.id)"""); + //关联一张表多次 + MPJLambdaWrapper w = new MPJLambdaWrapper() + .disableLogicDel() + .disableSubLogicDel() + .selectAll(UserDO.class) + .leftJoin(UserDO.class, UserDO::getId, UserDO::getCreateBy, ext -> ext + .selectAs(UserDO::getName, UserDO::getCreateName)) + .leftJoin(UserDO.class, (on, ext) -> { + on.eq(UserDO::getId, UserDO::getUpdateBy); + ext.selectAs(UserDO::getName, UserDO::getUpdateName) + .eq(UserDO::getId, UserDO::getUpdateBy); + }) + .eq(UserDO::getId, UserDO::getId); + List dos = userMapper.selectJoinList(UserDO.class, w); + assert dos.get(0).getCreateName() != null && dos.get(0).getUpdateName() != null; + + + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by, + t1.`name` AS alias, + t1.id AS joina_id, + t1.pid AS joina_pid, + t1.`name` AS joina_name, + t1.`json` AS joina_json, + t1.sex AS joina_sex, + t1.head_img AS joina_head_img, + t1.create_time AS joina_create_time, + t1.address_id AS joina_address_id, + t1.address_id2 AS joina_address_id2, + t1.del AS joina_del, + t1.create_by AS joina_create_by, + t1.update_by AS joina_update_by, + t2.id AS joinb_id, + t2.pid AS joinb_pid, + t2.`name` AS joinb_name, + t2.`json` AS joinb_json, + t2.sex AS joinb_sex, + t2.head_img AS joinb_head_img, + t2.create_time AS joinb_create_time, + t2.address_id AS joinb_address_id, + t2.address_id2 AS joinb_address_id2, + t2.del AS joinb_del, + t2.create_by AS joinb_create_by, + t2.update_by AS joinb_update_by + FROM `user` t + LEFT JOIN `user` t1 ON (t1.pid = t.id) + LEFT JOIN `user` t2 ON (t2.pid = t1.id) + WHERE t.del = false + AND (t1.id <= ? AND t.id <= ?)"""); + MPJLambdaWrapper wrapper1 = new MPJLambdaWrapper() + .disableSubLogicDel() + .selectAll(UserDO.class) + .selectCollection("t1", UserDO.class, UserDO::getChildren, c -> c + .collection("t2", UserDO.class, UserDO::getChildren)) + .leftJoin(UserDO.class, UserDO::getPid, UserDO::getId, ext -> ext + .selectAs(UserDO::getName, UserDO::getAlias) + .leftJoin(UserDO.class, UserDO::getPid, UserDO::getId) + .le(UserDO::getId, 5)) + .le(UserDO::getId, 4); + List list1 = userMapper.selectJoinList(UserDO.class, wrapper1); + System.out.println(list1); + } + + /** + * 逻辑删除测试 + */ + @Test + void testLogicDel() { + List l1 = userMapper.selectJoinList(UserDTO.class, new MPJLambdaWrapper<>()); + assert l1.size() == 14; + + List l2 = userMapper.selectJoinList(UserDTO.class, new MPJLambdaWrapper() + .selectAll(UserDO.class) + .select(AddressDO::getAddress) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)); + assert l2.size() == 10; + + List l3 = userMapper.selectJoinList(UserDTO.class, new MPJLambdaWrapper() + .disableSubLogicDel() + .selectAll(UserDO.class) + .selectCollection(AddressDO.class, UserDTO::getAddressList) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)); + assert l3.size() == 14 && l3.get(0).getAddressList().size() == 9; + + List l4 = userMapper.selectJoinList(UserDTO.class, new MPJLambdaWrapper() + .disableSubLogicDel() + .selectAll(UserDO.class) + .selectCollection(AddressDO.class, UserDTO::getAddressList) + .leftJoin(AddressDO.class, on -> on + .eq(AddressDO::getUserId, UserDO::getId) + .eq(AddressDO::getDel, false))); + assert l4.size() == 14 && l4.get(0).getAddressList().size() == 5; + } + + + /** + * 别名测试 + */ + @Test + void testAlias() { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() +// .disableSubLogicDel()//关闭副表逻辑删除 +// .disableLogicDel()//关闭主表逻辑删除 + .selectAll(UserDO.class) + .selectCollection(UserDO.class, UserDO::getChildren) + .leftJoin(UserDO.class, UserDO::getPid, UserDO::getId); + List list = userMapper.selectJoinList(UserDO.class, wrapper); + assert list.get(0).getName() != null && list.get(0).getChildren().get(0).getName() != null; + assert list.get(0).getImg() != null && list.get(0).getChildren().get(0).getImg() != null; + System.out.println(list); + } + + @Test + void testTableAlias() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by, + aa.id, + aa.user_id, + aa.area_id, + aa.tel, + aa.address, + aa.del + FROM `user` t + LEFT JOIN address aa ON (aa.user_id = t.id) + WHERE t.del = false + AND aa.del = false"""); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() +// .disableLogicDel()//关闭主表逻辑删除 + .selectAll(UserDO.class) + .selectAll(AddressDO.class, "aa") +// .selectCollection(UserDO.class, UserDO::getChildren) + .leftJoin(AddressDO.class, "aa", AddressDO::getUserId, UserDO::getId); + List list = userMapper.selectJoinList(UserDO.class, wrapper); + + System.out.println(list); + } + + @Test + void testLabel() { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .disableSubLogicDel() + .selectAll(UserDO.class) + .selectCollection("t1", AddressDO.class, UserDO::getAddressList) + .selectCollection("t2", AddressDO.class, UserDO::getAddressList2) + .leftJoin(AddressDO.class, AddressDO::getId, UserDO::getAddressId) + .leftJoin(AddressDO.class, AddressDO::getId, UserDO::getAddressId2); + List list = userMapper.selectJoinList(UserDO.class, wrapper); + + assert list.get(0).getAddressList().get(0).getAddress() != null; + assert list.get(0).getAddressList2().get(0).getAddress() != null; + System.out.println(list); + } + + + /** + * 简单的分页关联查询 lambda + */ + @Test + void test1() { + Page page = new Page<>(1, 10); + page.setSearchCount(false); + IPage iPage = userMapper.selectJoinPage(page, UserDTO.class, + MPJWrappers.lambdaJoin() + .selectAll(UserDO.class) + .select(AddressDO::getAddress) + .select(AreaDO::getProvince) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .leftJoin(AreaDO.class, AreaDO::getId, AddressDO::getAreaId)); + iPage.getRecords().forEach(System.out::println); + } + + /** + * 简单的分页关联查询 lambda + * ON语句多条件 + */ + @Test + void test3() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by, + t1.address + FROM `user` t + LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id) + WHERE t.del = false + AND t1.del = false + AND (t.id = ? AND (t.head_img = ? OR t1.user_id = ?) AND t.id = ?) + LIMIT ?"""); + IPage page = userMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class, + MPJWrappers.lambdaJoin() + .selectAll(UserDO.class) + .select(AddressDO::getAddress) + .leftJoin(AddressDO.class, on -> on + .eq(UserDO::getId, AddressDO::getUserId) + .eq(UserDO::getId, AddressDO::getUserId)) + .eq(UserDO::getId, 1) + .and(i -> i.eq(UserDO::getImg, "er") + .or() + .eq(AddressDO::getUserId, 1)) + .eq(UserDO::getId, 1)); + page.getRecords().forEach(System.out::println); + } + + /** + * 简单的函数使用 + */ + @Test + void test4() { + UserDTO one = userMapper.selectJoinOne(UserDTO.class, MPJWrappers.lambdaJoin() + .selectSum(UserDO::getId) + .selectMax(UserDO::getId, UserDTO::getHeadImg) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)); + System.out.println(one); + } + + + /** + * 忽略个别查询字段 + */ + @Test + void test6() { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(UserDO.class) + .select(AddressDO.class, p -> true) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .eq(UserDO::getId, 1); + Page page = userMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class, wrapper); + assert page.getRecords().get(0).getAddress() != null; + page.getRecords().forEach(System.out::println); + } + + /** + * 忽略个别查询字段 + */ + @Test + void test8() { + ThreadLocalUtils.set("SELECT t.`name` FROM `user` t WHERE t.del=false AND (t.`name` = ?)"); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .select(UserDO::getName) + .eq(UserDO::getName, "ref"); + userMapper.selectList(wrapper); + } + + + /** + * 关联查询返回map + */ + @Test + void test7() { + List> list = userMapper.selectJoinMaps(MPJWrappers.lambdaJoin() + .selectAll(UserDO.class) + .select(AddressDO::getAddress) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)); + assert list.get(0).get("ADDRESS") != null; + list.forEach(System.out::println); + } + + /** + * 原生查询 + */ + @Test + void testMP() { + List dos = userMapper.selectList(new LambdaQueryWrapper() + .gt(UserDO::getId, 3) + .lt(UserDO::getId, 8)); + assert dos.size() == 4; + } + + /** + * 函数测试 + */ + @Test + void testFunc() { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(UserDO.class); + + List dos = userMapper.selectJoinList(UserDO.class, wrapper); + System.out.println(1); + } +} diff --git a/mybatis-plus-join-test/test-springboot3-jdk17/src/test/java/com/yulichang/test/springboot3jdk17/UpdateWrapperTest.java b/mybatis-plus-join-test/test-springboot3-jdk17/src/test/java/com/yulichang/test/springboot3jdk17/UpdateWrapperTest.java deleted file mode 100644 index c1c66f0..0000000 --- a/mybatis-plus-join-test/test-springboot3-jdk17/src/test/java/com/yulichang/test/springboot3jdk17/UpdateWrapperTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.yulichang.test.springboot3jdk17; - -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import com.yulichang.test.springboot3jdk17.entity.UserDO; -import com.yulichang.test.springboot3jdk17.entity.UserDto; -import com.yulichang.test.springboot3jdk17.mapper.UserDTOMapper; -import com.yulichang.test.springboot3jdk17.mapper.UserMapper; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -/** - * springboot3 & jdk17+ - */ -@SuppressWarnings("unused") -@SpringBootTest -class UpdateWrapperTest { - @Autowired - private UserMapper userMapper; - - @Autowired - private UserDTOMapper userDTOMapper; - - - /** - * 逻辑删除 - */ - @Test - public void testUpdate() { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper() - .eq(UserDO::getId, 1); - - userMapper.delete(wrapper); - - assert userMapper.selectById(1) == null; - } - - /** - * 非逻辑删除 - */ - @Test - public void testUpdate1() { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); - wrapper.eq(UserDto::getId, 1); - userDTOMapper.delete(wrapper); - - assert userDTOMapper.selectById(1) == null; - } - - - /** - * 修改 - */ - @Test - public void testUpdate2() { -// MPJLambdaWrapper wrapper = new MPJLambdaWrapper() -// .leftJoin(UserDO.class, UserDO::getId, UserDto::getUserId) -// .eq(UserDto::getId, 1); - MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); - wrapper.eq(UserDto::getId, 1); - userDTOMapper.update(new UserDto() {{ - setUserId(2222); - }}, wrapper); - } - - -}