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添加如下内容:文章来源:https://www.toymoban.com/news/detail-849899.html
<!--方式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>
测试:文章来源地址https://www.toymoban.com/news/detail-849899.html
@Test public void test02(){ Users user = usersMapper.queryByID2(1); System.out.println(user); }
到了这里,关于MyBatis输出映射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!