SpringBoot系列——MyBatis添加通用Mapper

一、引入依赖

    这里只引入通用Mapper的依赖,mybatis等的依赖引入可参见我的其他博客:

        <!--通用mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>1.1.4</version>
        </dependency>

二、定义通用Mapper

    需要注意的是通用Mapper不能在项目启动时扫描到,它与其他的一般mapper是区别开的:

package top.pullulates.system.Mapper;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 *
 * 通用MAPPER,继承此接口以实现通用的增删改查操作
 *
 * 但是此接口在项目启动时不可被扫描到,否则会报错
 *
 */
public interface TkMapper<T> extends Mapper<T>, MySqlMapper<T> {


    /**
     *
     * 一旦继承了MyMapper<T>,继承的Mapper就拥有了以下通用的方法:
     *
     * //根据实体类不为null的字段进行查询,条件全部使用=号and条件
     * List<T> select(T record);
     *
     * //根据实体类不为null的字段查询总数,条件全部使用=号and条件
     * int selectCount(T record);
     *
     * //根据主键进行查询,必须保证结果唯一
     * //单个字段做主键时,可以直接写主键的值
     * //联合主键时,key可以是实体类,也可以是Map
     * T selectByPrimaryKey(Object key);
     *
     * //插入一条数据
     * //支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
     * //优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
     * int insert(T record);
     *
     * //插入一条数据,只插入不为null的字段,不会影响有默认值的字段
     * //支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
     * //优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
     * int insertSelective(T record);
     *
     * //根据实体类中字段不为null的条件进行删除,条件全部使用=号and条件
     * int delete(T key);
     *
     * //通过主键进行删除,这里最多只会删除一条数据
     * //单个字段做主键时,可以直接写主键的值
     * //联合主键时,key可以是实体类,也可以是Map
     * int deleteByPrimaryKey(Object key);
     *
     * //根据主键进行更新,这里最多只会更新一条数据
     * //参数为实体类
     * int updateByPrimaryKey(T record);
     *
     * //根据主键进行更新
     * //只会更新不是null的数据
     * int updateByPrimaryKeySelective(T record);
     *
     *
     */
}

 三、通用mapper配置信息

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

##通用mapper配置
mapper:
  mappers: top.pullulates.system.Mapper.TkMapper
  not-empty: false
  identity: MYSQL

    关于通用mapper,可能还需要了解这些信息:Spring DevTools 介绍

    通用Mapper目前只支持单表操作,这点局限性较高,且需要定义类似于jpa那种的实体类。

四、实体类定义

    实体类需要指定表名、主键和关联列名,如为临时字段,可使用Transient注解修饰,这里贴出实体类的部分代码:

@Table(name = "sys_user")
@Entity
public class User {

    @Id
    private Long id;

    @Column
    private String userId;

    @Column
    private Long roleId;

    @Transient
    private Long acountId;

    关于实体类定义的更多信息,大家可自行查询,这里只做最基本的介绍。

五、实例讲解

    在这里给大家介绍几个常用的方法以供参考,更多信息,大家可查看源码进行获取。

1. 根据主键查询 

selectByPrimaryKey(ids)

    这里的ids为Object,不论是查询、修改还是删除,都需要指定主键,否则会发生类型转换的异常。此异常是因为未指定主键,导致该字段值被匹配到每个字段,而绝大多数表字段的属性是不同的。

    功能代码如下:

    @RequestMapping(value="/")
    public String hello() {
        User user = userService.selectByPrimaryKey((long) 100000000);
        return user.toString();
    }

 

    /**
     * 根据主键查询用户信息
     *
     * @param ids
     * @return
     */
    @Override
    public User selectByPrimaryKey(Long ids) {
        return userMapper.selectByPrimaryKey(ids);
    }

    注意,不论是这里还是下面,调用的方法均来自Mapper<T>中,在mapper中,我们是没有定义任何方法的。

    运行后,控制台成功打印了用户信息。

2. 新增

    新增与修改,我们一般都是使用selective方法,这样实现方法的复用。原因是selective方法中对字段是否为空进行了判断。参考代码如下:

     @RequestMapping(value="/")
    public String hello() {
        //User user = userService.selectByPrimaryKey((long) 100000000);
        User user = new User((long)100000001,"100000001",(long)100000001,(long)100000001,"测试002","18000000000","111111","100000000",new Date(),"100000000",new Date());
        int count = userService.save(user);
        return count>0?"保存数据成功":"保存数据失败";
    }
   /**
     * 保存用户信息
     *
     * @param user
     * @return
     */
    @Override
    public int save(User user) {
        return userMapper.insertSelective(user);
    }

    运行程序,浏览器打印保存数据成功。

    修改和删除与上面两种方法是一样的,这里不做介绍了。

    感兴趣的童鞋可以看一下源码,里面有许多我们常用的方法比如批量操作等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值