最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis-Plus適配聯(lián)合主鍵實(shí)現(xiàn)方式

 更新時(shí)間:2025年11月04日 09:24:20   作者:紫菜紫薯紫甘藍(lán)  
本文介紹了如何使用Mybatis-Plus(MP)和Mybatis-Plus-Plus(MPP)工具來處理聯(lián)合主鍵的問題,并詳細(xì)描述了整合過程、遇到的問題及解決方式

Mybatis-Plus適配聯(lián)合主鍵

背景是這樣的,最近著手修改一個(gè)老項(xiàng)目,平時(shí)其他項(xiàng)目用的都是 JPA、倒不是不會用 Mybatis,只是這個(gè)項(xiàng)目是用來解析 xml 為對象并進(jìn)行存儲的,而且有的類字段特別多,覺得寫 mapper 和 sql 太麻煩了,于是想到了 mybatis-plus(以下簡稱mp)。

本來以為很好解決的事情,沒想到默認(rèn)的 mp 不支持聯(lián)合主鍵,于是查詢了一些資料,有一個(gè) mybatisplus-plus(以下簡稱mpp) 的工具,因此總結(jié)一個(gè) demo 出來,包括整合過程和其中遇到的問題和解決方式。

1、引入依賴

	<properties>
		<mybatis-plus.version>3.4.0</mybatis-plus.version>
		<mybatis-plus-plus.version>1.5.1-RELEASE</mybatis-plus-plus.version>
	</properties>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <dependency>
            <groupId>com.github.jeffreyning</groupId>
            <artifactId>mybatisplus-plus</artifactId>
            <version>${mybatis-plus-plus.version}</version>
        </dependency>

注意事項(xiàng):

  • mp 和 mpp 的版本號對應(yīng)關(guān)系是有要求的,版本不匹配會出現(xiàn)意想不到的錯誤

2、實(shí)體類定義

package com.xsdl.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
import lombok.Data;

@Data
@TableName(value = "MP_USER")
public class User {

    @MppMultiId
    @TableField(value = "id")
    private String uuid;

    @MppMultiId
    @TableField(value = "xh")
    private Integer xh;

    private String name;

    private Integer age;

    private String email;

}

我在項(xiàng)目中日常遇到的聯(lián)合主鍵就是 uuid + xh 來解決,當(dāng)然用 uuid 做主鍵,再用另一個(gè)字段來關(guān)聯(lián)其他表也可以,而且也沒有聯(lián)合主鍵這個(gè)問題。

注意事項(xiàng):

  • 使用的是 @MppMultiId 而不是 @TableId
  • 雖然數(shù)據(jù)庫字段叫 id, 但我在類中的定義卻是 uuid

3、Mapper(dao)定義

package com.xsdl.mapper;

import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
import com.xsdl.pojo.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends MppBaseMapper<User> {

}

注意事項(xiàng):

  • 繼承的是 MppBaseMapper,而不是 BaseMapper

4、簡單使用

如果你只是想要使用它進(jìn)行簡單的持久化操作,現(xiàn)在已經(jīng)足夠了,例如下面的用法

package com.xsdl.controller;

import com.xsdl.mapper.UserMapper;
import com.xsdl.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

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

    @Autowired
    private UserMapper userMapper;

    @GetMapping("/list")
    public void list() {
        List<User> users = userMapper.selectList(null);
        for (User user : users) {
            log.info("user:{}", user);
        }
        for (int i = 0; i < users.size(); i++) {
            User user = users.get(i);
            user.setName("xsdl" + i);
            userMapper.updateByMultiId(user);
        }
    }

}

注意事項(xiàng):

  • 這里的 update 操作,我用的是 updateByMultiId,不能用 updateById

但是我都用聯(lián)合主鍵了,說明我大概率是想要批量保存的,而 MppBaseMapper 并不支持這樣的操作,于是需要引入 Service

5、Service 定義

package com.xsdl.service;

import com.github.jeffreyning.mybatisplus.service.IMppService;
import com.xsdl.pojo.User;

public interface UserService extends IMppService<User> {

}

注意事項(xiàng):

  • 繼承了 IMppService

6、ServiceImpl 定義

package com.xsdl.service;

import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.xsdl.mapper.UserMapper;
import com.xsdl.pojo.User;
import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImpl extends MppServiceImpl<UserMapper, User> implements UserService {

}

注意事項(xiàng):

  • 先繼承 MppServiceImpl,并把對應(yīng)的 Mapper 傳入再實(shí)現(xiàn)對應(yīng)的 Service

7、使用

package com.xsdl.controller;

import com.xsdl.mapper.UserMapper;
import com.xsdl.pojo.User;
import com.xsdl.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

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

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private UserService userService;

    @GetMapping("/list")
    public void list() {
        List<User> users = userMapper.selectList(null);
        for (User user : users) {
            log.info("user:{}", user);
        }
        for (int i = 0; i < users.size(); i++) {
            User user = users.get(i);
            user.setName("zss" + i);
            userMapper.updateByMultiId(user);
        }

        List<User> userList = IntStream.rangeClosed(1, 10).mapToObj(i -> {
            User user = new User();
            user.setUuid(i + "" + i);
            user.setXh(i);
            user.setName("zss" + i);
            user.setAge(i);
            user.setEmail("zss" + i + "@qq.com");
            return user;
        }).collect(Collectors.toList());
        userService.saveBatch(userList);

        List<User> list = userService.list();
        for (User user : list) {
            log.info("user:{}", user);
        }
    }

}

注意啟動類上需要加上: @EnableMPP 注解

@SpringBootApplication
@MapperScan("com.xsdl.mapper")
@EnableMPP
public class SpringbootApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringbootApplication.class, args);
	}
}

可能出現(xiàn)的問題:

1、我在第二步 實(shí)體類定義 這里強(qiáng)調(diào)說,雖然數(shù)據(jù)庫字段名是 id,但我的屬性名卻是 uuid,如果設(shè)置為 id,啟動項(xiàng)目會出現(xiàn)這樣的錯誤

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘userController’: Unsatisfied dependency expressed through field ‘userMapper’; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘userMapper’ defined in file Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: java.lang.RuntimeException: not found column for id

大概意思就是說創(chuàng)建 UserMapper 失敗,原因是找不到 id 列,我沒詳細(xì)去解決這個(gè)錯誤,推測原因可能是 mp 里把類里的 id 屬性自動解釋為主鍵,解決方式就是像我一樣,給它起個(gè)新的名字,然后使用 @TableField(value = "id") 標(biāo)記一下

2、因?yàn)槲医邮值倪@個(gè)項(xiàng)目早期是 mybatis 嘛,我雖然引入了 mp,但不敢刪除之前的 mybatis 的依賴,于是二者共存了,有機(jī)會遇到這樣的錯誤

Error creating bean with name ‘com.github.jeffreyning.mybatisplus.conf.PlusConfig’: Invocation of init method failed; nested exception is java.lang.NoSuchFieldException: CLASS_RESOLVER

這個(gè)錯誤就通俗易懂多了,說創(chuàng)建這個(gè) bean 失敗,原因是根本就沒有一個(gè) CLASS_RESOLVER 的字段,進(jìn)入 PlusConfig 查看源碼

package com.github.jeffreyning.mybatisplus.conf;

@Import({PlusACUtils.class, MppSqlInjector.class})
@Configuration
public class PlusConfig {
    private static final Logger logger = LoggerFactory.getLogger(PlusConfig.class);
    @Autowired
    private Environment env;

    public PlusConfig() {
    }

    @PostConstruct
    public void initRM() throws Exception {
        NhOgnlClassResolver resolver = new NhOgnlClassResolver();
        resolver.baseList.add("com.github.jeffreyning.mybatisplus.check");
        LambdaUtil.setValue(OgnlCache.class, "CLASS_RESOLVER", resolver);
        String utilBasePaths = this.env.getProperty("mpp.utilBasePath");
    }
}

17 行通過工具類向 OgnlCache 的 CLASS_RESOLVER 設(shè)置值,但是這個(gè)字段在 OgnlCache 類不存在,這個(gè)其實(shí)是 mybatis 和 mpp 版本問題,mybatis 的早期版本中,OgnlCache 沒有這個(gè)字段,因此修改下 mybatis 的版本就可以了,我這里修改到了 3.5.5

   	<dependency>
   		<groupId>org.mybatis</groupId>
   		<artifactId>mybatis</artifactId>
   		<version>3.5.5</version>
   	</dependency>

不過我后來發(fā)現(xiàn) mp 和 springboot 的依賴中其實(shí)已經(jīng)引入了 mybatis 的依賴,似乎把老的刪了就行,總之這個(gè)問題跟 mybatis 的版本有關(guān)系

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用Java反射機(jī)制實(shí)現(xiàn)對象相同字段的復(fù)制操作

    利用Java反射機(jī)制實(shí)現(xiàn)對象相同字段的復(fù)制操作

    這篇文章主要介紹了利用Java反射機(jī)制實(shí)現(xiàn)對象相同字段的復(fù)制操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 如何使用Java?8函數(shù)式編程優(yōu)雅處理多層嵌套數(shù)據(jù)

    如何使用Java?8函數(shù)式編程優(yōu)雅處理多層嵌套數(shù)據(jù)

    Java8是Java語言歷史上的一個(gè)重大更新,它帶來了許多新的特性和改進(jìn),其中函數(shù)式編程的引入是其亮點(diǎn)之一,這篇文章主要介紹了如何使用Java?8函數(shù)式編程優(yōu)雅處理多層嵌套數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • 使用Java7的Files工具類和Path接口來訪問文件的方法

    使用Java7的Files工具類和Path接口來訪問文件的方法

    下面小編就為大家分享一篇使用Java7的Files工具類和Path接口來訪問文件的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • JAVA獲取本地MAC地址的方法

    JAVA獲取本地MAC地址的方法

    這篇文章主要介紹了JAVA獲取本地MAC地址的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringCloud如何解決服務(wù)之間的通信問題

    SpringCloud如何解決服務(wù)之間的通信問題

    本文主要介紹了SpringCloud如何解決服務(wù)之間的通信問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • java實(shí)現(xiàn)時(shí)間控制的幾種方案

    java實(shí)現(xiàn)時(shí)間控制的幾種方案

    這篇文章主要介紹了java實(shí)現(xiàn)時(shí)間控制的幾種方案,本文從多個(gè)方面給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • JAVAEE model1模型實(shí)現(xiàn)商品瀏覽記錄(去除重復(fù)的瀏覽記錄)(一)

    JAVAEE model1模型實(shí)現(xiàn)商品瀏覽記錄(去除重復(fù)的瀏覽記錄)(一)

    這篇文章主要為大家詳細(xì)介紹了JAVAEE model1模型實(shí)現(xiàn)商品瀏覽記錄,去除重復(fù)的瀏覽記錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • SpringBoot屬性注入的兩種方法

    SpringBoot屬性注入的兩種方法

    這篇文章主要介紹了SpringBoot屬性注入的兩種方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • sharding-jdbc中的事務(wù)詳細(xì)解讀

    sharding-jdbc中的事務(wù)詳細(xì)解讀

    這篇文章主要介紹了sharding-jdbc中的事務(wù)詳細(xì)解讀,sharding-jdbc在分庫分表方面提供了很大的便利性,在使用DB的時(shí)候,通常都會涉及到事務(wù)這個(gè)概念,而在分庫分表的環(huán)境上再加上事務(wù),就會使事情變得復(fù)雜起來,需要的朋友可以參考下
    2023-12-12
  • 如何在Java中優(yōu)雅地判空詳解

    如何在Java中優(yōu)雅地判空詳解

    這篇文章主要大家介紹了關(guān)于如何在Java中優(yōu)雅地判空的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評論

吴江市| 调兵山市| 滨海县| 东宁县| 高邮市| 哈巴河县| 江城| 子长县| 安西县| 屯昌县| 莱州市| 托里县| 泉州市| 韩城市| 敦化市| 万源市| 临清市| 陆良县| 临泉县| 米易县| 肥乡县| 饶河县| 乳源| 南阳市| 皋兰县| 安吉县| 梅州市| 屏东市| 台北市| 石河子市| 平乐县| 忻城县| 鹰潭市| 苏尼特左旗| 台州市| 清河县| 广昌县| 灵寿县| 普定县| 临朐县| 黔西县|