结果处理 1 简单类型输出映射 返回简单基本类型 //查询管理员总数int adminCount(); select count(*) from admin 返回结果需要定义后才能使用简称 eg:resultType
返回简单基本类型
//查询管理员总数int adminCount();
select count(*) from admin
返回结果需要定义后才能使用简称
mybatis会将查询到的结果自动封装到一个对象中,会自己创建给定类型的类的对象(通过是否执行无参构造方法我们可以看到)
自动封装的条件:
例如:
定义的类中的属性名:
可以看到列名与属性名相同的,mybatis会自动将结果封装到pojo对象中,不同的则不会映射:
开启驼峰命名自动映射后即使不设置别名,也可以自动实现驼峰映射(eg:admin_gender ---> adminGender)
在全局配置文件中开启
查询多行数据,也就是返回多个对象
mybatis会自动创建多个对象,并通过set方法为属性赋值,然后将这些对象自动的封装到List集合中
List findAdmins();
定义 resutlMap
在resutlMap 标签中,我们可以自定义结果映射
(1) resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为“adminMap”
(2) resutlMap 的 id 属性是映射的 POJO 类
(3) id 标签映射主键,result 标签映射非主键
(4) property 设置 POJO 的属性名,column 数据库中列名
使用 resutlMap
(1) 本例的输出映射使用的是 resultMap,而非 resultType
(2) resultMap 引用了 adminMap
在说关联查询之前我们先说一个问题:
在关联查询的时候我们需要同时获取几张表中的数据,在模型类中进行封装的时候,我们会在一个类中把其他类中已有的属性再定义一遍,比如以前我们会在Student类会中再定义一遍我们需要的DORM类中已有的属性,这样显然是不合理的,所以我们现在直接在Student中关联Dorm类中的属性,它就会将数据封装到关联的类中去,以减少代码冗余。
eg:
4.1 多表关联处理结果
resultMap 元素中 association , collection 元素.
association :是一对一使用的,用来封装类中所关联的对象信息,会创建一个关联对象
property="类中的属性名" ,javaType="类型",select表示要执行的sql语句
collection:关联元素处理一对多关联
4.2 嵌套查询
将一个多表关联查询拆分为多次查询,查询主表数据,然后查询关联表数据
(1) select:指定关联查询对象的 Mapper Statement ID 为 findDormById
(2) column="dormid" :关联查询时将 dormid 列的值传入 findDormById,传多个参数的话就是{"属性名"="参数","属性名"="参数"}
(3) collection 和 association 都需要配置 select 和 column 属性,两者配置方法相同
案例数据库表:
student表:
dorm表:
admin表:
案例一
在查询学生信息的时候将宿舍号和操作人也查询出来,这时就要用到多表关联结果处理
方法一:通过三张表关联查询,一次把信息都查询出来,在封装信息的时候再处理
Student findStudentById(int id);
测试:
@Testpublic void find() { SqlSession sqlSession = MybatisUtil.getSqlSession(); StudentDao studentDao = sqlSession.getMapper(StudentDao.class); Student student = studentDao.findStudentById(1); sqlSession.commit(); sqlSession.close();}
在这里还要补充一点:如果在拿到学生信息后,需要获取学生的宿舍号,首先要拿到学生对象中的Dorm对象,然后再获取Dorm对象中属性
System.out.println(student.getDorm().getNum());
前端也一样
注意:查询多个学生信息只需要将sq语句中的WHERE s.id = #{id}这个条件给去掉,resultMap和查询一个是一样的
List findStudents();
方法二:嵌套查询(把sql分成多次查询,先查询学生信息,再通过外键查询宿舍和操作人信息)
测试:
案例二
在查询宿舍的同时查询出这个宿舍中所住学生的信息
方法1:关联查询
类中属性定义:
Dorm findDormById(int id);
测试:
@Testpublic void find(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); DormDao dormDao = sqlSession.getMapper(DormDao.class); //通过id查询宿舍和这个宿舍中所住学生的信息 Dorm dorm = dormDao.findDormById(1); sqlSession.close();}
方法2:嵌套查询
测试:
查询所有的宿舍及关联的学生信息
方法1:关联查询
List findDorms();
SELECT d.id, d.num, s.num, s.name, a.account FROM dorm d LEFT JOIN admin a ON d.adminid = a.id LEFT JOIN student s ON d.id = s.dormid
测试:
@Testpublic void find(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); DormDao dormDao = sqlSession.getMapper(DormDao.class); //查询每个宿舍,并关联每个宿舍中有多少个学生 List dorms = dormDao.findDorms(); // 遍历所有宿舍 for (Dorm dorm:dorms){ System.out.println(dorm); // 获取到宿舍中所有学生信息 for (Student student:dorm.getStudents()){ System.out.println(student.getNum()+":"+student.getName()); } } sqlSession.close();}
可以看到查询出了所有的宿舍以及宿舍所住学生的信息:
方法2:嵌套查询
SELECT id,num,adminid FROM dorm SELECT account FROM admin WHERE id = #{adminid} SELECT num,NAME FROM student WHERE dormid = #{id}
测试:
来源地址:https://blog.csdn.net/m0_58450531/article/details/128510519
--结束END--
本文标题: mybatis处理返回结果集
本文链接: https://lsjlt.com/news/392092.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0