# spring-boot-mapper **Repository Path**: tongjh/spring-boot-mapper ## Basic Information - **Project Name**: spring-boot-mapper - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-01-06 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 通用Mapper 在使用spring-boot mybatis操作数据库的时候,使用通用Mapper可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。通用Mapper提供了默认的操作数据库增删改查的功能,如果你的操作很复杂,还可以自己构建动态sql,实现自己的通用Mapper功能等 下面介绍通用Mapper的操作过程 ### 项目依赖 pom.xml ```aidl org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.1 tk.mybatis mapper-spring-boot-starter 1.1.4 com.github.pagehelper pagehelper-spring-boot-starter 1.2.1 ``` ## 配置 application.properties ```aidl #mybatis mybatis.type-aliases-package=com.example.mapper.domain mybatis.mapper-locations=classpath:mapper/*.xml #mappers 多个接口时逗号隔开 mapper.mappers=com.example.mapper.util.MyMapper mapper.not-empty=false mapper.identity=MYSQL #pagehelper pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql ``` ## 配置 Spring DevTools 在使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A。 同一个类如果使用了不同的类加载器,就会产生这样的错误,所以解决方案就是让通用Mapper和实体类使用相同的类加载器即可。 DevTools 默认会对 IDE 中引入的所有项目使用 restart 类加载器,对于引入的 jar 包使用 base 类加载器,因此只要保证通用Mapper的jar包使用 restart 类加载器即可。 在 src/main/resources 中创建 META-INF 目录,在此目录下添加 spring-devtools.properties 配置,内容如下: ```aidl restart.include.mapper=/mapper-[\\w-\\.]+jar restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar ``` ## 通用Mapper接口 在项目中新建util/MyMapper.java 继承Mapper作为通用Mapper的接口 ``` package com.example.mapper.util; import tk.mybatis.mapper.common.Mapper; import tk.mybatis.mapper.common.MySqlMapper; public interface MyMapper extends Mapper,MySqlMapper { //TODO //FIXME 特别注意,该接口不能被扫描到,否则会出错 } ``` ## 使用Mapper 在项目中新建mapper目录,下面的每个文件作为一张表,只要继承上门的MyMapper接口就可以使用基本的增删改查操作了。 下面举例user表,建立一个mapper/UserMapper.java ```aidl package com.example.mapper.mapper; import com.example.mapper.domain.User; import com.example.mapper.util.MyMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface UserMapper extends MyMapper {} ``` 一旦继承了MyMapper,继承的Mapper就拥有了以下通用的方法: ```aidl //根据实体类不为null的字段进行查询,条件全部使用=号and条件 List 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); ``` ## 参考文档 + https://github.com/abel533/MyBatis-Spring-Boot + https://mapperhelper.github.io/docs/