7.属性名与查询字段名不相同

resultType 可以将查询结果直接映射为实体 Bean 对象的条件是,SQL 查询的字段名与实 体 Bean 的属性名一致。

因为在将查询结果转换为指定类型对象时,系统自动将查询结果字 段名称作为对象的属性名,通过反射机制完成对象的创建。

当 SQL 查询结果的字段名和实体 Bean 的属性名不一致时,将无法创建出需要类型的对 象。此时有两种解决方案

  1.查询字段使用别名

虽然属性名称与表中字段名称不一致,但可以为查询结果的字段名称赋予别名,让别名与实体 Bean 的属性名相同。

这样框架也可以根据查询结果利用反射机制将对象创建。 在映射文件 mapper 中添加如下映射。

注意,由于表的 score 字段名与 Student 类的属性名同名,所以这里无需使用别名

  

1 <select id="selectAllStudent" resultType="com.mybatis.model.Student"> <!-- 因为这里没有设置别名,所以需要加上包全名 -->
2         <!-- 属性名称和 表中字段不一致 如:表中是sage,属性名称是age,这样的话,是无法反射调用set方法,完成对象的构造的 -->
3         <!-- 可以通过为查询出的数据库中的字段起别名的方式,使其和对象保持一致 -->
4         select sage age ,sname name ,score from student
5 </select>

  2.使用结果映射resultMap

  可以使用结果映射resultMap(这里的Map映射mapper的意思)来建立映射关系

  完成由字段到属性的映射,达到将查询结果封装为对象的目的

  resultMap 是对 resultType的增强

 1 <!-- 使用结果映射的方式  resultMap  完成字段到属性的映射,达到将查询结果封装为对象的目的-->
 2     <!-- 可以将resultMap理解为 resultType的增强 -->
 3     <resultMap type="com.mybatis.model.Student" id="studentMapper">
 4         <id column="sid" property="id"/>
 5         <result column="sname" property="name"/>
 6         <result column="sage" property="age"/>
 7     </resultMap>
 8
 9     <!-- 这里需要指定结果类型,不然查询出来了,都不知道构成什么对象 -->
10     <select id="selectAllStudent" resultMap="studentMapper">
11         select sage,sname,score from student
12     </select>

<resultMap/>标签中定义了由 type 指定的类的属性名到表中字段名称的映射关系。根据 这个映射关系,框架利用反射机制创建相应对象。

   type:指定要映射的实体类

   id:指定该 resultMap 映射关系的名称

  <id>标签:id 的字段名 column 与实体类的属性 property 间的映射关系

  <result>标签:id 以外其它字段名 column 与实体类的属性 property 间的映射关系

当然,对于字段名与实体类的属性名相同的情况,可以不写入<resultMap/>中。

时间: 2024-10-25 22:13:24

7.属性名与查询字段名不相同的相关文章

Mybatis——实体类属性名和数据库字段名不同时的解决办法

在使用Mybatis来持久化数据库时,有时候会碰到数据库中表中的字段与java实体类中属性名不一致的情况,在这种情况下Mybatis是不能完成字段的自动映射的.而通常情况下,数据库及实体类是不应该被改的的.所以要在不改变数据库以及实体类的情况下解决这个问题,下面是解决该问题的三种方式: java实体类: public class User { private Long id; private String userName; private String passWord; /** * ...

Oracle 查询库中所有表名、字段名、表名说明、字段名说明(原创)

查询所有表名:select t.table_name from user_tables t;查询所有字段名:select t.column_name from user_col_comments t;查询指定表的所有字段名:select t.column_name from user_col_comments t where t.table_name = 'BIZ_DICT_XB';查询指定表的所有字段名和字段说明:select t.column_name, t.column_name from

[Database] 列出MSSQL所有数据库名、所有表名、所有字段名

1.获取所有数据库名 Select Name From Master..SysDatabases order By Name 2.获取所有表名 Select Name From SysObjects Where XType='U' order By Name XType='U':表示所有用户表; XType='S':表示所有系统表; 3.获取所有字段名 Select Name From SysColumns Where id=Object_Id('TableName')

java——mysql——获取所有table名和table字段名。

获取database所有table名: (参考:http://stackoverflow.com/questions/2780284/how-to-get-all-table-names-from-a-database ) DatabaseMetaData md = conn.getMetaData(); ResultSet rs = md.getTables(null, null, "%", null); while (rs.next()) { System.out.println(

查找表名与所有字段名

表名: mysql: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='schemaName' and TABLE_NAME = 'tablename'; oracle: select TABLE_NAME from tabs where TABLE_NAME = 'tableName' 字段名: mysql: select * from information_schema.columns where ta

mysql存储过程的参数名不要跟字段名一样 (血淋淋的代价)

如题,将会导致的结果就是参数的值将不会是你传入的值,而是变成每条记录的那个字段的值. 这样的后果,是灰常严重的.比如执行删除操作,它能把整个表的记录全删了. 这个是我的血淋淋的代价啊. 死坑如下,勿跳: [sql] view plaincopy DELIMITER $$ USE `b10k`$$ DROP PROCEDURE IF EXISTS `sp_delete_species`$$ CREATE DEFINER=`luth`@`%` PROCEDURE `sp_delete_species

KO ------- 表中字段名和实体类属性名不一致

-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就会为空 (一)问题复现 1.先创建数据库 mybatis_db, 再创建表 t_user,并插入若干数据 注意:user_id 为主键,且为自动增长 2.创建实体类 User.java: package com.siwuxie095.entity; // 实体类 public class User

通过表名和字段名查询字段类型

今天遇到了一个问题,就是要通过表名和字段名获取该字段的字段类型.网上找了好多方法,都不成功(本人的数据库方面的知识比较匮乏).后来,终于找到一个正确的语句,特此记录. select data_type from user_tab_columns where table_name ='表名' and column_name ='字段名'

查询MySQL数据表的字段名和表结构

查询表的字段: -- 查询表的字段名 SELECT COLUMN_NAME -- GROUP_CONCAT('a.', COLUMN_NAME) AS COLUMN_NAME -- 加表别名并用逗号连接 FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = 'hera' -- 数据库名 AND TABLE_NAME = 'tbn_car' -- 表名 ; 查询表结构: -- 查询表结构 SELECT TABLE_NAME AS '表名', C