(6) MyBatis desde la entrada al suelo: la adquisición de la clave primaria

Este es el sexto de la serie mybatis. Si no ha leído las sugerencias anteriores, primero vaya a la cuenta pública [Java Tsukuba Fox] para ver el texto anterior, que es conveniente para comprender y comprender.

Los primeros cinco artículos han introducido básicamente el uso básico de MyBatis. Se recomienda encarecidamente que lea los primeros cinco artículos y luego lea el siguiente contenido después de leer la operación real.

Agregar, eliminar y modificar la descripción del valor de retorno

Agregar, eliminar o modificar la base de datos en mybatis, ya sea agregando, eliminando o modificando, su esencia es usar el método correspondiente en jdbc, es decir, el método executeUpdate de java.sql.Statement, o el método executeUpdate de java.sql.PreparedStatement.

Entonces, la clave del problema es dominar el contenido de estos dos métodos, y los parámetros de estos dos métodos son inconsistentes, pero el valor de retorno es int, que se usa para indicar el número de filas afectadas.

El valor de retorno de Mybatis admite int, y también admite Integer, long, Long, boolean, boolean y void, lo que mejora enormemente la flexibilidad y diversidad de la programación.

Pero los amigos inteligentes deben saber que MyBatis puede admitir muchos tipos, de hecho, mybatis convierte el tipo int a otros tipos internamente. Nada avanzado

Después de comprender el valor de retorno de la verificación de adición, eliminación y modificación, el siguiente paso es observar cómo jdbc y mybatis obtienen la clave principal.

Varias formas de obtener la clave principal de jdbc

Antes de hablar sobre la forma en que jdbc obtiene la clave principal, pensemos en cómo se genera la clave principal de la base de datos.

Ese ejemplo de mysql: en mysql, cuando insertamos datos en la tabla, si no se especifica la clave principal (id), entonces mysql generará automáticamente la id, pero en algunos negocios necesitaremos esta id más adelante, tenemos que pensar en formas para obtener esta identificación, especialmente este tipo de identificación de autoincremento autogenerada.

Para tener una comprensión clara, debe ver cómo se implementa jdbc

Método 1: método integrado de jdbc

uso

Los desarrolladores de jdbc ya han pensado en la necesidad de obtener la clave principal y también han desarrollado la API correspondiente para ayudarnos a programar, consulte el método getGeneratedKeys en la clase java.sql.Statement para obtener más detalles.

A partir de este método, sabemos que este método devolverá un conjunto de resultados a partir del cual se puede obtener el valor de la clave primaria autoincrementable. Pero hay un requisito previo para usar este método, es decir, se debe realizar una configuración al ejecutar sql.

Si ejecuta sql a través de java.sql.Statement, debe llamar al siguiente método:

int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException

Tenga en cuenta que el segundo parámetro del método anterior debe establecerse en java.sql.Statement.RETURN_GENERATED_KEYS, lo que indica que se debe devolver el valor de la columna de incremento automático.

Sin embargo, en la mayoría de los casos, usaremos el objeto java.sql.PreparedStatement para ejecutar sql. Si desea obtener un autoincremento, debe establecer el valor del segundo parámetro para crear este objeto, de la siguiente manera:

PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

Luego, podemos obtener el valor de crecimiento automático a través del objeto ResultSet devuelto por getGeneratedKeys, de la siguiente manera:

ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
if (generatedKeys!=null && generatedKeys.next()) {
    log.info("自增值为:{}", generatedKeys.getInt(1));
}

Método 2: consulta para obtener después de insertar

uso

Por supuesto, además de jdbc pensó en nuestras necesidades, la base de datos mysql también pensó en esta demanda, y hay declaraciones correspondientes para ayudarnos a obtener el valor de identificación del último registro insertado después de insertar datos, como se muestra a continuación.

SELECT LAST_INSERT_ID()

Entonces podemos usar inmediatamente la conexión actual para enviar el SQL anterior para obtener el valor de la columna de incremento automático después de insertarlo. Este método es relativamente simple y conveniente, pero existen algunos problemas, es decir, pueden ocurrir problemas graves en el caso de alta concurrencia y subprocesos múltiples, por lo que generalmente no se recomienda su uso.

Método 3: obtener antes de insertar

El último método es obtenerlo antes de insertarlo.

No sé si has jugado a Oracle. No hay una columna de crecimiento automático en mysql, pero Oracle tiene una función que puede realizar un crecimiento automático. Esta función es una secuencia. Una secuencia es equivalente a un dispositivo de incremento automático con una inicial valor. Tamaño de paso incremental. Por supuesto, esta secuencia proporciona algunas funciones para que las usemos. Puede obtener el valor actual y el siguiente valor de la secuencia. El uso es el siguiente:

  • Primero define una secuencia
  • Obtenga el siguiente valor: SELECT nombre de secuencia NEXTVAL FROM dual;

3 formas de mybatis para obtener la clave principal

Dado que jdbc tiene tres métodos, mybatis también tiene varios métodos correspondientes.

Método 1: use el método jdbc incorporado internamente

uso

Mybatis usa el método jdbc incorporado mencionado anteriormente.

Necesitamos configurar en Mapper xml, como:

<insert id="insertUser1" parameterType="zhonghu.mybatis.chat01.UserModel" useGeneratedKeys="true" keyProperty="id">
    <![CDATA[
    INSERT INTO user (name,age,salary) VALUES (#{name},#{age},#{salary})
     ]]>
</insert>

Hay 2 parámetros clave que deben configurarse:

  • useGeneratedKeys: establecido en verdadero
  • keyProperty: El nombre de la propiedad en el objeto de parámetro. Después de que la inserción final sea exitosa, mybatis establecerá el valor propio agregado a la propiedad especificada por keyProperty a través de la reflexión.

Método 2: consulta para obtener la clave principal después de insertar

uso

Este método es el mismo que el segundo método de jdbc descrito anteriormente. Después de insertar, el valor de la clave principal se obtiene a través de la consulta y luego se completa con el atributo especificado. La configuración xml del mapeador es la siguiente:

<insert id="insertUser2" parameterType="zhonghu.mybatis.chat01.UserModel">
    <selectKey keyProperty="id" order="AFTER" resultType="long">
    <![CDATA[
    SELECT LAST_INSERT_ID()
     ]]>
    </selectKey>
    <![CDATA[
    INSERT INTO user (name,age,salary) VALUES (#{name},#{age},#{salary})
     ]]>
</insert>

El código clave es la parte contenida en el elemento selectKey. Este elemento puede contener un sql. Este sql se puede ejecutar antes o después de la inserción (antes o después de que se configure el atributo order), y luego el resultado de la operación sql será establecido en el atributo especificado por keyProperty, el elemento SelectKey tiene 3 atributos que deben especificarse:

  • keyProperty: El nombre de la propiedad en el objeto de parámetro. Después de que la inserción final sea exitosa, mybatis establecerá el valor propio agregado a la propiedad especificada por keyProperty a través de la reflexión.
  • order: Especifica si el sql en el elemento selectKey se ejecuta antes o después de la inserción, valor opcional (BEFORE | AFTER), de esta forma elegimos AFTER
  • resultType: el tipo correspondiente al atributo especificado por keyProperty, por ejemplo, el tipo correspondiente al id anterior es java.lang.Long, directamente escribimos el alias long

Método 3: consulta para obtener la clave principal antes de insertar

uso

Este método es el mismo que el tercer método de jdbc descrito anteriormente. Antes de insertar, el valor de la clave principal se obtiene a través de una consulta y luego se completa el atributo especificado, y luego se ejecuta la inserción. La configuración xml del mapeador es la siguiente :

<insert id="insertUser3" parameterType="zhonghu.mybatis.chat01.UserModel">
    <selectKey keyProperty="id" order="BEFORE" resultType="long">
    <![CDATA[ 获取主键的select语句 ]]>
    </selectKey>
    <![CDATA[
    INSERT INTO user (name,age,salary) VALUES (#{name},#{age},#{salary})
     ]]>
</insert>

El código clave es la parte contenida en el elemento selectKey. Este elemento puede contener un sql. Este sql se puede ejecutar antes o después de la inserción (antes o después de que se configure el atributo order), y luego el resultado de la operación sql será establecido en el atributo especificado por keyProperty, el elemento SelectKey tiene 3 atributos que deben especificarse:

  • keyProperty: El nombre de la propiedad en el objeto de parámetro. Después de que la inserción final sea exitosa, mybatis establecerá el valor propio agregado a la propiedad especificada por keyProperty a través de la reflexión.
  • order: Especifica si el sql en el elemento selectKey se ejecuta antes o después de la inserción, valor opcional (ANTES | DESPUÉS), de esta forma elegimos ANTES
  • resultType: el tipo correspondiente al atributo especificado por keyProperty, por ejemplo, el tipo correspondiente al id anterior es java.lang.Long, directamente escribimos el alias long

para resumir

Este artículo se centra en algunos métodos de uso avanzados para agregar, eliminar, modificar y verificar en mybatis, especialmente el método para obtener la clave primaria. Aquí, una comparación de jdbc y mybatis presenta tres métodos.

Por fin

  • Si sientes que eres recompensado después de leerlo, espero que le prestes atención. Por cierto, dame un pulgar hacia arriba. Esta será la mayor motivación para mi actualización. Gracias por tu apoyo.
  • Bienvenidos a todos para que presten atención a mi cuenta pública [Java Fox], enfocándome en los conocimientos básicos de Java y la computadora, prometo dejarles obtener algo después de leerlo, si no me creen, péguenme
  • Busque la conexión triple con un clic: me gusta, reenviar y mirar.
  • Si tiene diferentes opiniones o sugerencias después de leer, por favor comente y comparta con nosotros. Gracias por su apoyo y cariño.

——Soy Chuhu, y amo la programación tanto como a ti.

Bienvenido a seguir la cuenta pública "Java Fox" para conocer las últimas noticias.

Supongo que te gusta

Origin blog.csdn.net/issunmingzhi/article/details/113819713
Recomendado
Clasificación