Java Mybatis 映射属性,高级映射详解
概述
在 Java Mybatis 中, 映射属性是指将 Java 对象映射到数据库表的字段上。Mybatis 提供了多种映射方式,这篇攻略主要介绍 Mybatis 映射属性的基本用法和高级映射。
基本映射
在 Mybatis 的 mapper 文件中,我们可以使用 resultMap 标签来对返回对象进行映射,以 user 表为例:
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="user_password"/>
</resultMap>
以上代码定义了一个名为 userResultMap 的 resultMap,将 user_id 映射到对应的 id 属性上,将 user_name 映射到对应的 username 属性上,将 user_passowrd 映射到对应的 password 属性上。
然后在 select 语句中使用 resultMap 对结果进行映射:
<select id="selectUserById" resultMap="userResultMap">
select * from user where id = #{id}
</select>
在上述代码中,我们指定了 resultMap 的名称为 userResultMap,并将其作为 select 语句的映射属性。
高级映射
自动映射
自动映射是 Mybatis 提供的一种较为简单的映射方式,可以自动将列名和属性名匹配起来。
...
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
...
我们需要在 Mybatis 的配置文件中启用自动映射功能,并将其设置为开头字母小写+其余单词首字母大写的驼峰写法。例如,将 user_name 映射到 username 属性上。
关联映射
有些时候,我们需要对关联表进行映射。例如,我们需要查询用户和其订单的信息,此时我们需要将 user 表和 order 表进行关联。
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="user_password"/>
<association property="order" javaType="com.example.Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</association>
</resultMap>
在以上代码中,我们为 user 表创建了一个 resultMap,其中的 association 标签用于关联 order 表。通过 property 属性将 order 映射到 Java 类的属性上,通过 javaType 属性指定 order 表映射到哪种类型的 Java 对象上,通过 column 属性指定 order 表中的列名和 Java 对象中的属性名进行映射。
示例
示例1
假设我们有一个 user 表和一个 order 表,它们的结构如下:
create table user (
id int not null primary key auto_increment,
user_name varchar(50),
user_password varchar(50)
);
create table order (
id int not null primary key auto_increment,
user_id int not null,
order_no varchar(50),
create_time datetime,
update_time datetime,
foreign key (user_id)
references user(id)
);
我们需要查询一个用户的订单信息,可以使用如下的 mapper 文件:
<resultMap id="orderResultMap" type="com.example.Order">
<id property="id" column="id"/>
<result property="userId" column="user_id"/>
<result property="orderNo" column="order_no"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="id" />
<result property="username" column="user_name"/>
<result property="password" column="user_password"/>
<association property="order" javaType="com.example.Order">
<id property="id" column="id"/>
<result property="orderNo" column="order_no"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</association>
</resultMap>
<select id="selectUserWithOrdersById" resultMap="userResultMap">
select u.id as user_id, u.user_name, u.user_password, o.id as order_id, o.order_no, o.create_time, o.update_time
from user u
left join order o
on u.id = o.user_id
where u.id = #{id}
</select>
以上 mapper 文件含有两个 resultMap,并使用了 association 标签来进行关联映射。我们可以用如下的 Java 代码来进行测试:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserWithOrdersById(1);
List<Order> orders = user.getOrders();
在以上代码中,我们首先调用了 selectUserWithOrdersById 方法查询用户和其关联的订单信息,并将查询结果映射到 User 对象上。随后,我们从 user 对象中取出关联的订单列表。
示例2
假设我们有一个 user 表和一个 role 表,一个用户可以拥有多个角色,它们的结构如下:
create table user (
id int not null primary key auto_increment,
user_name varchar(50),
user_password varchar(50)
);
create table role (
id int not null primary key auto_increment,
role_name varchar(50)
);
create table user_role (
id int not null primary key auto_increment,
user_id int not null,
role_id int not null,
foreign key (user_id)
references user(id),
foreign key (role_id)
references role(id)
);
我们需要查询一个用户的角色信息,可以使用如下的 mapper 文件:
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="id"/>
<result property="username" column="user_name"/>
<result property="password" column="user_password"/>
<collection property="roles" ofType="com.example.Role">
<id property="id" column="role_id"/>
<result property="roleName" column="role_name"/>
</collection>
</resultMap>
<select id="selectUserWithRolesById" resultMap="userResultMap">
select u.id, u.user_name, u.user_password, r.id as role_id, r.role_name
from user u
left join user_role ur
on u.id = ur.user_id
left join role r
on ur.role_id = r.id
where u.id = #{id}
</select>
在以上 mapper 文件中,我们使用了 collection 标签来表示 user 表和 role 表之间的关联关系。我们可以用如下的 Java 代码来进行测试:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserWithRolesById(1);
List<Role> roles = user.getRoles();
在以上代码中,我们调用了 selectUserWithRolesById 方法查询用户和其关联的角色信息,并将查询结果映射到 User 对象上。随后,我们从 user 对象中取出关联的角色列表。
总结
在 Mybatis 中,映射属性是将 Java 对象映射到数据库表的字段上的重要方式。本篇攻略介绍了 Mybatis 映射属性的基本用法和高级映射,并提供了两个常见的示例用于演示。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javaMybatis映射属性,高级映射详解 - Python技术站