Marco Mybatis -----> (5) Comprender profundamente los resultados de la salida del paquete Mybatis y consultas difusas como

Uno, comprensión profunda de los resultados de la salida del paquete Mybatis

1 、 resultType

  • Se refiere al tipo de conversión de ResultSet obtenida al ejecutar la instrucción SQL. El tipo de conversión utilizado aquí puede ser:
    (1) Nombre completo: com.hcz.entity.Student
    (2) Alias ​​de tipo: por ejemplo, java.lang.Integer alias es int
    (3) Alias ​​personalizado: definido en el archivo de configuración principal de mybatis, use <typeAlias> Defina un alias, luego puede usar un alias personalizado en resultType

Dos formas de definir alias son las siguientes:

  • La primera forma:

  • tipo: el nombre completo del tipo personalizado

  • alias: alias (breve, fácil de recordar)

<typeAlias type="com.hcz.entity.Student" alias="stu"/>
<typeAlias type="com.hcz.vo.ViewStudent" alias="vstu"/>
  • La segunda forma:
  • <paquete> nombre es el nombre del paquete, para todas las clases en este paquete, [nombre de clase] es el alias
<package name="com.hcz.entity"/>
<package name="com.hcz.vo"/>

Nota: Si la devolución es una colección, también debe ser del tipo contenido en la colección, no la lista de la colección en sí. Como se muestra abajo:

Inserte la descripción de la imagen aquí

Principio de implementación:
1. Mybatis ejecuta la instrucción SQL y luego mybatis llama al método de construcción sin parámetros de la clase para crear el objeto.
2. Mybatis llama al método set para asignar el valor de columna especificado del ResultSet al atributo con el mismo nombre.

Archivo de mapeo:
<select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student">
       select id,name, email,age from student
</select>
Aproximadamente equivalente al siguiente código jdbc:
ResultSet rs = executeQuery(" select id,name  from student" )
while(rs.next()){
    
    
    Student  student = new Student();
	student.setId(rs.getInt("id"));
	student.setName(rs.getString("name"));
	studentList.add(student);
}
Aquí, los datos de la columna después de la ejecución de sql se convierten al objeto Java StudentInserte la descripción de la imagen aquí
(1) Tipo simple
  • Definir un método en la interfaz.
int countStudent();
  • Archivo de mapeo
<!--返回int类型数值-->
<select id="countStudent" resultType="int">
    select count(*) from student
</select>
  • Definir el método de prueba
@Test
public void testRetunInt(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    int count = dao.countStudent();
    System.out.println("学生总人数:"+ count);
}
(2) Tipo de objeto
  • Definir un método en la interfaz.
List<Student> selectMulitParam(@Param("myname") String name,
                                @Param("myage") Integer age);
  • Archivo de mapeo
<select id="selectMulitParam" resultType="Student">
    select * from student where name=#{myname} or age=#{myage}
</select>
  • Definir el método de prueba
@Test
public void testSelectMulitParam(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    List<Student> studentList = dao.selectMulitParam("李四", 28);
    for (Student student: studentList){
    
    
        System.out.println("学生="+student);
    }
}
(3) Tipo de mapa
  • El valor de retorno es mapa, donde el nombre de la columna (id, nombre, edad) es el valor clave del mapa y el valor de la columna (1002, Zhang San, 34 es el valor del mapa)
  • Solo puede devolver una fila de registros, no varias filas
  • Definir un método en la interfaz.
Map<Object,Object> selectReturnMap(int id);
  • Archivo de mapeo
<select id="selectReturnMap" resultType="java.util.HashMap">
    select * from student where id=#{sid}
</select>
  • Definir el método de prueba
public void testReturnMap(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    Map<Object,Object> retMap = dao.selectReturnMap(1002);
    System.out.println("查询结果是 Map:"+retMap);
}

2 、 mapa de resultados

  • ResultMap es el mapa de resultados, que especifica la correspondencia entre el nombre de la columna y el atributo del objeto Java. Es más flexible asignar el valor de la columna al atributo especificado. A menudo se utiliza cuando el nombre de la columna y el nombre del atributo del objeto Java son inconsistentes

Uso:
(1) Primero defina resultMap y especifique la correspondencia entre los nombres de columna y los atributos
(2) En <Seleccione> Reemplazar resultType con resultMap

  • Definir un método en la interfaz.
List<Student> selectUseResultMap(QueryParam param);
  • Archivo de mapeo
	<resultMap id="studentMap" type="Student">
        <!-- 主键字段使用 id -->
        <id column="id" property="id" />
        <!--非主键字段使用 result-->
        <result column="name" property="name"/>
        <result column="email" property="email" />
        <result column="age" property="age" />
    </resultMap>
        <!--resultMap: resultMap 标签中的 id 属性值-->
    <select id="selectUseResultMap" resultMap="studentMap">
        select * from student where name=#{paramName} or
        age=#{paramAge}
    </select>

Resolución:
(1) id: valor es un nombre único personalizado, utilizado en <select>
(2) tipo: el nombre completo o alias del objeto Java que desea convertir a
(3) columna: nombre de columna en la base de datos
(4) propiedad: el nombre de propiedad del objeto Java
(5) resultMap: el valor de id de <resultMap>

  • Definir el método de prueba
@Test
public void testSelectUseResultMap(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    QueryParam param = new QueryParam();
    param.setParamName("李四");
    param.setParamAge(28);
    List<Student> stuList = dao.selectUseResultMap(param);
    stuList.forEach( stu -> System.out.println(stu));
}

3. Dos métodos de procesamiento para nombres de atributos de clases de entidades y nombres de columnas son diferentes

(1) Utilice <resultMap>
  • Definir un método en la interfaz.
List<MyStudent> selectMyStudent();
  • Archivo de mapeo
<resultMap id="myStudentMap" type="MyStudent">
    <id column="id" property="stuid" />
    <result column="name" property="stuname"/>
    <result column="email" property="stuemail" />
    <result column="age" property="stuage" />
</resultMap>

<select id="selectMyStudent" resultMap="myStudentMap">
    select * from student
</select>
  • Definir el método de prueba
@Test
public void testSelectMyStudent(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    List<MyStudent> stuList = dao.selectMyStudent();
    stuList.forEach( stu -> System.out.println("MyStudent="+stu));
}
(2) Use el alias de columna y <resultType>

El principio predeterminado de reultType es : el valor de columna del mismo nombre se asigna al atributo del mismo nombre, y el alias de columna (el nombre de atributo del objeto Java) se usa aquí.

  • Definir un método en la interfaz.
List<MyStudent> selectDiffColProperty();
  • Archivo de mapeo
<select id="selectDiffColProperty" resultType="MyStudent">
    select id as stuid,name as stuname,email as stuemail,age as stuage
    from student
</select>
  • Definir el método de prueba
@Test
public void testSelectDiffColProperty(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    List<MyStudent> stuList = dao.selectDiffColProperty();
    stuList.forEach( stu -> System.out.println("MyStudent="+stu));
}

Nota : resultType y resultMap no se pueden usar juntos, solo se puede seleccionar uno de los dos

Dos, consulta difusa como

(1) Agregue "% xxx%" a los datos de la consulta en el código Java (más conveniente)

  • Definir un método en la interfaz.
List<Student> selectLikeOne(String name);
  • Archivo de mapeo
<select id="selectLikeOne" resultType="Student">
    select id,name,email,age from student where name like #{name }
</select>
  • Definir el método de prueba
@Test
public void testSelectLikeOne(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    //准备好like的内容
    String name="%李%";
    List<Student> stuList = dao.selectLikeOne(name);
    stuList.forEach( stu -> System.out.println("OnelikeStudent="+stu));
}

(2) Agregue "%" # {xxx} "%" a la posición condicional de la declaración SQL en el archivo de asignación

  • Definir un método en la interfaz.
List<Student> selectLikeTow(String name);
  • Archivo de mapeo
<select id="selectLikeTow" resultType="Student">
    select id,name,email,age from student where name like "%" #{name} "%"
</select>
  • Definir el método de prueba
@Test
public void testSelectLikeTow(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    String name="李";
    List<Student> stuList = dao.selectLikeTow(name);
    stuList.forEach( stu -> System.out.println("TowlikeStudent="+stu));
}

Tres, esquema de pensamiento

Inserte la descripción de la imagen aquí

¡Por favor corríjame si hay alguna deficiencia!

Supongo que te gusta

Origin blog.csdn.net/hcz666/article/details/113098063
Recomendado
Clasificación