mybatis返回单一对象或对象列表
一、说明
- 返回数据类型由dao中的接口和map.xml文件共同决定。另外,不论是返回单一对象还是对象列表,***map.xml中的配置都是一样的,都是resultMap=”***Map”或resultType=“* .* .*”类型.
- 每一次mybatis从数据库中select数据之后,都会检查数据条数和dao中定义的返回值是否匹配。
- 若返回一条数据,dao中定义的返回值是一个对象或对象的List列表,则可以正常匹配,将查询的数据按照dao中定义的返回值存放。
- 若返回多条数据,dao中定义的返回值是一个对象,则无法将多条数据映射为一个对象,此时mybatis报错。
二、代码测试
UserMap.xml映射文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
< resultMap id = "BaseResultMap" type = "com.ks.ssm.domain.User" >
< id column = "id" property = "id" jdbcType = "BIGINT" />
< result column = "username" property = "username" jdbcType = "VARCHAR" />
< result column = "password" property = "password" jdbcType = "VARCHAR" />
< result column = "email" property = "email" jdbcType = "VARCHAR" />
< result column = "qq" property = "qq" jdbcType = "VARCHAR" />
< result column = "phone" property = "phone" jdbcType = "VARCHAR" />
< result column = "gender" property = "gender" jdbcType = "BIT" />
< result column = "birthday" property = "birthday" jdbcType = "DATE" />
< result column = "city" property = "city" jdbcType = "VARCHAR" />
< result column = "mood" property = "mood" jdbcType = "VARCHAR" />
< result column = "single" property = "single" jdbcType = "BIT" />
< result column = "enrolltime" property = "enrolltime" jdbcType = "TIMESTAMP" />
< result column = "level" property = "level" jdbcType = "TINYINT" />
< result column = "status" property = "status" jdbcType = "BIT" />
< result column = "titlepic" property = "titlepic" jdbcType = "VARCHAR" />
< result column = "job" property = "job" jdbcType = "VARCHAR" />
< result column = "logintime" property = "logintime" jdbcType = "TIMESTAMP" />
< result column = "loginip" property = "loginip" jdbcType = "VARCHAR" />
< result column = "token" property = "token" jdbcType = "VARCHAR" />
< result column = "modifytime" property = "modifytime" jdbcType = "TIMESTAMP" />
</ resultMap >
< sql id = "Base_Column_List" >
id, username, password, email, qq, phone, gender, birthday, city, mood, single, enrolltime,
level, status, titlepic, job, logintime, loginip, token, modifytime
</ sql >
< select id = "selectByPrimaryKey" resultMap = "BaseResultMap" parameterType = "java.lang.Long" >
select
< include refid = "Base_Column_List" />
from user_info
where id = #{id,jdbcType=BIGINT}
</ select >
<!-- add by ks -->
< select id = "selectByUserName" resultMap = "BaseResultMap" parameterType = "java.lang.String" >
select
< include refid = "Base_Column_List" />
from user_info
where username = #{username,jdbcType=VARCHAR}
</ select >
<!-- mybatis 非常的智能,返回值统一使用 resultMap="BaseResultMap",mybatis会根据查询到的条目数量自动进行判断,如果是一条就返回对象,如果是多条就返回List对象列表-->
< select id = "selectByEmail" resultMap = "BaseResultMap" parameterType = "java.lang.String" >
select
< include refid = "Base_Column_List" />
from user_info
where email = #{email,jdbcType=VARCHAR}
</ select >
<!-- end by ks -->
|
dao文件UserMap.java
1
2
3
4
5
6
7
8
9
10
11
|
public interface UserMapper {
User selectByPrimaryKey(Long id);
User selectByUserName(String username );
/**关于mybatis返回单一对象或对象列表的问题:
* 1.返回数据类型由dao中的接口和*map.xml文件共同决定。另外,不论是返回单一对象还是对象列表,*map.xml中的配置都是一样的,都是resultMap="*Map"*或resultType=“* .* .*”类型.
* 2.每一次mybatis从数据库中select数据之后,都会检查数据条数和dao中定义的返回值是否匹配。
* 3.若返回一条数据,dao中定义的返回值是一个对象或对象的List列表,则可以正常匹配,将查询的数据按照dao中定义的返回值存放。
* 4.若返回多条数据,dao中定义的返回值是一个对象,则无法将多条数据映射为一个对象,此时mybatis报错。
* */
List<User> selectByEmail(String email );
}
|
测试代码和结果文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@RunWith (SpringJUnit4ClassRunner. class ) //表示继承了SpringJUnit4ClassRunner类
@ContextConfiguration (locations = { "classpath:spring-mybatis.xml" })
public class TestMyBatis {
private static Logger logger = Logger.getLogger(TestMyBatis. class );
@Resource
private UserMapper userDao;
@Test
public void testMybatis() {
User user = userDao.selectByUserName( "ks" );
logger.info( "user........................." );
logger.info(JSON.toJSONString(user));
List<User> users=userDao.selectByEmail( "ks" );
logger.info( "list........................." );
for (User userTemp : users)
{
logger.info(JSON.toJSONString(userTemp));
}
}
}
|
mybatis 返回的对象包含集合
DeviceQuestionInstruction.java
1
2
3
4
5
6
7
8
9
|
import com.hikari.cloud.data.entity.TbInstruction;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class DeviceQuestionInstruction { //tb_instruction 使用说明表
private String dvqsTitle;
private List<TbInstruction> instructionList;
}
|
TbInstruction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import lombok.Data;
import java.util.Date;
@Data
public class TbInstruction { //tb_instruction 使用说明表
private Long id;
private Long userId;
private String title;
private String detail;
private String url;
private Integer type;
private Integer suffix;
private String deviceCategory;
private String deviceTypeName;
private String deviceTypeNum;
private Integer views;
private Long dvqsId;
private Integer dvqsLevel;
private Date gmtCreate;
}
|
TbDeviceQuestionMapper.java
1
2
3
4
5
6
|
import com.hikari.cloud.data.bean.DeviceQuestionInstruction;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface TbDeviceQuestionMapper {
List<DeviceQuestionInstruction> findByNo( @Param ( "deviceTypeNo" ) String deviceTypeNo);
}
|
TbDeviceQuestionMapper.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<? xml version = "1.0" encoding = "UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
< mapper namespace = "com.hikari.cloud.data.mapper.TbDeviceQuestionMapper" >
< resultMap id = "dataMap" type = "com.hikari.cloud.data.bean.DeviceQuestionInstruction" >
< result column = "dvqs_title" property = "dvqsTitle" />
< collection property = "instructionList" resultMap = "insResultMap" />
</ resultMap >
< resultMap id = "insResultMap" type = "com.hikari.cloud.data.entity.TbInstruction" >
< result column = "id" property = "id" />
< result column = "user_id" property = "userId" />
< result column = "title" property = "title" />
< result column = "detail" property = "detail" />
< result column = "url" property = "url" />
< result column = "type" property = "type" />
< result column = "suffix" property = "suffix" />
< result column = "device_category" property = "deviceCategory" />
< result column = "device_type_name" property = "deviceTypeName" />
< result column = "device_type_num" property = "deviceTypeNum" />
< result column = "views" property = "views" />
< result column = "dvqs_id" property = "dvqsId" />
< result column = "dvqs_level" property = "dvqsLevel" />
< result column = "gmt_create" property = "gmtCreate" />
</ resultMap >
< select id = "findByNo" resultType = "com.hikari.cloud.data.bean.DeviceQuestionInstruction" resultMap = "dataMap" >
SELECT tb_device_question.title AS dvqs_title,tb_instruction.* FROM tb_device_question
LEFT JOIN tb_instruction
ON tb_device_question.id=tb_instruction.dvqs_id
WHERE tb_device_question.device_type_no='HSAT-K5'
ORDER BY tb_instruction.dvqs_level ASC
</ select >
</ mapper >
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/kangsenkangsen/article/details/51236279