Introducción a mybatis
MyBatis fue predecesorado por Ibatis, que es un marco de Mapeo Relacional (ORM) basado en datos basado en Java.
MyBatis es una encapsulación de JDBC, que permite a los desarrolladores centrarse solo en SQL en sí mismo sin gastar demasiado esfuerzo para procesar el código de procedimiento JDBC, como registrar controladores, configurar parámetros, crear conexión/declaración, analizar los conjuntos de resultados, etc. MyBatis configura la declaración basada en XML/annotation, ejecuta SQL y asigna los resultados de los resultados de Java, los objetos de los objetos de Java, los objetos de gran parte de los datos de Databut.
MyBatis es un marco de persistencia de primera clase con soporte para SQL personalizado, procedimientos almacenados y asignaciones avanzadas. MyBatis elimina casi todo el código JDBC y la configuración manual de parámetros y la recuperación de resultados. MyBatis puede usar XML o anotaciones simples para las primitivas de configuración y mapa, interfaces de mapa y Java Pojos (objetos Java antiguos) a los registros de la base de datos.
Dirección del proyecto MyBatis/Documentación en línea.
Primero conoce mybatis
Usar myBatis requiere agregar las siguientes dependencias en pom.xml:
<code> <spendency> <uproupid> org.mybatis </proupid> <artifactid> mybatis </arfactid> <versewers> 3.3.0 </versión> </pendency> <DEP Endency> <GroupID> mysql </proupid> <artifactid> mysql-confonnector-java </arfactid> <verSerse> 5.1.36 </versión> </pendency> </code>
Seleccionar
Configurar mybatis/mybatis-configuration.xml
Como archivo de configuración global de MyBatis, está configurado con la información del entorno en ejecución de MyBatis (como la fuente de datos/archivo mapper, etc.).
<code> <code> <!-{cke_protected} {c}%3c!%2d%2d%3fxml%20Version%3d%221.0%22%20Coding%3d%22Utf-8%22%20%3f%2d%2d%3e-> <Configuración> <incumplimiento de los entornos = "Desarrollo" <> <mirdano "<entorno" <entorno ". id = "desarrollo"> <!-{cke_protected} {c}%3c!%2d%2d%20%E9%85%8d%e7%bd%aejdbc%e4%ba%8b%e5%8a%a1%e7%ae%a1%e7%90%86%2d%2d%3E-<transferencia de transferencia type = "jdbc"> <!-{cke_protected} {c}%3C!%2d%2d%20%e9%85%8d%e7%bd%ae%e6%95%b0%e6%8d%ae%e6%ba%90%2d%2d%3E 3E-> <data-tyte = "agrupado" n. value = "com.mysql.jdbc.driver"> <propiedad name = "url" value = "jdbc: mysql: // host: puerto/db? caracterSencoding = utf-8"> <Property Name = "UserName"> <Property Name = "Password" value = "Password"> </Property> </Property> </Property> </DataSource> </transaccionManager> </entorno> </entornos> <!-{c ke_protected} {c}%3C!%2d%2d%20%e5%8a%a0%e8%bd%bdmapper%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6%20%2D%2D%3E-> <Mapeador Resource = "mybatis/mapper/userdao.xml"> </s mapper> </mappers> </figuration> </code>Escribir userdao (mapa mapper)
La parte más central de MyBatis está configurada con declaraciones SQL que operan la base de datos:
<code> <code> <code> <!-{cke_protected} {c}%3c!%2d%2d%3fxml%20Version%3d%221.0%22%20Coding%3d%22Utf-8%22%20%3f%2d%2d%3e-> <mapper namespace = "namespace" <<select id = "" Select Id = "" Select Id = "" SELECT = "" SELECHY "" SELECT = "SELECT =" SELECT = " parametertype = "java.lang.integer" resultType = "com.fq.domain.user"> Seleccionar * del usuario donde id = #{id}; </select> <select id = "selectUserByName" Parametertype = "java.lang.string" resultType = "com.fq.domain.user"> select * del usuario donde el nombre del usuario donde el nombre de usuario '%$ {value}%'; </select> </ mapper> </code> </code> Descripción del atributo
espacio de nombres de espacio, utilizado para aislar las declaraciones SQL
Parametertype define el tipo de mapeo de entrada SQL, y MyBatis obtiene parámetros del objeto de entrada a través de OGNL para pasar a las declaraciones SQL.
Resulttype define el tipo de asignación de salida SQL. MyBatis asigna una fila de registros de resultados de consulta SQL al tipo especificado por ResultType.
El nombre del archivo de mapeo mapper incluye userdao.xml/usermapper.xml/user.xml y otros formularios. Generalmente se almacenan en el directorio mapeador del mismo nivel que MyBatis-Configuration.xml. Dado que su función principal es definir la relación entre las declaraciones SQL y el mapeo, generalmente se llama colectivamente archivos de mapeo de mapper.
Definir clase PO
La función principal de la clase PO es la asignación SQL (entrada/salida), que generalmente corresponde a las tablas de la base de datos:
<code> <code> <code> <code> <code>/*** @author jifang*@since 15/12/31 2:27 PM.*/User de clase pública {Private Integer ID; private String Name; private String Password; public User () {} Public User (ID de entero, nombre de cadena, String Password) {return id;} public void setid (ID de entero) {this.id = id;} public String getName () {return name;} public void setName (name de cadena) {this.name = name;} public string getPassword () {return Password;} public void setPassword (string contraseña) {this.passpass = contraseña;}}@overidepsidepsideP público + "id =" + id + ", name = '" + name +'/'' + ", contraseña = '" + contraseña +'/'' + '}';}} </code> </code> </code> </code>Userdao (objeto Java)
Obtenga SQLSession, ejecute declaraciones SQL y obtenga el resultado de mapeo:
<código> <código> <código> <código> <código> <código> <code>/*** @author jifang*@since 16/2/24 6:15 pm.*/public class userDao {private sqlsessionFactory factory; @befeforepublic void setup () lanza ioexception {string recurso recurse SqlSessionFactoryBuilder (). Build (Resources.getResourceasStream (Resource));}@testPublic void selectUserById () {try (sqlsession session = factory.opensession ()) {user user = session.selectone ("nombrespace.selectUserByid", 1); system.out.println (user);};} selectUserByName () {try (sqlsession session = factory.opensession ()) {list <serer> users = session.selectList ("namespace.selectuserByName", "estudiante"); for (usuario de usuario: usuarios) {System.out.println (usuario);}}}} </serve> </code> </code> </code> </code> </code>Insertar
mapabón
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <insert id = "inserción" parametertype = "com.fq.domain.user"> Insertar en usuarios (name, contraseña) valores ( #{name}, #{contraseña}); </code> </code> </code> </code> </code>Usuarios
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void inserSUSer () {try (sqlsession session = factory.opensession ()) {usuario user = nuevo User (); user.setName ("new_name1"); user.setpassword ("new_password"); session.insert ("namespace.insertuser", user); session.commit ();}} </code> </code> </code> </code> </code> </code> Regreso por clave primaria de ingreso automático
Modifique el archivo mapper y agréguelo, y puede devolver la clave primaria de incremento automático de MySQL (es decir, la ID generada cuando los datos se acaban de insertar):
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <sert id = "insertuser" parametertype = "com.fq.domain.user"> <select KeyProperty = "Id" Order = "After" resultType = "java.lang.intager"> Selecter " Last_insert_id (); </etectkey> Inserte en valores de usuario (nombre, contraseña) ( #{name}, #{contraseña}); </sert> </code> </code> </code> </code> </code>Usuarios
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void inserSUSer () {prueba (sqlsession session = factory.opensession () {system.out.println (session); usuari "new_password"); session.insert ("namespace.insertuser", user); // necesita obtener la clave primaria de autoincremento session.commit (); system.out.println (user.getid ());}} </code> </code> </code> </code> </code> </code> </code>Esta función también se puede completar a través de las propiedades UseGeneratedKeys/KeyProperty, consulte la documentación de MyBatis para obtener más detalles.
Actualizar
mapabón
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code update id = "updateUserByid" parametertype = "com.fq.domain.user"> Update set name = #{name}, contraseña = #{contraseña} donde id = #{id}; </update> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Usuarios
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>@Testpublic void updateUserById() {try (SqlSession session = factory.openSession(true)) {session.update("namespace.updateUserById",new User(1, "Feiqing", "Icy5yqXZB1UWSWCVLSNLCA =="));}} </code> </code> </code> </code> </code> </code> </code> </code> </code>Borrar
mapabón
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <ElETED = "deleteuserbyid" parametertype = "java.lang.interger"> Eliminar del usuario donde id = #{id}; </elete> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Usuarios
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @TestPublic Void ElExererByid () {Try (sqlSession Session = Factory.opensession (true)))) {session.delete ("Namespace.DeleteUserById", 51615);}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>resumen
#{}/$ {}
#{}: Representa un marcador de posición, implementa establecer un valor en el marcador de posición preparado ( #{} representa un marcador de posición?), Y convierte automáticamente el tipo de Java en tipo JDBC (por lo que #{} puede evitar efectivamente la inyección de SQL). #{} puede recibir valores simples de atributos de tipo o PO. Si Parametertype transmite un solo valor de tipo simple, el #{} puede ser un valor u otros nombres en los aparatos #{} rizados. $ {} se puede usar para empalmar las cadenas SQL. El contenido de Parametertype se puede empalmar en SQL sin conversión de tipo JDBC. $ {} se puede usar para recibir valores de atributo de tipo o PO simples. Si Parametertype transmite un solo valor de tipo simple, el $ {} solo se puede usar para valorar los bosques $ {} rizados.
Aunque $ {} no puede prevenir la inyección de SQL, a veces $ {} es muy conveniente (como el orden mediante la clasificación, los nombres de columnas deben pasar a SQL a través de los parámetros, luego se usa el orden por $ {columna}, y #{} no se puede usar para implementar esta función (ver JDBC Discusión básica en la estación preparada para obtener detalles).
Sqlsession
Proporcione métodos para operar la base de datos (como: SelectOne/SelectList). Sin embargo, SQLSession es la inicio de hilo, por lo que es mejor definirlo como una variable local de usar.
Ventajas de MyBatis (en comparación con JDBC)
SQL está escrito en el código Java, lo que dificulta el mantenimiento. MyBatis escribe SQL en Mapper, y XML está separado del código Java. Es complicado pasar parámetros a las declaraciones SQL (como: SQL donde las condiciones son diferentes, los tipos de datos SQL son diferentes de Java). MyBatis mapea automáticamente los objetos Java a las declaraciones SQL a través de Parametertype. El análisis del conjunto de resultados es problemático (los cambios de SQL conducen a cambios en el código de análisis, los tipos de datos SQL son diferentes de Java). MyBatis mapea automáticamente los resultados de la ejecución de SQL en objetos Java a través de ResultType.
Anexo: es mejor agregar una implementación del sistema de registro (logback/log4j) a pom.xml, de modo que la información de registro se imprima al depurar el programa, lo que facilita la verificación de errores. Tome el registro como ejemplo:
pom.xml
<código> <código> <código> <código> <código> <código> <código> <código> <código> <código> <código> <código> <código> <código> <código> <códico> <códico> <código> <código> <códico> <código> <códico> <código> <código> <pendency> <grupo> ch.qos.logbbbB ACK </Groupid> logBack-Classic </arfactid> <versión> 1.1.2 </ververy> </pendency> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
logback.xml
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <configuration> <necturation name = "logroot" value = "/data/logs"> <nombre de propiedad = "patrón" "Patrón" "" Patrón "" "" Patrón "" "" Patrón "" "" Pattern "" " valor = " %d {hh: mm: ss.sss} [ %hilo] %-5Level %logger {0} - %msg %n"> <appender name = "stdout"> <coder> <mattern> $ {patrón} </mother> </coder> </pender> <Appender> name = "file"> <RollingPolicy> <FileNamePattern> $ {logroot} /Common-Server.%D {yyyyy-mm-dd} .log </filenamePattern> <maxhistory> nivel = "debug"> <appender-ref ref = "stdout"> <appender-ref ref = "file"> </appender-ref> </ppender-ref> </root> </sperty> </sperty> </figuration> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Para obtener otros detalles sobre los registros de MyBatis, consulte la sección de registro de documentos MyBatis.
Desarrollo DAO
Hay dos formas de desarrollar DAO usando MyBatis, desarrollo original de DAO y desarrollo de mapeo de mapeos DAO.
Desarrollo original de DAO DAO DAO requiere que los desarrolladores escriban interfaces DAO e implementaciones de DAO, como consultar la información del usuario basada en ID:
mapeador (igual que antes)
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "selectUserByid" Parametertype = "java.anganger" "" resultType = "com.fq.domain.user"> select * de user where id = #{id}; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> Interfaz userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code <code>/*** @author jifang*@since 16/2/22 10:20 AM. SelectUserById (ID de Integer) lanza excepción;} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
Implementación de usuarios
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <StiMe> <SQLI Factory; public userDaoMpl (SQLSessionFactory Factory) {this.Factory = factory;}@overRidePublic User SelectUserById (ID de Integer) lanza la excepción {sqlsession session = factory.opensession (); usuario user = session.selectone ("namespace.selectuserByid", id); session.close (); user;}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> Cliente
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code <code> <code> <code> <code> <code> <code> Code> mybatiscLeClECLECLE OriginalClient () lanza la excepción {userdao dao = new UserDaoImpl (new SQLSessionFactoryBuilder (). Build (ClassLoader.getSystemresourCeasstream ("mybatis/mybatis-condfiguration.xml")); user user = dao.selectuserById (1); system.out.println (user);}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Problemas en el desarrollo original de DAO:
1) Existen muchos códigos de procedimiento en el cuerpo del método de implementación DAO.
2) Llamar al método SQLSession (seleccionar/insertar/actualizar) requiere especificar la ID de la declaración, que está dura, que no es propicio para el mantenimiento del código.
Desarrollo de mapeo de mapeadores
El método de desarrollo de mapeo mapeador solo requiere escribir una interfaz DAO, y MyBatis crea dinámicamente una implementación de interfaz basada en la definición de interfaz y las declaraciones SQL en el archivo mapper.
mapabón
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <!-? Xml versión = "1.0" encoderando = "UTF-8"? namespace = "com.fq.mybatis.userdao"> <select id = "selectUserByid" Parametertype = "java.lang.integer" resultype = "com.fq.domain.user"> select * de user where id = #{id}; </select> </ mapper> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Nota: En este momento, el espacio de nombres debe ser el mismo que el nombre totalmente calificado de la interfaz UserDAO.
La interfaz userdao es la misma que antes, pero el cliente userdaoImpl ya no se usa.
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>/*** @author jifang* @since 16/2/22 2:57 pm.*/clase pública myBatisClient {private sqlSession Session; private sqlSessionFactory factory; @beForePublic Void setUp () {factory = new SqlSessionFactoryBuilder (). Build (classLoader.getSystemresourCeasstream ("mybatis/mybatis-configuration.xml"); session = factory.opensession ();}@testPublic void mappperClient () lanza la excepción {userdao dao = session.getMapper (userdao.class); user user = dao.selectuserByid (1); system.out.println (user);}@posterior a publicidad vacío () {session.close ();}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Los métodos de desarrollo de mapeo mapeador deben seguir las siguientes especificaciones:
El espacio de nombres en el archivo mapper es el mismo que el nombre totalmente calificado de la interfaz DAO; La ID de la declaración en el archivo mapper es el mismo que el nombre del método de la interfaz DAO; El Parametertype/resultType de la instrucción en el archivo mapper es el mismo que el parámetro/resultype del método DAO.
Mapeador
La función principal de los archivos de mapeo de mapeadores (como userdao.xml) es definir las declaraciones SQL (cada SQL es una declaración), que es el núcleo de MyBatis.
MyBatis recomienda oficialmente el uso del método de mapeo mapper para desarrollar DAO, por lo que no introduciremos demasiado sobre el desarrollo del DAO original en el futuro.
Mapeo de entrada
Múltiples parámetros formales
Se ha utilizado el ejemplo anterior de pasar tipos simples, por lo que no lo repetiré aquí. Cuando se deben pasar múltiples parámetros formales, el parámetro Parametertype ya no es necesario:
mapabón
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code <code> <code> <code> <code -<codeeNeDeN) #{1}, contraseña = #{2} donde id = #{0}; </update> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Usuarios
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> code> <code> <code> <code> updateUserById (ID de entero, nombre de cadena, contraseña de cadena) lanza excepción; </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> <Code> </code> </code> </code> </code> </code> </code> </code> </code>
PO entrante
MyBatis usa la expresión de OGNL para analizar los valores de los atributos del objeto:
mapabón
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "SelectUserByNamePassword" Parametertype = "com.fq.domain.user" resultType = "com.fq.domain.user"> Seleccionar *de userwhere name = #{name} y contraseña = #{contraseña}; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Usuarios
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> SelectUserByNamePassword (usuario de usuario) lanza Excepción; </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
mapabón
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <Co Co de> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "selectUserByMap" parametertype = "java.util.map" resultType = "com.fq.domain.user"> seleccionar *de userwhere name = #{name} y contraseña = #{contraseña}; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>#{} La clave correspondiente del mapa en las llaves rizadas.
Usuarios
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> selectUserByMap (map <string, object = ""> map) lanza Excepción; </string,> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
Mapeo de salida
Tipo simple de salida
mapabón
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <Co Co de> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "selectUsercount" parametertype = "java.lang.string" resultType = "java.lang.integer"> Seleccionar recuento (*) del usuario Nombre como Like '%$ {value}%'; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code > </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Usuarios
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> code> <code> <code> <code> <code Name) Excepción; </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
Devolver un tipo simple debe garantizar que el resultado de la consulta tenga solo una fila de registros, y el valor del primer campo finalmente se convierte al tipo de salida.
Output PO Object/List
Antes se han demostrado dos tipos de salida (SelectUserByID/SelectUserByName usó el método original de desarrollo DAO en ese momento, pero el formulario de definición mapeador era similar), por lo que solo haré un resumen simple aquí:
El resultado resultante definido en el mapeador al emitir un solo objeto PO es el mismo que el type de resultado definido en el mapeador; Se debe garantizar que el resultado de la consulta SQL sea una sola pieza de datos, y se llama internamente utilizando el método SelectOne; La lista de PO de salida indica que el resultado de la consulta puede ser múltiple, y se llama internamente utilizando el método SelectList, y el valor de retorno de la interfaz se puede alojar mediante lista/set.
Mapa de salida
El objeto PO de salida se puede usar en su lugar para usar la salida del mapa, con el nombre del campo como clave y el valor de campo como valor.
mapabón
<code> <select id = "selectUserLikename" resultType = "java.util.map"> Seleccionar *del usuario Nombre como '%$ {valor}%'; </select> </code>Usuarios
<code> <code> list <map <string, object = "" >> selectUserLikEname (nombre de cadena) lanza excepción; </map <string,> </code> </code>
mapa de resultados
Resulttype puede asignar el resultado de la consulta a PO, pero la premisa es que el nombre de la propiedad PO y el nombre del campo SQL deben ser el mismo. Si es inconsistente, el mapeo correspondiente se puede hacer a través de ResultMap:
mapabón
<código> <código> <código> <resultmap id = "usermap" type = "com.fq.domain.user"> <id columna = "user_id" propiedad = "id"> <resultado columna = "user_name" propiedad = "name"> <resultado columna = "user_password" Propiedad = "contraseña"> </sult> </did> </sul parametertype = "java.lang.string" resultMap = "usermap"> selectid user_id, nombre user_name, contraseña user_passwordfrom userwhere name = #{name}; </select> </code> </code> </code>La interfaz UserDao es la misma que antes.