1. Asociación individual
1.1. Proponer requisitos
Información de clase de consulta basada en ID de clase (información con el maestro)
1.2. Crear tablas y datos
Crea una mesa de maestros y una mesa de clase. Aquí suponemos que un maestro solo es responsable de enseñar una clase, por lo que la relación entre el maestro y la clase es una relación uno a uno.
Crear maestro de tabla (t_id int primaria key auto_incement, t_name varchar ()); Crear clase de tabla (C_ID int primaria Key Auto_Increment, C_Name varchar (), maestro_id int); Alteran la clase de tabla Agregar restricción FK_TEACHER_ID Clave exterior (maestro_id) Referencias Profesor (T_ID); Insertar en valores del maestro (t_name) ('maestro'); Insertar en valores del maestro (t_name) ('maestro'); Insertar en los valores de clase (c_name, maestro_id) ('class_a',); Insertar en los valores de clase (c_name, maestro_id) ('class_b', 2); La relación entre las tablas es la siguiente:
1.3. Definir clases de entidad
1. Clase de maestro, clase de maestro es la clase de entidad correspondiente a la tabla de maestros.
paquete me.gacl.domain; /*** @author gacl* Defina la clase de entidad correspondiente a la tabla del maestro*/maestro de clase pública {// Defina los atributos de la clase de entidad, correspondientes a los campos en la tabla de maestros privadas int id; // id ===> T_id Nombre de cadena privada; // name ===> t_name public int getId () {return id; } public void setid (int id) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } @Override public string toString () {return "maestro [id =" + id + ", name =" + name + "]"; }}2. Classes Class, Classes Class es la clase de entidad correspondiente a la tabla de clases
paquete me.gacl.domain; /*** @author gaCl* Defina la clase de entidad correspondiente a la tabla de clases*/clases de clase pública {// Defina los atributos de la clase de entidad, correspondientes a los campos en la tabla de clases private int id; // id ===> C_ID Nombre de cadena privada; // nombre ===> c_name /** * Hay un campo de maestro_id en la tabla de clases, por lo que un atributo de maestro se define en la clase de clases, * se usa para mantener la relación individual entre el maestro y la clase. A través de este atributo de maestro, puede saber qué maestro es responsable de esta clase*/ maestro privado; public int getId () {return id; } public void setid (int id) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } profesor público getTeacher () {profesor de retorno; } public void setecter (maestro maestro) {this.teacher = maestro; } @Override public String toString () {return "classes [id =" + id + ", name =" + name + ", maestro =" + maestro + "]"; }} 1.4. Defina el archivo de asignación SQL classMapper.xml
<? xml versión = "." encoding = "utf-"?> <! Doctype mapper public "-// mybatis.org//dtd mapper .//en" "http://mybatis.org/dtd/mybatis-mapper.dtd"> <!-Especifique un espacio de nombres único para este mapperado. El valor del espacio de nombres se establece convencionalmente en el nombre del paquete + Nombre del archivo de mapeo SQL, de modo que el valor del espacio de nombres pueda garantizarse que sea único. Por ejemplo, Namespace = "me.gacl.mapping.classmapper" es me.gacl.mapping (nombre del paquete) + classMapper (classMapper.xml de eliminación de archivos sufijo)-> <mapper namespace = "me.gacl.mapping.classmapper"> <!-Información de clase de consulta basada en ID de clase de clase (con la información del maestro) ##. Consulta de la tabla conjunta Seleccionar * De la Clase C, maestro T donde C.Teacher_id = T.T_ID y C.C_ID =; ##. Ejecutar dos consultas Seleccionar * de la clase donde c_id =; // maestro_id = seleccionar * de maestro donde t_id =; // use el maestro_id obtenido arriba-> <!-Método 1: Resultados anidados: use el resultado de resultados anidados para procesar el subconjunto de resultados conjuntos duplicados para encapsular los datos de la tabla conjunta (eliminar datos duplicados) Seleccione * de la clase C, maestro t donde parametertype = "int" resultmap = "classResultMap"> select * de la clase C, maestro t donde c.teacher_id = t.t_id y c.c_id =#{id} </select> <!-use resultados de resultados para asignar una correspondencia individual entre las clases de entidad y los campos de entidad-> <resultado type = "me.gacl.domain.classes" Id "id" propiedad = "id" columna = "c_id"/> <resultado propiedad = "name" column = "c_name"/> <asociación propiedad = "maestro" javatype = "me.gacl.domain.teacher"> <id "id" id "columna =" t_id "/> <resultado propiedad =" nombre "columna =" t_name "/> </socaliation> </sultMap> <!- Métode: NEUTO DEL METOTO: NEMACIÓN DEL SUPECTO DELESTADO LA PARA COMPLECTA DEL COMPLEJO: OBTENER EL TIEMPO DE COMPLECTO DELESTADO EL METULO: OBTENER EN Ejecución de otra instrucción de mapeo SQL Seleccionar * de la clase donde c_id =; Seleccione * del maestro donde t_id = // es el valor de maestro_id obtenido de la consulta anterior-> <select id = "getClass" parametertype = "int" resultmap = "classResultMap"> select * de la clase donde c_id =#{id} </select> <!-Use resultado de resultados para asignar una correspondencia única entre la clase y el campo de la entidad-> <resultadomapmapmap type = "me.gacl.domain.classes" id = "classResultMap"> <id propiedad = "id" columna = "c_id"/> <resultado de la propiedad = "name" column = "c_name"/> <asociación propiedad = "maestro" columna = "maestro_id" select = "getTeacher"/> </resultmap> <select id = "getTeacher" parametertypexypexipo = "int" en "int" resultType = "me.gacl.domain.teacher"> seleccione T_id ID, T_Name Nombre del maestro donde t_id =#{id} </elect> </ mapper> Registre classmapper.xml en el archivo conf.xml
<Mappers> <!- Registre el archivo ClassMapper.xml. ClassMapper.xml se encuentra en el paquete me.gacl.mapping, por lo que el recurso está escrito como me/gacl/mapping/classMapper.xml-> <mapper resource = "me/gacl/mapping/classmapper.xml"/> </mappers>
1.5. Escribir código de prueba unitario
paquete me.gacl.test; importame.gacl.domain.classes; importame.gacl.util.mybatisutil; importar org.apache.ibatis.session.sqlsession; importar org.junit.test; Prueba de clase pública {@test public void testgetClass () {sqlsession sqlsession = myBatisUtil.getSqlSession (); /** * Map SQL Identification String, * me.gacl.mapping.classmapper es el valor del atributo de espacio de nombres de la etiqueta mapper en el archivo classmapper.xml, * getClass es el valor de atributo de identificación de la etiqueta select. The SQL to be executed can be found through the id attribute value of the select tag */ String statement = "me.gacl.mapping.classMapper.getClass";//Mapping the sql's identification string//Execute the query operation and automatically encapsulate the query result into a Classes object and return Classes clazz = sqlSession.selectOne(statement,);//Query the record with id in the class Tabla // Después de ejecutar SQL usando SQLSession SQLSession.Close (); System.out.println (Clazz); // Imprime el resultado: classes [id =, name = class_a, maestro = maestro [id =, name = maestro]]} @test public void testgetClass () {sqlsession sqlsession = mybatisutil.getsqlSession (); /** * Map SQL Identification String, * me.gacl.mapping.classmapper es el valor del atributo de espacio de nombres de la etiqueta mapper en el archivo classmapper.xml, * getClass es el valor de atributo de identificación de la etiqueta select. El SQL que se ejecutará se puede encontrar a través del valor de atributo de ID de la etiqueta select */string Declaration = "me.gacl.mapping.classmapper.getclass"; // asignando la cadena de identificación de SQL // ejecutar operaciones de consulta y encapsular automáticamente los resultados de consultas en las clases de clases de retorno de objetos Clazz = sqlsession.selectone (declaración,); SQLSession Para ejecutar SQL, debe cerrar SQLSession SQLSession.Close (); System.out.println (Clazz); // Imprime resultado: classes [id =, name = class_a, maestro = maestro [id =, name = maestro]]}} 1.6. Resumen de la consulta de asociación individual de MyBatis
MyBatis utiliza la etiqueta de asociación para resolver consultas de asociación individuales. Las propiedades disponibles para la etiqueta de asociación son las siguientes:
• Propiedad: el nombre de la propiedad del objeto
• Javatype: el tipo de atributo de objeto
• Columna: el nombre del campo de la clave extranjera correspondiente
• Seleccione: use otra consulta para encapsular el resultado
2. Asociación de uno a muchos
2.1. Proponer requisitos
Consulte la información de clase correspondiente de acuerdo con Classid, incluidos estudiantes y maestros
2.2. Crear tablas y datos
En la demostración de consulta de correlación uno a uno anterior, hemos creado la tabla de clases y la tabla de maestros, así que aquí creamos otra mesa de alumnos
Create TABLE Student (S_ID int Prime Key Auto_incement, S_Name varchar (20), class_id int); insertar en valores de estudiante (s_name, class_id) ('student_a', 1); insertar en los valores (s_name, class_id) valores ('student_b', 1); insertar en student (s_name, class_id) valores ('student_c', 1); sert en student, stude, clush, clush, clase_s_name (stent); Valores ('student_d', 2); inserte en valores de estudiante (s_name, class_id) ('student_e', 2); inserte en valores de estudiante (s_name, class_id) ('student_f', 2); 2.3. Definir clases de entidad
1. Clase de estudiantes
paquete me.gacl.domain; /*** @author gacl* Defina la clase de entidad correspondiente a la tabla de estudiantes*/estudiante de clase pública {// Definir los atributos, correspondientes a los campos en la tabla de estudiantes privado int id; // id ===> S_ID Nombre de cadena privada; // name ===> S_Name public int getId () {return id; } public void setid (int id) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } @Override public string toString () {return "student [id =" + id + ", name =" + name + "]"; }} 2. Modifique la clase Classes, agregue un atributo de Estudiantes de la lista <estudiante> y use un atributo de recopilación de la lista <estudiante> para representar a los estudiantes propiedad de la clase, de la siguiente manera:
paquete me.gacl.domain; import java.util.list; /*** @author gaCl* Defina la clase de entidad correspondiente a la tabla de clases*/clases de clase pública {// Defina los atributos de la clase de entidad, correspondientes a los campos en la tabla de clases private int id; // id ===> C_ID Nombre de cadena privada; // nombre ===> c_name /** * Hay un campo de maestro_id en la tabla de clases, por lo que un atributo de maestro se define en la clase de clases, * se usa para mantener la relación individual entre el maestro y la clase. A través de este atributo de maestro, puede saber qué maestro es responsable de esta clase*/ maestro privado; // Utilice un atributo de colección de la lista <estudiante> para representar a los estudiantes propiedad de la lista privada de la clase <venta> Estudiantes; public int getId () {return id; } public void setid (int id) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } profesor público getTeacher () {profesor de retorno; } public void setecter (maestro maestro) {this.teacher = maestro; } public void setecter (maestro maestro) {this.teacher = maestro; } Lista pública <deudent> getStudents () {return Students; } public void setStudents (List <Student> Students) {this.students = Students; } @Override public String toString () {return "classes [id =" + id + ", name =" + name + ", maestro =" + maestro + ", estudiantes =" + estudiantes + "]"; }} 2.4. Modificar el archivo de asignación SQL classMapper.xml
Agregue la siguiente información de mapeo SQL
< resultMap = "classResultMap"> select * de la clase C, maestro t, alumno s donde c.teacher_id = t.t_id y c.c_id = s.class_id y c.c_id =#{id} </select> <resultmap type = "me.gacl.domain.classes" id = "classResultMap"> <Id propiedad = "id" columna "columna" c_id "/" COMPERTAMIENTO "/" COMPUERTA "/" COMPUERTA "/" COMPUERTA "/" RESULTADOS ". columna = "c_id"/> <resultado propiedad = "name" columna = "c_name"/> <asociación propiedad = "maestro" columna = "maestro_id" javatype = "me.gacl.gacl.tomain.teacher"> <id propiedad = "id" columna = "t_id"/> <resulte propiedad = "nombre" columna = "t_name"/> </! Propiedad = "Estudiantes" oftype = "me.gacl.domain.student"> <id propiedad = "id" columna = "s_id"/> <resultado de la propiedad = "name" column = "s_name"/> </collection> </resultmap> <!- Método 2: consultas nestas: devuelve el tipo complejo esperado mediante la ejecución de otra instrucción de mapeo SQL SELECT * de la colección donde c_id =; Seleccione * del maestro donde t_id = // es el valor de maestro_id obtenido por la consulta anterior seleccionar * del estudiante donde class_id = // es el valor del campo C_id obtenido por la primera consulta -> <select id = "getClass" parametertype = "int" resultmap = "classResultMap"> Select * de class Where C_id =#{Id} </select> <result "ResultMap type = "me.gacl.domain.classes" id = "classResultMap"> <id propiedad = "id" column = "c_id"/> <resultado propiedad = "name" column = "c_name"/> <asociación propiedad = "maestro" columna = "maestro_id" javatype = "me.gacl.domain.teacher" seleccione = "getTeacherer"> <</asociación> <sister_id "javatype =" me.gacl.domain.teacher "seleccione =" getTeacherer "> <</asociación> <sorector" oftype = "me.gacl.domain.student" column = "c_id" select = "getStudent"> </collection> </resultMap> <select id = "getTeacher" parametertype = "int" resultType. "me.gacl.domain.teacher"> select t_id id, t_name name del maestro donde t_id =##{id} <Id} id = "getStudent" parametertype = "int" resulttype = "me.gacl.domain.student"> seleccione s_id id, nombre s_name del estudiante donde class_id =#{id} </select> 2.5. Escribir código de prueba unitario
paquete me.gacl.test; importame.gacl.domain.classes; importame.gacl.util.mybatisutil; importar org.apache.ibatis.session.sqlsession; importar org.junit.test; Prueba de clase pública {@test public void testgetClass () {sqlsession sqlsession = myBatisUtil.getSqlSession (); /** * Map SQL Identification String, * me.gacl.mapping.classmapper es el valor del atributo de espacio de nombres de la etiqueta mapper en el archivo classmapper.xml, * getClass es el valor de atributo de identificación de la etiqueta select. El SQL que se ejecutará se puede encontrar a través del valor de atributo de ID de la etiqueta select */string Declaration = "me.gacl.mapping.classmapper.getclass"; // asignando la cadena de identificación de SQL // ejecutar la operación de consulta y encapsular automáticamente el resultado de la consulta en un objeto de clases y retorno classes Clazz = sqlsession.selectone (declaración,); // consulta el registro de la pregunta en un objeto de clases en el objeto de clases y retorno las clases Clazz = sqlsession.selectone (declaración,); // consulta el registro de las clases en el objeto de clases en el objeto de clases y retorno las clases Clazz = sqlsession.selectone (declaración,; Tabla // Después de ejecutar SQL usando SQLSession SQLSession.Close (); // Imprima el resultado: classes [id =, name = class_a, maestro = maestro [id =, name = maestro], students = [estudiante [id =, name = student_a], student [id =, name = student_b], student [id =, name = student_c]]] system.out.println (clazz); } @Test public void testgetClass () {sqlSession sqlsession = myBatisUtil.getSqlSession (); /** * Map SQL Identification String, * me.gacl.mapping.classmapper es el valor del atributo de espacio de nombres de la etiqueta mapper en el archivo classmapper.xml, * getClass es el valor de atributo de identificación de la etiqueta select. El SQL que se ejecutará se puede encontrar a través del valor de atributo de ID de la etiqueta select */string Declaration = "me.gacl.mapping.classmapper.getclass"; // asignando la cadena de identificación de SQL // ejecutar la operación de consulta y encapsular automáticamente el resultado de la consulta en un objeto de clases y retorno classes Clazz = sqlsession.selectone (declaración,); // consulta el registro de la pregunta en un objeto de clases en el objeto de clases y retorno las clases Clazz = sqlsession.selectone (declaración,); // consulta el registro de las clases en el objeto de clases en el objeto de clases y retorno las clases Clazz = sqlsession.selectone (declaración,; Tabla // Después de ejecutar SQL usando SQLSession SQLSession.Close (); // Imprima el resultado: classes [id =, name = class_a, maestro = maestro [id =, name = maestro], students = [estudiante [id =, name = student_a], student [id =, name = student_b], student [id =, name = student_c]]] system.out.println (clazz); }} 2.6. Resumen de la consulta de la Asociación de uno a muchos de MyBatis
MyBatis utiliza la etiqueta de colección para resolver consultas de asociación de uno a muchos, y el atributo de ttype especifica el tipo de objeto de elementos en la colección.
Acerca de MyBatis Learning Tutorial (V): te presentaré mucho sobre la implementación de la consulta de la tabla de asociación, ¡espero que te sea útil!