SpringBoot如何使用Mybatis的通用mapper

1. 配置信息

maven pom文件中增加依赖:

<!--mybatis-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>
<!--mapper-->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>1.1.4</version>
</dependency>
<!--persistence依赖-->
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
    <version>1.0</version>
</dependency>

在application.properties配置文件中配置

(1)开启mybatis的驼峰转换

mybatis.configuration.mapUnderscoreToCamelCase=true

(2)配置mybatis的通用mappers路径

mapper.mappers=com.server.common.mapper.CommonMapper

(3)配置mybatis的通用mapper的主键生成方式
mapper.identity=MYSQL

2. Application启动类中引入包变换

  1. 配置MapperScan的导入包时不要引用
    import org.mybatis.spring.annotation.MapperScan

    要引用 tk.mybatis.spring.annotation.MapperScan

3. Pojo实体类配置

  1. Pojo中所有字段类型要写成封装类的类型,即long类型的数据要写成Long。

  2. 数据库中数据表的表名默认使用类名,驼峰转换会自动将UserInfo转换为user_info表名,若不使用默认的对应类名与表名的设置,则需要使用 @Table 为实体类Pojo配置对应于Mysql数据库中的数据表名。 比如MYSQL中有个user表,要在类前面配置表名。

    @Table(name = "user")
    public class UserPojo {}
    
  1. 将主键设置为Id 并且设置主键的自增方式

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long userId;
    
  2. 数据表中字段名默认使用Pojo中属性名的驼峰转下划线形式,如userName属性会对应数据表中user_name字段名,如果不采用默认方式来命名Pojo中属性名,则需要使用 @Column 来指定对应的数据表中的字段名。

    @Column(name = "user_name")
    private Long userFullNameInfo;
    
  3. 在数据库的数据表中不存在的字段,要用 @Transient 注解标识,否则mybatis在生成动态sql语句时会因为数据库表中无对应字段而报错。

4. 定义通用Mapper接口类

自己定义通用Mapper接口,该接口继承自Mybatis的Mapper接口和MySqlMapper接口:

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

public interface CommonMapper<T> extends Mapper<T>,MySqlMapper<T>{

}

注意:通用Mapper不能和业务Mapper放在同一目录下,会报错(错误信息未记录)

5. 定义业务Mapper接口,使用通用Mapper

继承通用Mapper时,必须指定明确的泛型类型。

public interface UserMapper extends CommonMapper<UserPojo> {}

6. 在代码中调用通用mapper的数据库操作方法

通用Mapper中提供的方法传入的参数一般是Pojo对象,实际的参数封装在Pojo对象内部,因此需要将Pojo中所有属性的类型定义为对象类型。

@Autowired
UserMapper userMapper

userMapper.insert(userPojo)

7. 通用Mapper的所有通用方法介绍

一、select

(1) List<T> select (T record)

说明: 根据实体中属性值查询,查询条件使用等号,所根据的属性值set进record对象中。

(2) T selectByPrimaryKey(Object key)

说明:根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号,主键set进对应的实体对象中。

(3) List<T> selectAll()

说明:查询全部结果,select(null)方法能达到同样的效果。

(4) T selectOne(T record)

说明:根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号,属性值set进record对象中。

(5) int selectCount(T record)

说明:根据实体中的属性查询总数,查询条件使用等号,属性值set进record实体对象中。

二、Insert

(1) int insert(T record)

说明:保存一个实体,null的属性也会保存,不会使用数据库默认值。

(2) int insertSelective(T record)

说明:保存一个实体,null的属性不会保存,会使用数据库默认值。

三、Update

(1) int updateByPrimaryKey(T record)

说明:根据主键更新实体全部字段,null值会被更新。主键值被set进record对象。

(2) int updateByPrimaryKeySelective(T record)

说明:根据主键更新属性不为null的值,主键值被set进record对象。

四、 Delete

(1) int delete(T record)

说明:根据实体属性作为条件进行删除,查询条件使用等号,属性值set进record对象。

(2) int deleteByPrimaryKey(Object key)

说明:根据主键字段进行删除,方法参数必须包含完整的主键属性,主键值set进key对象中。

五、 Example方法

下面给出一个根据componentInfoIds列表批量查询的例子:

Example modelExample = new Example(ComponentGenerateReflectPojo.class);
Example.Criteria modelCriteria = modelExample.createCriteria();
modelCriteria.andIn("resultComponentInfoId", componentInfoIds);
List<ComponentGenerateReflectPojo> modelComponentGenerateReflects = generateReflectMapper.selectByExample(modelExample);

(1)List<T> selectByExample(Object example)

说明:根据Example条件进行查询

重点:这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列

(2)int selectCountByExample(Object example)

说明:根据Example条件进行查询总数

(3)int updateByExample(@Param("record") T record, @Param("example") Object example)

说明:根据Example条件更新实体record包含的全部属性,null值会被更新

(4)int updateByExampleSelective(@Param("record") T record, @Param("example") Object example)

说明:根据Example条件更新实体record包含的不是null的属性值

(5)int deleteByExample(Object example)

说明:根据Example条件删除数据

六、 获取insert之后的自增主键

连接postgresql数据库时,要获取insert一条记录后该记录对应的自增主键,则只需要在pojo类的主键字段前增加注解:

@Id
@GeneratedValue(strategy = GenerationType.Identity, generator = "select currval('id'::regclass)")
@Column(insertable = false)
private Long id;

注解@Id用来指明该字段对应数据表中的主键;

注解@Column用来指明进行insert的pojo中该字段不需要set值

注解@GeneratedValue 参数一指明主键产生方式是自增,参数二指明返回该记录对应的当前主键信息。其中regeclass前对应的值在数据库对应的数据表属性中获取。

记录对应的主键信息在完成通用mapper的insert操作后被set进参数pojo中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容