暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

面试题系列:Mybatis和Mybatis有何区别?

1024笔记 2023-06-13
65

作者平台:

| CSDN:https://blog.csdn.net/qq_41153943(ID:江夏、)

| 掘金:https://juejin.cn/user/651387938290686(ID:jiangxia_1024

| 知乎:https://www.zhihu.com/people/1024-paper-96(ID:江夏)

| GitHub:https://github.com/JiangXia-1024?tab=repositories

| 微信公众号:1024笔记

本文一共2314字,预计阅读15分钟

1、MyBatis

MyBatis原生支持分页功能,可以在SQL语句中通过LIMIT和OFFSET来进行分页查询。LIMIT后表示每页显示的记录数,OFFSET后表示查询的起始记录行数。

对于大数据量的分页查询,可以使用Mybatis的分页插件来实现更高效的分页操作。其基本的原理是在执行SQL查询之后,通过AOP拦截器将查询结果进行拦截,并将查询的结果集进行再处理以得到分页结果。常见的分页插件如为PageHelper、Mybatis-Plus等。

下面是一个基于Mybatis分页插件PageHelper进行分页查询的示例代码:

1. 首先需要在pom.xml文件中引入PageHelper依赖

    <!-- PageHelper分页插件 -->
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.3.0</version>
    </dependency>

    2. 在Mybatis-config.xml文件中添加分页插件配置

      <plugins>
      <!-- 分页插件 -->
      <plugin interceptor="com.github.pagehelper.PageInterceptor">
      <property name="dialect" value="mysql"/>
      </plugin>
      </plugins>

      3. 编写Controller层代码,进行分页查询

        @RestController
        @RequestMapping("/user")
        public class UserController {


        @Autowired
        private UserService userService;
        /**
        * 分页查询用户列表
        */
        @GetMapping("/list")
        public PageInfo<User> list(@RequestParam(defaultValue = "1") Integer pageNum,
        @RequestParam(defaultValue = "10") Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<User> userList = userService.getUserList();
        return new PageInfo<>(userList);
            }
        }

        在Controller层中,我们首先通过@Autowired注入了UserService实例。在进行分页查询时,需要调用PageHelper的startPage()方法,并传递当前页数pageNum和每页显示数量pageSize。然后执行UserService的getUserList()方法获取用户列表数据,最后将结果包装成PageInfo对象返回即可。

        2、MyBatis-plus

        目前很多企业都在使用更加强大、灵活、简单的MyBatis-plus。

        MyBatis-Plus是一个基于MyBatis的增强工具,为开发者简化与数据库交互操作。MyBatis-Plus提供了很多实用的增删改查API,并对MyBatis的注解、XML配置和Mapper接口进行了增强,使得使用MyBatis更加方便快捷。

        MyBatis-Plus基于Mybatis的分页原理是在底层查询语句中添加额外的Limit限制和Offset偏移量,通过这种方式获取指定区间的数据集合,从而实现分页展示。同时,MyBatis-plus还提供了方便易用的分页API,允许用户无需手写SQL语句,只需要配置好相关参数即可完成分页操作。

        下面以一个SpringBoot项目为例,演示如何使用MyBatis-Plus进行分页操作。

        1. 引入Mybatis-Plus依赖

        在pom.xml文件中添加以下依赖:

          <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-boot-starter</artifactId>
          <version>3.4.2</version>
          </dependency>

          2. 配置Mybatis-Plus

          在application.yml或application.properties中添加如下配置:

            mybatis-plus:
            mapper-locations: classpath:mapper/*.xml # mapper映射文件存放的位置
            global-config:
            db-config:
            id-type: auto # 主键id自动配置,默认值0,表示使用全局的AUTO主键策略
            field-strategy: not_empty # 指定表字段填充策略
            insert-strategy: not_null # 字段填充,插入时自动填充
            update-strategy: not_null # 字段填充,更新时自动填充
            logic-delete-value: '1' # 逻辑删除 1、已删除 0、未删除
            logic-not-delete-value: '0'
            configuration:
            map-underscore-to-camel-case: true # 驼峰命名

            这里我们进行了全局配置的设置,包括了主键策略、字段填充策略、逻辑删除标志位以及驼峰命名等。

            3. 使用Mybatis-Plus的分页API

            在Mapper接口中,引入Page类并实现多条件查询和统计总记录数功能,在查询方法上添加Page对象就可以进行分页操作。以下是示例代码:

              public interface UserMapper extends BaseMapper<User> {
              /**
              * 根据条件分页查询用户列表
              *
              * @param page 分页对象
              * @param queryWrapper 查询条件
              * @return 查询结果
              */
              IPage<User> selectPageVo(Page<User> page, @Param(Constants.WRAPPER) QueryWrapper<User> queryWrapper);




              }

              其中,BaseMapper为Mybatis-plus提供的通用Mapper,可直接继承使用,无需再写基本的CRUD代码,而IPage则表示分页信息。

              在Controller层进行查询时,需要进行如下设置:

                @RestController
                @RequestMapping("/user")
                public class UserController {




                @Autowired
                private UserService userService;




                /**
                * 分页查询用户列表
                */
                @GetMapping("/list")
                public IPage<User> list(@RequestParam(defaultValue = "1") Integer pageNum,
                @RequestParam(defaultValue = "10") Integer pageSize) {
                Page<User> page = new Page<>(pageNum, pageSize);
                QueryWrapper<User> queryWrapper = new QueryWrapper<>();
                // TODO: 添加查询条件
                return userService.selectPageVo(page, queryWrapper);
                    }
                }

                在这个例子中,我们将查询条件封装在queryWrapper对象中,并传递给selectPageVo方法中的参数。Page对象表示分页信息,包括当前页码和每页显示记录数等。

                Mybatis-Plus提供了非常便利的查询API,支持使用Wrapper作为查询条件,在Wrapper中可以设置条件筛选、排序、分组、聚合等操作。

                下面是一些常见的查询示例:

                4. 查询全部数据

                  List<User> userList = userMapper.selectList(null);

                  这里传递的参数为 null 表示不加任何查询条件,查询所有数据。

                  5. 条件查询

                    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
                    queryWrapper.eq("name", "张三").eq("age", 20);
                    List<User> userList = userMapper.selectList(queryWrapper);

                    在 QueryWrapper 对象中,使用 eq 方法表示等于某一字段的值。同时多个 eq 可以同时连写,表示多个查询条件间为与的关系,即 name 等于"张三"并且 age 等于"20"的数据。

                    6. 模糊查询

                      QueryWrapper<User> queryWrapper = new QueryWrapper<>();
                      queryWrapper.like("name", "张");
                      List<User> userList = userMapper.selectList(queryWrapper);

                      在 QueryWrapper 对象中,使用 like 方法表达模糊查询,"%"符号表示通配符。

                      7. 排序与分页查询

                        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
                        queryWrapper.orderByAsc("age").orderByDesc("create_time"); // 根据 age 升序, create_time 降序排列
                        IPage<User> pageData = new Page<>(1, 10); // 第1页,每页显示10条记录
                        IPage<User> result = userMapper.selectPage(pageData, queryWrapper);
                        List<User> userList = result.getRecords(); // 分页查询结果
                        long total = result.getTotal(); // 总记录数

                        在 QueryWrapper 对象中使用 orderByAsc 和 orderByDesc 方法表达排序操作。同时使用 Page 对象设置分页信息,调用 selectPage 方法实现分页查询。

                        3、总结

                        MyBatis原生支持分页查询,而使用分页插件可以更高效、方便地进行大数据量分页操作。分页插件的原理是通过AOP拦截并处理查询结果,以得到分页信息。

                        Mybatis-Plus提供的查询API简洁易用,且支持灵活的条件筛选、排序、分组和聚合等操作,使得开发者可以轻松实现各种数据查询需求。

                        最后感谢大家的关注!

                        -END-


                        相关推荐:

                        文章转载自1024笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论