Recientemente, debido a las necesidades comerciales en un sistema de comercio electrónico, necesito volver a la identificación del producto después de insertar información de un producto. Al principio, me encontré con algunas trampas, así que tomé notas aquí para evitar que fuera olvidado en el futuro.
Obtenga la clave primaria insertada como el siguiente código
Usuario user = nuevo usuario (); user.setUsername ("Chenzhou"); user.setPassword ("xxxx"); user.setComment ("Pruebe la función de insertar datos para devolver la clave principal"); System.out.println ("La clave principal antes de la inserción es:"+user.getUserID ()); userdao.insertandgetid (usuario); // Insertar operaciones system.out.println ("La clave principal después de la inserción es:"+user.getuserID ());Después de consultar información en línea, descubrí que hay aproximadamente dos maneras.
Método 1:
En el archivo de asignación de la clase de entidad "*mapper.xml" se escribe así:
<insert id = "insertandgetid" useGeneratedKeys = "true" keyproperty = "userid" parametertype = "com.chenzhou.mybatis.user"> Insertar en el usuario (nombre de usuario, contraseña, comentario) valores (#{username},#{contraseña},#{comentario}) </sert>Consejos:
useGeneratedKeys = "verdadero" significa establecer el crecimiento propio para la clave principal
KeyProperty = "UserID" significa asignar la ID de crecimiento al campo de IDEDID en la clase de entidad.
parametertype = "com.chenzhou.mybatis.user" Esta propiedad apunta a la clase de entidad de parámetro aprobada
Aquí hay un recordatorio de que no hay un atributo resultante en <sert> </sert>, así que no lo agregue al azar.
El Uérido en la clase de entidad debe tener el Getter () y Setter (); método
Como ya había configurado el crecimiento propio de campo al construir tablas en la base de datos MySQL, finalmente elegí el segundo método.
El segundo método:
También en el archivo de asignación "*mapper.xml" de la clase de entidad, pero debe escribirse así:
< T_Product (ProductName, ProductDesrcible, MerchantId) Values (#{ProductName},#{ProductDesrcible},#{MerchantId}); </sert>Consejos:
No hay un atributo resultante en <sert> </sert>, pero hay una etiqueta <selectKey> </selectkey>.
Order = "After" significa que la declaración de inserción se ejecuta primero, y luego se ejecuta la instrucción de consulta.
Se puede configurar antes o después.
Si se establece antes, primero seleccionará la tecla principal, establezca KeyProperty y luego ejecute la instrucción Insertar.
Si se establece en After, luego ejecute la instrucción Insertar primero y luego el elemento SelectKey, similar a la base de datos Oracle, puede incrustar llamadas de secuencia en la instrucción Insertar, como en Oracle Database.
KeyProperty = "UserID" significa asignar la ID de crecimiento al campo de IDEDID en la clase de entidad.
Seleccione last_insert_id () significa que el ID de crecimiento propio del registro que se acaba de insertar se consulta en la sintaxis de MySQL.
El Uérido en la clase de entidad debe tener el Getter () y Setter (); método
Para lograr los requisitos, los anteriores son suficientes.
Si está interesado aquí, continúe escuchándome sobre un posible error en MyBatis.
¿Por qué la modificación del método de adición en MyBatis tiene un valor de retorno, aunque solicita que la base de datos de inserción sea exitosa y los datos insertados se pueden leer, pero cuando abre la base de datos, no puede ver los datos insertados?
Si desea insertar y devolver la clave principal al implementar los requisitos anteriores, recuerde no escribir de esta manera.
@Override public Long InsertProduct (ProductBean ProductBean) {// TODO Auto Generado Método Stub SQLSession Session = myBatisJDBCutil.CurrentSession (); Productidao productidao = session.getMapper (productidao.class); // aquí *.class // debe corresponder a la capa de interfaz de DAO return productidao.insertProduct (ProductBean); }¿Por qué?
Porque si escribe como anteriormente, la devolución de la ID de clave principal que desea después de la ejecución no es el número de filas afectadas después de ejecutar la declaración de base de datos.
Además, después de ejecutar, encontrará que el aviso es exitoso en la inserción, y también puede leer los datos insertados con el código, pero siempre hay solo un registro.
Además, cuando abra la base de datos, encontrará que no se insertaron datos con éxito en la base de datos.
Estuve deprimido aquí durante mucho tiempo y finalmente descubrí el punto clave.
La diferencia entre tener un valor de devolución y no tener un valor de retorno es:
El valor de retorno es solo para acceder al modo de lectura de la base de datos, y no habrá modificación a los datos de la base de datos, como varios métodos de consulta.
Si no hay valor de retorno, se accederá a la base de datos en modo de lectura y escritura, y los datos en la base de datos se modificarán, como la eliminación y la adición.
Además, según la comprensión personal, MyBatis primero debe almacenarlo en caché a una colección de sesión construida al ejecutar la instrucción Insertar, y luego llamar al controlador subyacente para operar y modificar la base de datos.
session.commit (); Mybatisjdbcutil.clossessession ();
Las dos declaraciones anteriores no se devuelven, lo que significa que solo después de ejecutar estas dos declaraciones, se ejecutarán realmente en la base de datos y modificarán los datos en la base de datos.
Por el contrario, si hay un valor de retorno, estas dos declaraciones no se ejecutan, por lo que la declaración de adición solo se ejecuta en la sesión construida por sí misma por sí misma, pero no se envía a la base de datos, por lo que no hay registro en la base de datos.
Esto explica por qué después de modificar el método de adición en MyBatis para tener un valor de retorno, aunque solicita que la base de datos se inserta correctamente, no puede ver los datos insertados cuando abre la base de datos.
El método de instrucción de inserción en MyBatis no debe tener un valor de retorno, ya que escribir como este es correcto.
@Override public void InsertProduct (ProductBean ProductBean) {// TODO Método generado automático SQLSession Session = MyBatisJDBCUtil.CurrentSession (); Productidao productidao = session.getMapper (productidao.class); // aquí *.class // debe corresponder a la capa de interfaz de dao productidao.insertproduct (productBean); session.commit (); Mybatisjdbcutil.clossessession (); }Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.