MySQL查询结果映射到map_mybatis结果集映射

结果集映射指的是,将数据库表的字段映射到Java实体的属性上。mybatis支持多种结果集映射方式:

1、resultType

2、resultType+起别名

3、resultMap

4、@ResultMap注解

5、mapUnderscoreToCamelCase

1 resultType

resultType适用于数据库表字段和java实体类属性是一 一对应的,如:

user表CREATE TABLE `user` (

`id` int(11) NOT NULL,

`name` varchar(255) NOT NULL,

`age` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

User类public class User {

private int id;

private String name;

private int age;

//...setters and getters

}

此时我们可以在xml文件中这样配置元素

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

mybatis在查询数据库记录后,会首先尝试调用User类的属性方法进行设置值。以user表的name字段为例:

1、首先查看resultType元素指向的User类中有没有对应的setName方法,如果有,调用setName方法设置值

2、如果没有setName方法,则会尝试通过反射技术,查看User类中有没有一个字段叫做name,如果有,通过反射技术给其赋值(说明set方法不是必须的)

3、如果既没有setName方法,也没有name字段,则mybatis放弃这个字段的映射,也不会抛出异常

2、resultType+起别名

当数据库表字段与实体属性就是不一致的,如user表中,表示的用户名的字段叫name,而在User类中,只有username字段和对应的setUsername方法。那么只给元素设置resultType属性,就无法给User类的username字段赋值。此时可以通过起别名的方式:

select id,name as username,age from user where id= #{id}

上面使用as,给name列起了一个别名为username,通过这种方式,就可以将user表的username字段映射到User类的name字段上。

注意,这种方式依赖于元素中useColumnLabel属性为true,其作用是:使用列标签代替列名。这个配置项默认为true,如果改为false,则通过别名的方式无法映射,读者可以自行尝试。

3、resultMap

如果数据库表多个字段与实体类中的字段或属性名称都不相同,那么通过起别名的方式,就显得太麻烦了,因为我们在一个映射文件中可能需要写多个元素,每个里面都要其别名,极容易出错。

此时我们可以在mappers配置文件中配置一个元素,如下

mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">;

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

在上面的代码中,我们配置了一个元素,然后在元素中,通过resultMap属性指向元素的id字段的值。

注意这里经常会有人忘记将resultType改成resultMap,如:

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

如果这样写了,mybatis会抛出异常,因为resultType的属性值应该是java类全路径或者别名(alias).

关于resultMap元素的解释:

id属性用于表示这个唯一标识(说明我们可以在一个映射文件中配置多个元素),type属性表示这个元素配置的是哪一个Java类的映射关系。

上面的中,内部还配置了子元素和子元素,分别表示:数据库表主键与Java类属性的映射关系、数据库表其他字段与Java类属性的映射关系。这两个元素都包含以下属性:column:数据库表字段名称

property:java类的属性名称

javaType:java类属性的类型

jdbcType :数据库字段对应的Jdbc type类型

对于javaType属性和jdbcType属性暂时可以不配置,mybatis会自动进行检测,在后面的章节,笔者会列出所有jdbcType和javaType的对应关系。

特别的,在我们这个案例中,只有数据库表name字段和User类的username属性没有对应上,而id和age都是完全对应的。事实上,我们可以在元素中只配置usename和name的映射关系。不过一般情况下,都会进行完整的配置,否则看起来会有点怪异。

回到主题,我们只是想配置一下数据库表字段和java类属性的映射关系,通过元素 配置,好像变得太复杂了。配置映射关系只是元素的基本功能,其内部还可以配置、子元素,用于建立数据表的关联关系(一对一,一对多,多对多),这才是的核心威力,关于关联关系映射,我们将在下一节讲解。

4、@ResultMap注解

在mybatis快速入门中,我们提到了mybatis的映射关系除了xml映射文件,还可以通过注解来配置。而@ResultMap无非就是注解版的元素。这里暂时不做介绍,后面有一节专门介绍mybatis的所有的注解是如何使用的。

5、终极大杀器:mapUnderscoreToCamelCase

mapUnderscoreToCamelCase的意思是,将下划线(underscore)"_"规则的命名风格转换为驼峰(camel)命名风格。

在使用mysql时,如果表字段由多个单词组成,我们通常使用下划线"_"来分割多个单词,例如记录一个用户的注册时间(register time),通常会命名为register_time,

而在java代码中,我们通常使用驼峰命名规则,因此会名为registerTime。

对于这种典型的转换,mybatis提供了mapUnderscoreToCamelCase配置项,这是一个开关选项,取值true|false,默认为false。当我们设置为true时,mybatis就会自动帮我们进行转换。

配置方式如下:

在mybatis全局配置文件mybatis-config.xml中,新增以下配置

此时,对于这样的sql

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

我们可以通过resultType直接指定实体类,不需要通过resultMap元素进行繁琐的配置。

你可能感兴趣的:(MySQL查询结果映射到map)