当前位置:   article > 正文

MyBatis输出映射

MyBatis输出映射

1 resultType

resultType: 执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名。如果返回的是集合,设置的是集合元素的类型,而不是集合本身。resultType 和 resultMap,不能同时使用。

1.1 输出简单类型

案例:返回球队的总记录数

TeamMapper接口添加如下内容:

int getCount();

TeamMapper.xml配置文件中添加如下:

<!-- 只有返回的结果是单行的时候,返回值类型才可以指定为基本类型
    如果是单行多列,也取不到后面的列的值;
    如果返回多行会报异常:TooManyResultsException-->
<select id="getCount" resultType="java.lang.Integer">
    select count(teamId) from team
</select>

测试类添加方法:

 @Test
    public void test07(){
        int count = teamMapper.getCount();
        System.out.println("总共的行数:"+count);
    }

1.2 输出pojo类型

案例:参考之前的查询所有球队信息

List<Team> queryAll();
<!--接口方法返回是集合类型,但是映射文件中的resultType需要指定集合中的类型,不是集合本身。-->
<select id="queryAll" resultType="com.AE.pojo.Team">
    select * from team;
</select>

1.3 输出Map类型

当我们只需要查询表中几列数据的时候可以将sql的查询结果作为Map的key和value。一般使用的是Map<Object,Object>.

Map 作为接口返回值,sql 语句的查询结果最多只能有一条记录。大于一条记录会抛出TooManyResultsException异常。

如果有多行,使用List<Map<Object,Object>>.

案例:根据id查询球队名称和位置。

TeamMapper接口添加如下内容:

Map<Object,Object> queryTwoColumn(int teamId);
List<Map<Object,Object>> queryTwoColumnList();

TeamMapper.xml配置文件中添加如下:

<select id="queryTwoColumn"  resultType="java.util.HashMap">
    select teamName,location from team where teamId=#{id}
</select>
<select id="queryTwoColumnList"  resultType="java.util.HashMap">f
    select teamName,location from team
</select>

测试类添加方法:

@Test
    public void test08(){
        Map<String, Object> map = teamMapper.queryTwoColumn();
        System.out.println(map);
    }
    @Test
    public void test09(){
        List<Map<String, Object>> list = teamMapper.queryTwoColumnList();
        for (Map<String, Object> map : list) {
            System.out.println(map);
        }
​
    }

2 resultMap

resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。

常用在列名和 java 对象属性名不一样的情况。

使用方式:

1.先定义 resultMap,指定列名和属性的对应关系。

2.在<select>中把 resultType 替换为 resultMap。

TeamMapper.java接口中添加方法:

List<Team> queryAll2();

TeamMapper.xml映射文件添加:

<!--resultMap 和resultType不能同时出现
    resultMap:是引用的自己创建resultMap的id-->
    <select id="queryAll2" resultMap="baseResultMap">
        select * from team;
    </select>
    <!--创建resultMap:相当于自己编写表中的列与实体类中的属性的映射
        id:resultMap的名称,要求唯一
        type:期待要映射为java的类型
    -->
    <resultMap id="baseResultMap" type="com.AE.pojo.Team">
        <!--一般主键列用id,其余列用result
            column:表示数据库表中的列名,不区分大小写
            property:表示实体类中的对应的属性名,区分大小写
            javaType:实体类中的对应的属性的类型,可以省略,mybatis会自己推断
            jdbcType="数据库中的类型column的类型" 一般省略
        -->
        <id column="teamId" property="teamId" javaType="java.lang.Integer" ></id>
        <result column="teamName" property="teamName" javaType="java.lang.String"></result>
        <result column="location" property="location" javaType="java.lang.String"></result>
        <result column="createTime" property="createTime" javaType="java.util.Date"></result>
    </resultMap>

测试:

    @Test
    public void test10(){
        List<Team> teams = teamMapper.queryAll2();
        teams.forEach(team-> System.out.println(team));
    }

3 数据库表中列与实体类属性不一致的处理方式

案例准备工作:创建表:

use mybatis;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
  `user_id` int NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户姓名',
  `user_age` int NULL DEFAULT NULL COMMENT '用户年龄',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
​
INSERT INTO `users` VALUES (1, '贾宝玉', 14);
INSERT INTO `users` VALUES (2, '林黛玉', 13);
INSERT INTO `users` VALUES (3, '薛宝钗', 15);
​
SET FOREIGN_KEY_CHECKS = 1;

3.1 使用列别名和resultType

实体类Users.java

public class Users {
    private Integer userId;
    private String userName;
    private Integer userAge;
​
    @Override
    public String toString() {
        return "Users{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userAge=" + userAge +
                '}';
    }

接口UsersMapper.java

public interface UsersMapper {
    Users queryByID(int userId);
}

映射文件UsersMapper.xml

<?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.lina.mapper.UsersMapper">
    <!--方式1:resultType中的实体类的属性作为查询语句中的别名,让别名和属性保持一致-->
    <select id="queryByID" resultType="com.lina.pojo.Users">
        select user_id as userId,user_name as userName,user_age as userAge from users where user_id=#{id};
    </select>
</mapper>

测试类TestUsersMapper.java

/**
 * ClassName: TestUsersMapper
 * 测试类
 * @author wanglina
 * @version 1.0
 */
public class TestUsersMapper {
    private UsersMapper usersMapper= MybatisUtil.getSqlSession().getMapper(UsersMapper.class);
​
    @Test
    public void test01(){
        Users user = usersMapper.queryByID(1);
        System.out.println(user);
    }
}

3.2 使用resultMap

接口UsersMapper.java添加方法

Users queryByID2(int userId);

映射文件UsersMapper.xml添加如下内容:

    <!--方式2:通过resultMap自行映射-->
    <select id="queryByID2" resultMap="baseMap">
        select * from users where user_id=#{id};
    </select>
    <resultMap id="baseMap" type="com.lina.pojo.Users">
        <id column="user_id" property="userId"/>
        <result column="user_name" property="userName"/>
        <result column="user_age" property="userAge"/>
    </resultMap>

测试:

@Test
    public void test02(){
        Users user = usersMapper.queryByID2(1);
        System.out.println(user);
    }
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号