[JAVA] Comment obtenir l'identifiant de la clé PRIMAY incrémentée automatiquement dans MyBatis

Chose que tu veux faire

Je veux utiliser la valeur de l'auto_increment PK des données insérées.

Conclusion

Ce n'est pas grave si vous jouez avec le mappeur généré automatiquement par MyBatisGenerator. Cependant, soyez prudent car il sera réinitialisé si vous le générez à nouveau.

Exemple

Supposons que vous ayez une table comme celle-ci (MySQL).

user.sql


CREATE TABLE user (
  user_id int(10) NOT NULL AUTO_INCREMENT,
  name varchar(30) NOT NULL,
  created_at datetime NOT NULL,
  updated_at datetime NOT NULL,
  PRIMARY KEY (user_id)
);

Modifier xml

Ajoutez ʻinsert id = "insertReturnId" pour copier la partie ʻinsert id =" insert " de UserMapper.xml dans son intégralité et renvoyez la valeur auto_incremented.

UserMapper.xml


<!--À l'origine-->
<insert id="insert" parameterType="mypackage.dao.entity.User">
    insert into user (user_id, name, created_at, updated_at)
    values (#{userId,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, 
    #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP})
</insert>
<!--Ajoute ça-->
<insert id="insertReturnId" parameterType="mypackage.dao.entity.User">
    insert into user (user_id, name, created_at, updated_at)
    values (#{userId,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, 
    #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP})
  <selectKey resultType="int" keyProperty="userId" order="AFTER">
      select @@IDENTITY
  </selectKey>
</insert>

Par ailleurs, si order est défini sur BEFORE, la valeur avant insertion peut être prise, et si elle est définie sur AFTER, la valeur après insertion peut être prise.

Bien sûr, vous pouvez ajouter ce qui suit à l'insert d'origine, mais nous ne le recommandons pas.

<selectKey resultType="int" keyProperty="userId" order="AFTER">
    select @@IDENTITY
</selectKey>

Cela est dû au fait que l'insert d'origine renvoie également la valeur int (le nombre d'insertions), donc si vous oubliez de le modifier et de le générer, vous risquez de ne pas le remarquer. Au fait, si vous ajoutez ʻinsert id = "insertReturnId" `, même si vous oubliez de le générer, vous pouvez le remarquer comme une erreur" Il n'y a pas de méthode! "Du côté java.

Modifier la classe Mapper

Ajoutez ʻinsert id = "insertReturnId" `spécifié dans UserMapper.xml.

UserMapper.java


int insertReturnId(User record);

Utilisé en Java (Spring Boot)

Classe de service

UserService.java


@Service
public class UserService {

    @Autowired
    UserMapper userMapper;

    public int createUser(String name) {
	User user = new User();
	user.setName(name);
	user.setCreatedAt(new Date());
	user.setUpdatedAt(new Date());

	//Auto pour userId de l'utilisateur_Entrez la valeur incrémentée
	userMapper.insertReturnId(user);
	
	return user.getUserId();
    }
}

Classe de contrôleur

UserController.java


@Controller
public class AuthController {

    @Autowired
    UserService userService;

    @RequestMapping(value = "/mypage")
    public String mypage(Model model) throws Exception {

        // auto_L'ID utilisateur incrémenté est retourné
        int userId = userService.createUser("my name");

        model.addAttribute("userId", userId);

        return "mypage";
    }
}

Recommended Posts

Comment obtenir l'identifiant de la clé PRIMAY incrémentée automatiquement dans MyBatis
[Swift] Comment obtenir l'ID de document Firebase
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment obtenir la date avec Java
Comment obtenir la longueur d'un fichier audio avec Java
Comment obtenir le jour d'aujourd'hui
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
[Swift] Comment obtenir le nombre d'éléments dans un tableau (super basique)
[Java] Comment obtenir l'URL de la source de transition
graphql-ruby: Comment obtenir le nom de la requête ou de la mutation dans le contrôleur Remarque
[Java] Comment obtenir la valeur maximale de HashMap
[Android] Comment obtenir la langue de réglage du terminal
[Rails] Comment obtenir le contenu des paramètres forts
[Java] Comment obtenir la clé et la valeur stockées dans Map par traitement itératif
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Comment obtenir le nom d'une classe / méthode exécutée en Java
Comment obtenir les informations les plus longues de Twitter à partir du 12/12/2016
Comment dériver le dernier jour du mois en Java
[jsoup] Comment obtenir la totalité de la documentation
Comment obtenir des paramètres dans Spark
Obtenez l'ID de la numérotation automatique
[Rails] Comment obtenir l'URL de la source de transition et la rediriger
[Swift5] Comment obtenir un tableau et un ensemble de différences entre les tableaux
Comment incrémenter la valeur de Map sur une ligne en Java
Obtenez le résultat de POST en Java
L'identité des paramètres de rails [: id]
Comment déterminer le nombre de parallèles
[Java] Comment obtenir le répertoire actuel
Comment trier une liste de SelectItems
Comment spécifier l'attribut id dans JSF
Comment créer un retrait de deux espaces d'un octet dans l'implémentation JAXB du JDK
Comment modifier le nombre maximum et maximum de données POST dans Spark
[Rails] Comment obtenir les informations sur l'utilisateur actuellement connecté avec devise
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
Comment trouver le nombre total de pages lors de la pagination en Java
Comment contraindre l'action de la destination de transition lorsqu'elle n'est pas connectée
Comment obtenir la valeur du paramètre (valeur de la propriété) à partir de la base de données dans Spring Framework
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
Développement Android, comment vérifier null dans la valeur de l'objet JSON
Comment créer votre propre annotation en Java et obtenir la valeur
Résumé de la sélection des éléments dans Selenium
Comment trouver la cause de l'erreur Ruby
Comment obtenir les informations d'identification Keycloak dans la classe d'intercepteur
Comment vérifier le journal dans le conteneur Docker
Personnalisez la répartition du contenu de Recyclerview
Comment obtenir une classe depuis Element en Java
Sortie de la façon d'utiliser la méthode slice
Comment utiliser JQuery dans Rails 6 js.erb
Comment afficher le résultat du remplissage du formulaire
[Java] Comment obtenir l'URL redirigée finale
Comment créer la blockchain la plus simple de Ruby
Comment vérifier les commandes Rails dans le terminal
Je veux obtenir la valeur en Ruby
[Ruby on Rails] Comment faire de la destination du lien une partie de l'ID spécifié
Comment vérifier la dernière version de io.spring.platform pour l'écriture dans pom.xml de Spring (STS)