RestultMap resuelve el problema de que la consulta es nula debido a la inconsistencia del nombre del atributo de clase y el nombre del campo de la tabla

RestultMap

La consulta es un problema nulo

El problema a resolver: el nombre del atributo y el nombre del campo son inconsistentes

Entorno: cree un nuevo proyecto y copie el proyecto anterior

1. Ver el nombre de campo de la base de datos anterior

imagen

2. Diseño de clases de entidades en Java

public class User {
    
    

   private int id;  //id
   private String name;   //姓名
   private String password;   //密码和数据库不一样!
   
   //构造
   //set/get
   //toString()
}

3. Interfaz

//根据id查询用户
User selectUserById(int id);

4. Archivo de mapeo del asignador

<select id="selectUserById" resultType="user">
  select * from user where id = #{id}
</select>

5. Prueba

@Test
public void testSelectUserById() {
    
    
   SqlSession session = MybatisUtils.getSession();  //获取SqlSession连接
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = mapper.selectUserById(1);
   System.out.println(user);
   session.close();
}

resultado:

User{
    
    id=1, name='狂神', password='null'}

La consulta muestra que la contraseña está vacía ¡Significa que hay un problema!

análisis:

select * from user where id = #{id} 可以看做

select  id,name,pwd  from user where id = #{id}

mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) ,
 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPwd() ,
  所以password返回null ; 【自动映射】

solución

Solución 1: especifique un alias para el nombre de la columna, el alias es el mismo que el nombre del atributo de la clase de entidad java.

<select id="selectUserById" resultType="User">
  select id , name , pwd as password from user where id = #{id}
</select>

Opción 2: usar el mapeo del conjunto de resultados -> ResultMap [recomendado]

<resultMap id="UserMap" type="User">
   <!-- id为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

<select id="selectUserById" resultMap="UserMap">
  select id , name , pwd from user where id = #{id}
</select>

ResultMap

Mapeo automático

El elemento resultMap es el elemento más importante y poderoso de MyBatis. Puede liberarlo del 90% del código de extracción de datos de JDBC ResultSets.

De hecho, al escribir código de mapeo para algunas sentencias complejas como connection, un resultMap puede reemplazar miles de líneas de código que logran la misma función.

La idea de diseño de ResultMap es que para declaraciones simples, no hay necesidad de configurar un mapeo de resultados explícito, y para declaraciones más complejas, solo se necesita describir su relación.

Ha visto ejemplos de declaraciones de mapeo simples, pero no especificó resultMap explícitamente. tal como:

<select id="selectUserById" resultType="map">
select id , name , pwd
  from user
  where id = #{id}
</select>

La declaración anterior simplemente asigna todas las columnas a las claves del HashMap, que se especifica mediante el atributo resultType. Aunque es suficiente en la mayoría de los casos, HashMap no es un buen modelo. Es más probable que su programa utilice JavaBean o POJO (Plain Old Java Objects) como modelo.

Lo mejor de ResultMap es que, aunque ya lo conoces bastante bien, no es necesario que los uses explícitamente.

Mapeo manual

1. El tipo de valor devuelto es resultMap

<select id="selectUserById" resultMap="UserMap">
  select id , name , pwd from user where id = #{id}
</select>

2. ¡Escriba resultMap para realizar el mapeo manual!

<resultMap id="UserMap" type="User">
   <!-- id为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

Supongo que te gusta

Origin blog.csdn.net/david2000999/article/details/115164433
Recomendado
Clasificación