springboot整合mybatisplus实现关联表查询(四)---关联查询多表查询关联分页查询(补充:<foreach>遍历,接收参数为对象,对象属性包含List)

写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

通过前面三篇学习,了解了MP基本的CURD操作和分页查询,但是到目前为止我们仅限于单表操作,而实际中通常都是多表关联查询使用的比较多,这一篇就记录一下多表的关联查询。关联查询和单表查询其实差不多,在处理一对一,一对多等的方式上也跟Mybatis一样,不太清楚的可以看下之前整理的博客springboot整合mybatis使用collection查询 一对多 多对一 多对多查询

新建Wife类与User类关联:

@Data
public class Wife {
    private int wifeId;
    private int userId;
    private String wifeName;
}

新建UserWifeDto表示关联查询返回的数据:

@Data
public class UserWifeDto {
    private Integer userId;
    private String userName;
    private Integer age;
    private String wifeName;
}

UserMapper中新建查询方法:

@Select("select u.*,w.wife_name from t_user u left join t_wife w on u.user_id = w.user_id where u.user_id = #{userId}")
UserWifeDto selectUserWife(UserQueryModel userQueryModel);

新建测试类RelationSelectTest,添加测试方法:

    @Test
    public void test(){
        UserQueryModel userQueryModel = new UserQueryModel();
        userQueryModel.setUserId(1);
        UserWifeDto userDto = userMapper.selectUserWife(userQueryModel);
        System.out.println(userDto);
    }

执行结果:

如上测试:UserMapper中将查询sql直接写在了方法上,其实像是这种简单的关联查询直接使用@Select注解的方式还是更简单的,当然也可以在xml中写查询语句,如下也是一样的:

UserMapper中新建查询方法:

    @Test
    public void test1(){
        UserQueryModel userQueryModel = new UserQueryModel();
        userQueryModel.setUserId(1);
        UserWifeDto userDto = userMapper.selectUserWifeXml(userQueryModel);
        System.out.println(userDto);
    }

UserMapper.xml中:

    <select id="selectUserWifeXml" parameterType="com.example.springbootmp.dto.user.UserQueryModel"
            resultType="com.example.springbootmp.dto.user.UserWifeDto">
        select u.*,w.wife_name from t_user u left join t_wife w on u.user_id = w.user_id where u.user_id = #{userId}
    </select>

上面虽然实现了关联查询,但是只是查询了Wife中的一个属性wifeName,如果有很多字段的时候,这样还是不太方便的,接下来将使用<association>做关联查询,对于<association>和<collection>标签的使用不熟悉的小伙伴可以去Mybatis的官网查看文档,或者看之前整理的博客springboot整合mybatis使用association做关联查询 一对一查询 

修改下UserWifeDto,将wifeName改为Wife对象:

@Data
public class UserWifeDto {
    private Integer userId;
    private String userName;
    private Integer age;
    // private String wifeName;
    private Wife wife;
}

UserMapper中新增selectUserWifeXmlByAss方法:

UserWifeDto selectUserWifeXmlByAss(UserQueryModel userQueryModel);

UserMapper.xml中:

    <resultMap id="userWifeDtoMap" type="com.example.springbootmp.dto.user.UserWifeDto">
        <id property="userId" column="user_id" />
        <result property="userName" column="user_name" />
        <result property="age" column="age" />
        <association property="wife" column="user_id" javaType="com.example.springbootmp.domain.Wife">
            <id property="wifeId" column="wife_id" />
            <result property="userId" column="user_id" />
            <result property="wifeName" column="wife_name" />
        </association>
    </resultMap>

    <select id="selectUserWifeXmlByAss" parameterType="com.example.springbootmp.dto.user.UserQueryModel"
            resultMap="userWifeDtoMap">
        select u.*,w.* from t_user u left join t_wife w on u.user_id = w.user_id
        where u.user_id = #{userId}
    </select>

测试类RelationSelectTest中新增测试方法:

    @Test
    public void test2(){
        UserQueryModel userQueryModel = new UserQueryModel();
        userQueryModel.setUserId(1);
        UserWifeDto userDto = userMapper.selectUserWifeXmlByAss(userQueryModel);
        System.out.println(userDto);
    }

执行结果:

上面的查询使用了association做的关联查询,而且页面没有分页,并且查询条件只是来自单表的,接下来测试将加上分页,并且查询条件也来自多张表,顺便用下<collection>标签回顾一下它的使用,这样更接近于实际场景。

新增Order类:

@Data
@TableName(value = "t_orders")
public class Order {
    private int orderId;
    private int userId;
    private String number;

}

UserMapper中新增测试方法selectOrdersPage: 

 Page<UserOrdersDto> selectOrdersPage(Page<UserOrdersDto> page, UserQueryModel userQueryModel);

UserMapper.xml中:

    <resultMap id="userOrderResultMap" type="com.example.springbootmp.dto.user.UserOrdersDto">
        <id property="userId" column="user_id" />
        <result property="userName" column="user_name" />
        <result property="age" column="age" />
        <collection property="orders" column="user_id" ofType="com.example.springbootmp.domain.Order">
            <id property="orderId" column="order_id" />
            <result property="userId" column="user_id" />
            <result property="number" column="number" />
        </collection>
    </resultMap>

    <sql id="user_orders">
        select u.*,od.* from t_user u left join t_orders od on u.user_id = od.user_id
    </sql>

    <select id="selectOrdersPage" resultMap="userOrderResultMap" parameterType="com.example.springbootmp.dto.user.UserQueryModel">
        <include refid="user_orders"></include>
        <where>
            <if test="userQueryModel.userId != null">
                u.user_id = #{userQueryModel.userId}
            </if>
            <if test="userQueryModel.number != null">
                and od.number <![CDATA[!= ]]> #{userQueryModel.number}
            </if>
        </where>
    </select>

数据库中添加测试数据:

测试类中添加测试方法:

    @Test
    public void testPage1(){
        Page page = new Page(1,3);
        UserQueryModel queryModel = new UserQueryModel();
        queryModel.setUserId(1);
        queryModel.setNumber("100000");
        Page<UserOrdersDto> userOrdersDtoPage = userMapper.selectOrdersPage(page,queryModel);
        System.out.println(userOrdersDtoPage.getRecords() + "---" + userOrdersDtoPage.getTotal());
    }

执行结果:

补充:查询参数为对象,对象中包含集合属性使用<foreach>遍历

UserQueryModel查询对象中加入List类型查询参数ageList:

@Data
public class UserQueryModel {

    private Integer userId;
    private String userName;
    private Integer age;
    private String number;
    private List<Integer> ageList;

}

UserMapper中添加方法:

Page<UserWifeDto> selectUsersByAges(Page page, UserQueryModel userQueryModel);

数据库中修改下测试数据:

CurdTest中增加测试方法:

    @Test
    public void selectUsersByAges(){
        Page<UserWifeDto> page = new Page<UserWifeDto>(1,3);
        List<Integer> ageList = new ArrayList<>();
        ageList.add(10);
        ageList.add(15);
        UserQueryModel queryModel = new UserQueryModel();
        queryModel.setAgeList(ageList);
        Page<UserWifeDto> userPage = userMapper.selectUsersByAges(page, queryModel);
        System.out.println(userPage.getPages() + "---" + userPage.getTotal() + "---" + userPage.getRecords());
    }

执行结果如下:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,其中包括了Spring Boot整合MyBatis-Plus进行分页查询实现以及前端页面的展示。 后端代码: ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; /** * 分页查询用户列表 */ @GetMapping("/list") public ResultVo list(Page<User> page) { // 查询条件封装在 QueryWrapper 对象中 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("status", 1); // 查询状态为1的用户 // 执行分页查询 userService.page(page, wrapper); // 将查询结果封装为 ResultVo 对象返回给前端 return ResultVo.success(page); } } ``` 前端代码: ```html <table> <thead> <tr> <th>用户名</th> <th>年龄</th> <th>手机号</th> </tr> </thead> <tbody id="user_list"></tbody> </table> <div id="pagination"></div> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/twbs-pagination/1.4.2/jquery.twbsPagination.min.js"></script> <script> $(function() { // 初始化分页组件 $('#pagination').twbsPagination({ totalPages: 1, visiblePages: 5, onPageClick: function(event, page) { // 发起分页查询请求 $.get('/user/list', { page: page }, function(res) { if (res.code === 200) { // 渲染查询结果到页面 var html = ''; res.data.records.forEach(function(user) { html += '<tr>'; html += '<td>' + user.username + '</td>'; html += '<td>' + user.age + '</td>'; html += '<td>' + user.mobile + '</td>'; html += '</tr>'; }); $('#user_list').html(html); // 更新分页组件 $('#pagination').twbsPagination('destroy'); $('#pagination').twbsPagination({ totalPages: res.data.pages, visiblePages: 5, startPage: res.data.current, first: '首页', prev: '上一页', next: '下一页', last: '末页', onPageClick: function(event, page) { // 发起分页查询请求 $.get('/user/list', { page: page }, function(res) { if (res.code === 200) { // 渲染查询结果到页面 var html = ''; res.data.records.forEach(function(user) { html += '<tr>'; html += '<td>' + user.username + '</td>'; html += '<td>' + user.age + '</td>'; html += '<td>' + user.mobile + '</td>'; html += '</tr>'; }); $('#user_list').html(html); } }); } }); } }); } }); }); </script> ``` 在上面的代码中,我们使用了 MyBatis-Plus 提供的 `Page` 类来进行分页查询,具体的查询条件通过 `QueryWrapper` 对象进行封装。在前端页面中,我们使用了 `jquery.twbsPagination` 插件来实现分页组件,并通过 AJAX 发起分页查询请求,并将查询结果渲染到页面上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值