SpringBoot——通用Mapper

注意:通用Mapper支持单表操作,不支持通用的多表联合查询。

简介

通用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。极其方便的使用MyBatis单表的增删改查。支持单表操作,不支持通用的多表联合查询。通用 Mapper 支持 Mybatis-3.2.4 及以上版本。

主要作用:自动生成增删改查的SQL语句,大大减化对单表的操作。

原生Mybatis的痛点

  1. mapper.xml文件里有大量的sql,当数据库表字段变动,配置文件就要修改
  2. 需要自己实现sql分页,select * from table where . . . limit 1,3自己手写分页,除了传参page、pageSize,还需要返回条目总数count。
  3. 数据库可移植性差:如果项目更换数据库,比如oracle-->mysql,mapper.xml中的sql要重新写,因为Oracle的PLSQL 和mysql 支持的函数是不同的。
  4. 生成的代码量过大。
  5. 批量操作,批量插入,批量更新,需要自写。

最早用 MyBatis 时,先是完全手写,然后用上了 MyBatis 代码生成器(简称为 MBG,MyBatis逆向工程),在使用 MBG 过程中,发现一个很麻烦的问题,如果数据库字段变化很频繁,就需要反复重新生成代码,并且由于 MBG 覆盖生成代码和追加方式生成 XML,导致每次重新生成都需要大量的比对修改。除了这个问题外,还有一个问题,仅仅基础的增删改查等方法,就已经产生了大量的 XML 内容,还没有添加一个自己手写的方法,代码可能就已经几百行了,内容多,看着比较碍事。

因为很多人都在使用 MBG,MBG 中定义了很多常用的单表方法,为了解决前面提到的问题,也为了兼容 MBG 的方法避免项目重构太多,在 MBG 的基础上结合了部分 JPA 注解产生了通用 Mapper。通用 Mapper 可以很简单的让你获取基础的单表方法,也很方便扩展通用方法。使用通用 Mapper 可以极大地提高你的工作效率。

使用前的疑问

(1)这个东西使用后,会不会降低我们的代码执行效率呢?

答:其实他的原理就是利用反射机制拼出的 XML形式的动态SQL然后去执行,所以你说代码时间消耗肯定也会有一些,但是这是很小很小的,再者在现在项目中,对于提供给前端的接口,通常都会利用些组件进行访问加速(毕竟直接从数据中检索不如在内存中来的快些),比如:redis、memcache、elastic search、solr等,所以执行效率问题是可以避免或忽略的。

(2)如果有些方法不想使用,例如:用户的接口服务不能使用删除方法也不想暴漏出来,该怎么办呢?

答:我们通常会定义增、删、改、查四个基础Mapper接口,你可以按需要引入进行使用,其实即使你使用了公共的CrudMapper(代表增删改查都在一起的类)也没有问题,只要你在你的service层不要放出删除方法也是可以的。

快速入门

  • 添加通用Mapper依赖
    <!--通用Mapper-->
            <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter -->
            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper-spring-boot-starter</artifactId>
                <version>${mapper-spring-boot-starter.version}</version>
            </dependency>
     

通用Mapper默认引用了jdbc与mybatis启动器,并开启驼峰,可去除重复依赖

  • 实体类配置
    通过 MBG 配合 专用代码生成器可以直接生成实体类等基础代码,为了避免信息量过大,这里当作手工编写和配置。

    package com.hern.estore.user.bean;
    
    import lombok.*;
    
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import java.util.Date;
    
    /**
     * @program: Hern-Estore
     * @description: UmsMember
     * @author: 宋兆恒[email protected]
     * @create: 2020-03-12 23:28
     **/
    @Getter
    @Setter
    @ToString
    @AllArgsConstructor
    @NoArgsConstructor
    public class UmsMember {
        //指定主键
        @Id
        //为一个实体生成一个唯一标识的主键,主键由数据库生成, 采用数据库自增长,
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private String id;
        private String memberLevelId;
        private String username;
        private String password;
        private String nickname;
        private String phone;
        private int status;
        private Date createTime;
        private String icon;
        private int gender;
        private Date birthday;
        private String city;
        private String job;
        private String personalizedSignature;
        private int sourceType;
        private int integration;
        private int growth;
        private int luckeyCount;
        private int historyIntegration;
    }
    
    注意:经过上面简单的配置后,相当于就有了 MyBatis 中的关系映射了,特别注意,这个映射关系只对通用 Mapper 有效,自己手写方法时,需要自己处理映射关系。
  • 创建Mapper接口

    package com.hern.estore.user.mapper;
    
    import com.hern.estore.user.bean.UmsMember;
    import tk.mybatis.mapper.common.Mapper;
    
    import java.util.List;
    
    /**
     * @program: Hern-Estore
     * @description: UserMapper
     * @author: 宋兆恒[email protected]
     * @create: 2020-03-12 23:02
     **/
    public interface UserMapper extends Mapper<UmsMember> {
        List<UmsMember> selectAllUser();
    }
    
    这里继承了 tk.mybatis.mapper.common.Mapper接口,在接口上指定了泛型类型 UmsMember。当你继承了Mapper接口后,此时就已经有了针对UmsMember的大量方法。
  • 写service实现
    Service接口

    package com.hern.estore.user.service;
    
    import com.hern.estore.user.bean.UmsMember;
    import java.util.List;
    
    /**
     * @program: Hern-Estore
     * @description: UserService
     * @author: 宋兆恒[email protected]
     * @create: 2020-03-12 23:00
     **/
    public interface UserService {
    
        //获取所有会员信息
        List<UmsMember> getAllUser();
    
    }
    

    Service方法实现

    package com.hern.estore.user.service.impl;
    
    import com.hern.estore.user.bean.UmsMember;
    import com.hern.estore.user.mapper.UserMapper;
    import com.hern.estore.user.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * @program: Hern-Estore
     * @description: UserServiceImpl
     * @author: 宋兆恒[email protected]
     * @create: 2020-03-12 23:00
     **/
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        UserMapper userMapper;
    
        @Override
        public List<UmsMember> getAllUser() {
            List<UmsMember> umsMembers = userMapper.selectAll();
            return umsMembers;
        }
    
    }
    
  • 配置通用 Mapper
    在SpringBoot启动类中,配置@MapperScan扫描,注意:这里的@MapperScan注解不在是MyBatis提供的,而是通用Mapper提供的,要特别注意。

    package com.hern.estore.user;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import tk.mybatis.spring.annotation.MapperScan;
    
    @SpringBootApplication
    @MapperScan(basePackages = "com.hern.estore.user.mapper")
    public class EstoreUserApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EstoreUserApplication.class, args);
        }
    
    }
    

作者:努力努力再努力_y
链接:https://www.jianshu.com/p/7dadb3857f93
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

发布了705 篇原创文章 · 获赞 666 · 访问量 143万+

猜你喜欢

转载自blog.csdn.net/qq_36761831/article/details/104843758
今日推荐