En este artículo, presentaré los principios del marco de MyBatis y el programa introductorio de MyBatis para realizar la adición, eliminación, modificación e inspección del usuario. ¿Cuáles son sus ventajas y desventajas y qué relación existe entre mybatis y hibernate? Espero que sea útil para mis amigos. Si hay alguna deficiencia, dame algunos consejos.
¿Qué es mybatis?
MyBatis es un proyecto de código abierto de Apache. En 2010, este proyecto se trasladó de Apache Software Foundation a Google Code y pasó a llamarse MyBatis. Migró a Github en noviembre de 2013.
MyBatis es un excelente marco de capa de persistencia que admite SQL personalizado, procedimientos almacenados y mapeo avanzado. MyBatis evita casi todos los códigos JDBC y parámetros de configuración manual y conjuntos de resultados de diezma. MyBatis utiliza XML o anotaciones simples para configurar y mapear primitivas, mapear interfaces y Java Pojos (objetos java antiguos) en los registros en la base de datos. En pocas palabras, MyBatis es un marco de capa persistente. MyBatis permite que el programa se concentre en SQL y genere de forma libre y flexible las declaraciones SQL que satisfagan las necesidades a través del método de mapeo proporcionado por MyBatis. MyBatis puede ingresar automáticamente el mapa de los parámetros de entrada para preparar y asignar flexiblemente el resultado de la consulta establecido en objetos Java.
A continuación, comprendamos el principio del marco de MyBatis a través de una imagen:
Explicación de la arquitectura del marco:
a. Cargando el archivo de configuración: la configuración proviene de dos lugares, uno es el archivo de configuración y el otro es la anotación del código Java. La información de configuración de SQL se carga en objetos MappedStatement (incluida la configuración de mapeo de parámetros aprobados, las declaraciones SQL ejecutadas y la configuración de mapeo de resultados) y se almacena en la memoria.
b. Valorización SQL: cuando la capa de interfaz API recibe la solicitud de llamada, recibirá la ID del SLQ entrante y el objeto entrante (puede ser MAP o Tipo de datos básico). MyBatis encontrará la estación mapeada correspondiente basada en la ID del SQL, y luego analizará el MappedStatement en función del objeto de parámetro entrante. Después de analizar, puede obtener las declaraciones y parámetros SQL al final.
do. Ejecución SQL: tome el SQL y los parámetros finales a la base de datos para su ejecución, y obtenga los resultados de operar la base de datos.
d. Mapeo de resultados: Convierta los resultados de la base de datos operativa de acuerdo con la configuración de mapeo, que puede convertirse en hashmap, javabean o tipo de datos básico, y devuelve el resultado final.
Análisis del programa de inicio de mybatis
A continuación, el editor introducirá los requisitos específicos en combinación con la demostración, y los requisitos son los siguientes:
Consulta información del usuario basada en ID de usuario;
Consulta información del usuario Fuzzyly basada en el nombre de usuario;
Agregue, elimine y actualice a los usuarios.
El primer paso es crear varios paquetes y clases, el directorio del proyecto es el siguiente:
El segundo paso es escribir el contenido en sqlmapconfig.xml, y configurar el entorno en ejecución, la fuente de datos, las transacciones, etc. de MyBatis. El código se ve así:
<span style = "Font-Family: Comic Sans MS; Font-Size: 18px;"> <? Xml versión = "1.0" encoding = "utf-8"?> < "http://mybatis.org/dtd/mybatis-3-config.dtd"> <figuration> <!-Después de integrar el resorte, la configuración de los entornos se abolirá-> <entornos default = "desarrollado"> <! use la gestión de transacciones de JDBC, el control de transacciones de la transacción está en mybatis-> <transactionManger typeer = "jdbc"/! grupo de conexión, administrado por MyBatis -> <DataSource type = "Polled"> <Property Name = "Driver" Value = "$ {jdbc.driver}"/> <propiedad name = "url" valor = "$ {jdbc.url}"/> <name de propiedad = "userner" value = "$ {jdbc.username}"/> <nombre de propiedad = "contraseña" value = "$ {jdbc.password}"/> </shasource> </entornos> <!-Cargando el archivo de mapa-> <mappers> resource = "sqlmap/user.xml"/> </mappers> </configuration> </span>El tercer paso es escribir el contenido en user.java, como se muestra a continuación:
<span style = "Font-Family: Comic Sans MS; Font-Size: 18px;"> paquete cn.itcast.mybatis.po; import java.util.date; /** * * <p> Título: Usuario </p> * <p> Descripción: User Po </p> * @Author Ding Guohua * @Date 31 de julio de 2016 15:39:04 * @Version 1.0 */Usuario de clase pública {// El nombre de atributo corresponde a las campos de la tabla de datos de datos privada ID ID; Nombre de usuario de cadena privada; // nombre de usuario String String Sex; // Gender Private Date Birthday; // Cumpleaños Dirección de cadena privada; // dirección public int getId () {return id; } public void setid (int id) {this.id = id; } public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; } public String getsex () {return sex; } public void setsex (sexo de cadena) {this.sex = sex; } Fecha pública GetBirthday () {regreso de cumpleaños; } public void setBirthday (cumpleaños de fecha) {this.birthday = cumpleaños; } public String getAddress () {Dirección de retorno; } public void setAddress (dirección de cadena) {this.address = dirección; } @Override public string toString () {return "user [id =" + id + ", username =" + username + ", sex =" + sex + ", cumpleaños =" + cumpleaños + ", dirección =" dirección + "]"; }} </span>Paso 4: Para implementar la función de agregar, eliminar, modificar y buscar, primero escriba el contenido en user.xml, como se muestra a continuación:
<span style = "Font-Family: Comic Sans MS; Font-Size: 18px;"> <? Xml versión = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" " "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-El espacio de nombres del espacio de nombres es la función de clasificar la administración de SQL y comprender el aislamiento de SQL nota: Uso del método de proxy de mapper para desarrollar, el espacio de nombres de nombres reproduce un rol especial e importante-> <mapper nombres de nombres = "test"> <test "<!-statements para desarrollar, estatuas de nombres de nombres en el que se reproduce un rol especial e importante-> <mapper nombrespace =" test "> <test"! Archivo de asignación-> <!-Requisitos: consulte los registros de la tabla de usuario a través de ID-> <!-Ejecutar la base de datos de la base de datos ID: Identifique el SQL en el archivo de asignación Encapsula la instrucción SQL en un objeto MappedStatement, por lo que el ID se llama el ID de parámetería: especificar el tipo de Tipo de la entrada del parámetro de entrada, aquí especificar el tipo int type #} para representar un symbol # # #}: # #} #}: especificar el tipo de la entrada del tipo de entrada, aquí especifica el tipo de tipo #} para representar un symbol # # #}: # #}: Id #}: Id. Parámetro que recibe la entrada y el nombre del parámetro es ID. Si el parámetro de entrada es un tipo simple, el nombre del parámetro en #{} puede ser arbitrario, y puede ser valor u otros nombres resultantes: especifique el tipo de objeto Java asignado del resultado de salida del SQL, y seleccione Especifique a ResultType para representar el objeto Java asignado a una sola grabación. -> <select id = "finduserById" parametertype = "int" denttype = "cn.itcast.mybatis.po.user"> select * del usuario del usuario donde id =#{value} </select> <!-Fuzzy Información del usuario de la consulta basada en el nombre de usuario, múltiples resultados de resultados se puede devolver: el especificado es el tipo de objeto java $ {} Aplicar la cadena SQL y empalmar los parámetros recibidos en SQL sin ninguna modificación. Use $ {} para empalmar SQL, haciendo que SQL inyecte $ {valor}: para recibir el contenido de los parámetros de entrada. Si el tipo entrante es un tipo simple, solo puede usar valor en $ {}-> <select id = "finduserByName" parametertype = "java.lang.string" resultType = "cn.itcast.mybatis.po.user"> Seleccionar * del usuario donde username como '%$ {valor}%' </select> <!-Agregue un parámetro de inyección de inyecte que tope el parámeter de inyecte que tope el tiempo de inyección de Userify. IS POJO (incluida la información del usuario) especifica el nombre del atributo del POJO en #{}, reciba el valor de atributo del objeto POJO, myBatis obtiene el valor de atributo del objeto a través de ognl-> <insertar id = "insersuser" parameterType = "cn.itcast.mybatis.po.User"> <!-Devuelve la clave primaria de los datos insertados y el retorno de la información del usuario a las últimas. Obtenga el valor de clave principal registrado acaba de insertar en él, que solo es aplicable a la clave de autoincremento KeyProperty: Establezca el valor de clave principal de la consulta a la propiedad del objeto especificado por parametTerType: seleccione last_insert_id () ejecutor orden, relativo a la declaración de inserción, su orden de ejecución resultante: especifique el tipo de resultado de SELECT_INSERT_IDSERT_ID ()-> <Select Key Key Key Key "ID" ID "ID" ID "ID" ID "ID" After "After" After "After", "After", "After". resultType = "java.lang.integer"> Seleccione last_inser_id () </sectekey> Insertar en user (nombre de usuario, cumpleaños, sexo, dirección) valor (#{username},#{birthday},#{sex},#{dirección}) <!- Use la función de mySQL UUID () para generar el proceso de ejecución clave principal. Primero, obtenga la clave principal a través de UUID, establezca la clave principal en el atributo de identificación del objeto de usuario y luego, en segundo lugar, cuando se ejecute insertar, elimine el valor de atributo de identificación del objeto de usuario-> <selectKey keyProperty = "id" orden = "antes" dentType = "java.lang.string"> select uuid () </secteLe> inserto en el usuario (username, sexo, sexo, dirección de sexo, dirección) dirección)) dirección))) valor (#{nombre de usuario},#{cumpleaños},#{sex},#{dirección}); </insert> <!-- To delete a user to delete a user based on the id, you need to enter the id value--> <delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> <!-- To update user analysis based on the id: The id of the user needs to be passed in The user needs to be updated with the parameterType specifies the user Objeto, incluida la ID y la información de actualización. Note: the id must exist #{id}: Get the id attribute value from the input user object --> <update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper> </span>Paso 5: Escriba el método específico de la siguiente manera:
<span style = "Font-Family: Comic Sans MS; Font-Size: 18px;"> paquete cn.itcast.mybatis.first; import java.io.ioException; import java.io.inputstream; import java.util.date; import java.util.list; importar org.apache.ibatis.io.resources; importar org.apache.ibatis.session.sqlsessionFactory; importar org.apache.ibatis.session.sqlsessionFactoryBuilder; importar org.junit.test; import cn.itcast.mybatis.po.user; Clase pública myBatisfisFirst {// Consulta información del usuario basada en ID y obtiene un resultado de registro @test public void finduserByIdTest () lanza IOException {// myBatis Archivo de configuración String Resource = "SqlmapConfig.xml"; // Obtener el archivo de configuración flujo inputStream inputStream = Resources.getResourceasStream (recurso); // Cree una fábrica de sesión y pase en la información del archivo de configuración de MyBatis SQLSessionFactory SQLSessionFactory = new SQLSessionFactoryBuilder () .Build (InputStream); // Obtener sqlsession a través de la fábrica sqlsession sqlsession = sqlsessionFactory.opensession (); // Operar la base de datos a través de sqlsession // El primer parámetro: la identificación de la declaración en el archivo de mapa es igual a = espacio de nombres+ "."+ ID de la declaración // El segundo parámetro: especificar el parámetro del tipo de parámetro de tipo coincidente en el archivo de maps // sqlsession.selectone el resultado el resultado es un objeto del resultado de la actualidad en el mapa de mapa // selectone query a selectone query a encontrar el usuario de un registro para encontrar un usuario de registro = encontrar el usuario de registro = encontrar el usuario de los que se encuentre un usuario de registro de registro. sqlsession.selectone ("test.finduserbyid", 1); System.out.println (usuario); // libera el recurso sqlsession.close (); } // consulta difusa La lista de usuarios basada en el nombre de usuario @test public void finduserBynametest () lanza ioexception {// myBatis Archivo de configuración String Resource = "SqlmapConfig.xml"; // Obtener el archivo de configuración InputStream InputStream = Resources.getResourceasStream (recurso); // Cree una fábrica de sesión y pase en la información del archivo de configuración de MyBatis SQLSessionFactory SQLSessionFactory = new SQLSessionFactoryBuilder (). Build (InputStream); // Obtener sqlsession a través de la fábrica sqlsession sqlsession = sqlsessionFactory.opensession (); // El usuario en la lista en la lista es el mismo que el tipo especificado por el themtype alemán en la lista de archivos de mapeo <serer> list = sqlsession.selectlist ("test.finduserByName", "xiao ming"); System.out.println (lista); sqlsession.close (); } public void InsertUsert () lanza IOException {// myBatis Archivo de configuración String Resource = "SqlMapConfig"; // Obtener el archivo de configuración flujo inputStream inputStream = Resources.getResourceasStream (recurso); // Cree una fábrica de sesión y pase en la información del archivo de configuración de MyBatis SQLSessionFactory SQLSessionFactory = new SQLSessionFactoryBuilder (). Build (InputStream); // Obtener sqlsession a través de la fábrica sqlsession sqlsession = sqlsessionFactory.opensession (); // Insertar el usuario del objeto de usuario user = new User (); user.setUsername ("ding guohua"); user.setBirthday (nueva fecha ()); user.setSex ("1"); user.setaddress ("Anhui hefei"); // El usuario en la lista y el tipo especificado por el resultado resultante en el archivo de mapeo siempre son sqlsession.insert ("test.insertuser", usuario); // Enviar cosas sqlsession.commit (); // Cerrar la sesión SQLSession.Close (); } // Eliminar información de usuario basada en ID @Test public void DeleteUsertest () lanza IOException {// MyBatis Configuración Archivo String String Resource = "SqlmapConfig.xml"; // Obtener el archivo de configuración flujo inputStream inputStream = Resources.getResourceasStream (recurso); // Cree una fábrica y pase en la información del archivo de configuración de MyBatis SQLSessionFactory SQLSessionFactory = new SQLSessionFactoryBuilder (). Build (InputStream); // Obtener sqlsession a través de la fábrica sqlsession sqlsession = sqlsessionFactory.opensession (); // aprobando ID entrante Eliminar usuario sqlsession.delete ("test.deleteUser", 39); // Enviar cosas sqlsession.commit (); // Cerrar la sesión SQLSession.Close (); } // Actualizar información del usuario @Test public void updateUsertest () lanza IOException {// myBatis Archivation File String Resource = "sqlmapConfig.xml"; // Obtener el archivo de configuración flujo inputStream inputStream = Resources.getResourceasStream (recurso); // Cree una fábrica de sesión y pase en la información del archivo de configuración de MyBatis SQLSessionFactory SQLSessionFactory = new SQLSessionFactoryBuilder () .Build (InputStream); // Obtener sqlsession a través de la fábrica sqlsession sqlsession = sqlsessionFactory.opensession (); // Actualizar usuario user = new User (); // actualizar ID user.setID (41); user.setUsername ("ding guohua"); user.setBirthday (nueva fecha ()); user.setSex ("2"); user.setaddress ("Anhui hefei"); sqlsession.update ("test.updateuser", usuario); // Conjunto de transacción sqlsession.commit (); // Cerrar sesión sqlsession.close (); }} </span>Pros y contras de mybatis
ventaja:
a. Fácil de comenzar y dominar.
b. SQL está escrito en XML, que facilita la gestión unificada y la optimización.
do. Decouple SQL y código de programa.
d. Proporcione etiquetas de mapeo para admitir la asignación de relaciones de campo ORM entre objetos y bases de datos
mi. Proporcione etiquetas de mapeo de relación de objetos para apoyar la construcción y mantenimiento de la relación de objetos
F. Proporcione etiquetas XML y admite la escritura de SQL dinámico.
defecto:
a. La carga de trabajo SQL es muy alta, especialmente cuando hay muchos campos y muchas tablas relacionadas.
b. SQL depende de la base de datos, lo que resulta en una pobre portabilidad de la base de datos.
do. Dado que el ID de etiqueta en el XML debe ser único, los métodos en DAO no admiten la sobrecarga de métodos.
d. La capa DAO es demasiado simple, y la carga de trabajo del ensamblaje de objetos es relativamente grande.
mi. El uso incorrecto de caché puede generar fácilmente datos sucios.
Comparación entre mybatis e hibernate
Similitudes: Hibernate y MyBatis pueden generar SessionFactory a partir del archivo de configuración XML a través de SessionFactoryBuilder, y luego generar Session desde SessionFactroy. Finalmente, la sesión comienza a ejecutar cosas y declaraciones SQL. Los ciclos de vida de SessionFactoryBuilder, SessionFactory y Session son casi los mismos.
Diferencias:
mybatis: pequeño, conveniente, eficiente, simple, directo, semiautomático;
Hibernate: potente, conveniente, eficiente, complejo, circunstancial, totalmente automático;
mybatis:
a. Fácil de comenzar, aprender y úselo lo antes posible. Proporciona función de enlace de objetos automático para consultas de bases de datos, y continúa una gran cantidad de experiencia en uso de SQL. Es perfecto para proyectos que no tienen requisitos de modelo de objetos tan altos.
b. Se puede realizar una optimización SQL más detallada y se pueden reducir los campos de consulta.
do. La desventaja es que el marco sigue siendo relativamente simple y las funciones aún faltan. Aunque el código de enlace de datos se simplifica, toda la consulta de la base de datos subyacente en realidad debe escribirse por sí misma, la carga de trabajo es relativamente grande y no es fácil adaptarse a la modificación rápida de la base de datos.
d. El mecanismo de almacenamiento de almacenamiento secundario es pobre.
hibernar:
a. Funciones fuertes, buena irrelevancia de la base de datos y fuertes capacidades de mapeo O/R. Si tiene bastante competencia en hibernar y encapsula adecuadamente el hibernado, entonces todo el código de la capa de persistencia de su proyecto será bastante simple, el código que debe escribir es muy alto, la velocidad de desarrollo es muy rápida y es muy genial.
b. Hay un mejor mecanismo de almacenamiento en caché secundario y se puede usar almacenamiento en caché de terceros.
do. La desventaja es que el umbral de aprendizaje no es bajo, y debe ser competente en él. Cómo diseñar el mapeo O/R, cómo equilibrar el modelo de rendimiento y objetos, y cómo usar bien Hibernate bien requiere su experiencia y capacidad para ser fuerte.
Déjame darte una metáfora vívida:
MyBatis: Las herramientas mecánicas son fáciles de usar y se pueden usar lo antes posible, pero el trabajo aún debe hacerse usted mismo, pero las herramientas están vivas, por lo que cómo hacerlas depende de mí.
Hibernate: robot inteligente, pero es muy costoso desarrollarlo (aprendizaje, competencia) y el trabajo puede deshacerse de él, pero solo lo que puede hacer.
Mensaje del editor: en esta publicación de blog, el editor introdujo principalmente brevemente el conocimiento básico de mybatis, incluida una simple demostración de agregar, eliminar, modificar y buscar, las ventajas y desventajas de mybatis, y la comparación entre hibernado y mybatis. Las similitudes y diferencias entre ellos. MyBatis simplemente significa un marco de la capa de persistencia. MyBatis permite que el programa se concentre en SQL, y genere de forma libre y flexible las declaraciones SQL que satisfagan las necesidades a través del método de mapeo proporcionado por MyBatis. MyBatis puede ingresar automáticamente los parámetros de entrada a PrepareStatement y asignar flexible el resultado de la consulta establecido en objetos Java.
Lo anterior es el tutorial introductorio para la descripción general del principio de MyBatis presentada por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!