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>
测试类添加方法:
@Testpublic 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">fselect teamName,location from team </select>
测试类添加方法:
@Testpublic void test08(){Map<String, Object> map = teamMapper.queryTwoColumn();System.out.println(map);}@Testpublic 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,其余列用resultcolumn:表示数据库表中的列名,不区分大小写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>
测试:
@Testpublic 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; @Overridepublic 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 mapperPUBLIC "-//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); @Testpublic 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>
测试:
@Testpublic void test02(){Users user = usersMapper.queryByID2(1);System.out.println(user);}