Home Mybatis学习 Mybati返回集详解

Mybati返回集详解

0 75

MyBatis查询结果resultType返回值类型详细介绍

一、返回一般数据类型
比如要根据 id 属性获得数据库中的某个字段值。

mapper 接口:

// 根据 id 获得数据库中的 username 字段的值
String getEmpNameById(Integer id);

SQL 映射文件:

<!–
指定 resultType 返回值类型时 String 类型的,
string 在这里是一个别名,代表的是 java.lang.String

对于引用数据类型,都是将大写字母转小写,比如 HashMap 对应的别名是 ‘hashmap’
基本数据类型考虑到重复的问题,会在其前面加上 ‘_’,比如 byte 对应的别名是 ‘_byte’
–>
<select id=”getEmpNameById” resultType=”string”>
select username from t_employee where id = #{id}
</select>

二、返回 JavaBean 类型
比如根据某个字段获得数据库中的信息,把查询的结果信息封装成某个 JavaBean 类型的数据。

mapper 接口:

// 根据 id 查询信息,并把信息封装成 Employee 对象
Employee getEmpById(Integer id);
1
2
SQL 映射文件:

<!–
通过 resultType 指定查询的结果是 Employee 类型的数据
只需要指定 resultType 的类型,MyBatis 会自动将查询的结果映射成 JavaBean 中的属性
–>
<select id=”getEmpById” resultType=”employee”>
select * from t_employee where id = #{id}
</select>

三、返回List类型
有时候我们要查询的数据不止一条,比如:模糊查询,全表查询等,这时候返回的数据可能不止是一条数据,对于多数据的处理可以存放在List集合中。

mapper 接口:

// 假如是全表查询数据,将查询的数据封装成 Employee 类型的集合
List<Employee> getAllEmps();

SQL 映射文件:

<!–
注意这里的 resultType 返回值类型是集合内存储数据的类型,不是 ‘list’
–>
<select id=”getAllEmps” resultType=”employee”>
select * from t_employee
</select>

四、返回Map类型
MyBatis 还支持将查询的数据封装成Map。

1. 如果查询的结果是一条,我们可以把查询的数据以{表字段名, 对应的值}方式存入到Map中。

mapper 接口:

// 根据 id 查询信息,并把结果信息封装成 Map
Map<String, Object> getEmpAsMapById(Integer id);
1
2
SQL 映射文件:

<!–
注意这里的 resultType 返回值类型是 ‘map’
–>
<select id=”getEmpAsMapById” resultType=”map”>
select * from t_employee where id = #{id}
</select>

下面把查询的结果数据贴出来供大家参考:

2. 如果查询的结果是多条数据,我们也可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map。

mapper 接口:

// 查询所有员工的信息,把数据库中的 ‘id’ 字段作为 key,对应的 value 封装成 Employee 对象
// @MapKey 中的值表示用数据库中的哪个字段名作 key
@MapKey(“id”)
Map<Integer, Employee> getAllEmpsAsMap();

SQL 映射文件:

<!–
注意 resultType 返回值类型,不再是 ‘map’,而是 Map 的 value 对应的 JavaBean 类型
–>
<select id=”getAllEmpsAsMap” resultType=”employee”>
select * from t_employee
</select>

下面是查询的结果 (只截取了一部分):

 

MyBatis 允许查询的结果封装成Map,这种机制是极好的。

五、扩展
扩展. 上面返回结果的形式都是基于查询 (select) 的,其实对于增删改的操作也可以返回一定类型的数据,比如Boolean,Integer等。

 

MyBatis查询结果resultMap返回值类型详细介绍

转载https://blog.csdn.net/qq_42780864/article/details/81429114?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161698633816780265429807%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161698633816780265429807&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~hot_rank-1-81429114.nonecase&utm_term=ResultMap用法

resultMap
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

 

先在Mapper文件中,配置基本的sql语句

<!– 查询所有的订单数据 –>
<!– resultMap:填入配置的resultMap标签的id值 –>
<select id=”queryOrderAll” resultMap=”orderResultMap”>
SELECT id, user_id,
number,
createtime, note FROM `order`
</select>

配置resultMap标签,映射不同的字段和属性名

<!– resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo –>
<!– id:设置ResultMap的id –>
<resultMap type=”order” id=”orderResultMap”>
<!– 定义主键 ,非常重要。如果是多个字段,则定义多个id –>
<!– property:主键在pojo中的属性名 –>
<!– column:主键在数据库中的列名 –>
<id property=”id” column=”id” />

<!– 定义普通属性 –>
<result property=”userId” column=”user_id” />
<result property=”number” column=”number” />
<result property=”createtime” column=”createtime” />

结果就可以封装到pojo类型中

使用resultMap进行关联查询
一对一查询
一对一数据模型:订单用户
一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。

 

改造pojo类
在订单类中添加User属性,User属性是一个引用类型,用于存储关联查询的用户信息,因为关联关系是一对一,所以只需要添加单个属性即可

 

配置Mapper.xml配置文件
OrderMapper.xml
先使用id和result属性,映射order类的结果集,然后在使用association映射关联对象User的结果集

<resultMap type=”order” id=”orderUserResultMap”>
<id property=”id” column=”id” />
<result property=”userId” column=”user_id” />
<result property=”number” column=”number” />
<result property=”createtime” column=”createtime” />
<result property=”note” column=”note” />

<!– association :配置一对一属性 –>
<!– property:order里面的User属性名 –>
<!– javaType:属性类型 –>
<association property=”user” javaType=”user”>
<!– id:声明主键,表示user_id是关联查询对象的唯一标识–>
<id property=”id” column=”user_id” />
<result property=”username” column=”username” />
<result property=”address” column=”address” />
</association>

</resultMap>

<!– 一对一关联,查询订单,订单内部包含用户属性 –>
<select id=”queryOrderUserResultMap” resultMap=”orderUserResultMap”>
SELECT
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.address
FROM
`order` o
LEFT JOIN `user` u ON o.user_id = u.id
</select>

测试
@Test
public void testQueryOrderUserResultMap() {
// mybatis和spring整合,整合之后,交给spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 创建Mapper接口的动态代理对象,整合之后,交给spring管理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 使用userMapper执行根据条件查询用户,结果封装到Order类中
List<Order> list = userMapper.queryOrderUserResultMap();
for (Order o : list) {
System.out.println(o);
}
// mybatis和spring整合,整合之后,交给spring管理
sqlSession.close();
}

一对多查询
查询所有用户信息及相关订单。

修改pojo类,在pojo类添加订单集合属性

 

修改UserMapper.xml配置文件
先使用id和result配置映射User类的结果,然后使用一对多关系的collection标签配置Order结果

<resultMap type=”user” id=”userOrderResultMap”>
<id property=”id” column=”id” />
<result property=”username” column=”username” />
<result property=”birthday” column=”birthday” />
<result property=”sex” column=”sex” />
<result property=”address” column=”address” />

<!– 配置一对多的关系
property:填写pojo类中集合类类属性的名称
javaType:填写集合类型的名称
–>
<collection property=”orders” javaType=”list” ofType=”order”>
<!– 配置主键,是关联Order的唯一标识 –>
<id property=”id” column=”oid” />
<result property=”number” column=”number” />
<result property=”createtime” column=”createtime” />
<result property=”note” column=”note” />
</collection>
</resultMap>

<!– 一对多关联,查询订单同时查询该用户下的订单 –>
<select id=”queryUserOrder” resultMap=”userOrderResultMap”>
SELECT
u.id,
u.username,
u.birthday,
u.sex,
u.address,
o.id oid,
o.number,
o.createtime,
o.note
FROM
`user` u
LEFT JOIN `order` o ON u.id = o.user_id
</select>

————————————————
版权声明:本文为CSDN博主「正在努力的陈序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42780864/article/details/81429114

 

总结

基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现

resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是,resultType就比较鸡肋了,必须字段名一样,比如说 cId和c_id 这种的都不能映射 。

 

发表评论

发表评论