分页查询
1、分页查询的好处
MyBatis作为持久层框架,主要任务就是操作数据库,即是对数据的增、删、查、改,其中大多数业务是查询功能,这也是这四个操作中最常用操作。所以为了减少数据库的负担,我们使用对数据进行分页查询,这样的话在面对查询大量数据时,每次只需要查询小部分数据,随之查询的次数随增加了。
2、使用分页的方式
第一种(常用):使用LIMIT
通用语法:
select * from [表名] limit stratIndex,pageSize;
stratIndex:开始下标
pageSize:一页的大小
如:select * from stu limit 5,10;
表示:查询表中的第6个数据,保存10条记录
特殊语法
- select * from [表名] limit startIndex,-1;
stratIndex:开始下标
-1:表示查询到最后一条数据结束
如:select * from stu limit 15,-1;
表示:查询表中数据从第16个数据开始到表中最后一条数据为止
- select * from [表名] limit 0,pageSize;
0:从表中第一条数据开始查询
pageSize:一页的大小
如:select * from stu limit 5;
表示:查询表中前5条记录
3、使用分页的例子
- StuMapper1接口
/** * 分页查询 * @param map 传入分页中的stratIndex,pageSize参数(使用map传入比较方便) * @return 返回查询的结果 */ List<Stu1> selectLimit1(Map<String,Object> map);
- StuMapper1.xml文件
<mapper namespace="com.dao.StuMapper1"> <select id="selectLimit1" parameterType="map" resultType="stu1"> select * from stu limit #{stratIndex},#{pageSize}; </select> </mapper>
- 在核心配置文件中注册mapper
<mappers> <mapper resource="com/dao/StuMapper1.xml"/> </mappers>
- 测试
@Test public void test01(){ SqlSession sqlSession = MybatisUntils.getSqlSession(); StuMapper1 mapper = sqlSession.getMapper(StuMapper1.class); Map<String,Object> map = new HashMap<>(); map.put("stratIndex",0); map.put("pageSize",1); List<Stu1> stus = mapper.selectLimit1(map); for (Stu1 stu:stus) { System.out.println(stu); } sqlSession.close(); }
对于上面传参是Map集合---------万能Map集合
上面的StuMapper接口也可以写为
List<Stu1> selectLimit(int stratIndex,int pageSize)
当有多个参数的时候,可以尝试着使用Map集合作为参数,如果参数比较少的话,直接传参即可
resultMap标签的简单使用
1、为什么使用<resultMap>
答:当实体类中的属性名和表中的字段名不一致时需要使用resultMap,使用它的目的是为了映射(描述)实体类中的属性名和表中字段名的关系
2、例子:当实体类中的属性名和表中字段不一致时会出现的问题:
- 表中字段:
- 实体类中属性:关注属性password
@Alias("stu1") @Data public class Stu1 { private int sno; private String sname; private int sage; private String saddress; private String password;//在表中的字段是spwd,与表中的字段不一致 }
- 查询所有学生信息
StuMapper1接口
List<Stu1> selectAll();
StuMapper.xml文件
<select id="selectAll" resultType="stu1"> select * from stu </select>
- 测试结果
@Test public void test02(){ SqlSession sqlSession = MybatisUntils.getSqlSession(); StuMapper1 mapper = sqlSession.getMapper(StuMapper1.class); List<Stu1> stus = mapper.selectAll(); for (Stu1 stu:stus) { System.out.println(stu); } sqlSession.close(); }
这种结果明显和我们想要的结果是不一样的,出现这种结果的原因:
在执行select * from stu语句时,会查询得到数据库中的学生信息结果集,然后将得到的学生信息结果集 找到对应的实体类,通过对应的set方法把结果集来赋值给类中的属性,然而这里只有setPassword(),找不到对应的setSpwd()所以password为null。
3、解决方案有二种
第一种:自动映射(在SQL映射语句使用as)
<select id="selectAll" resultType="stu1"> select sno,sname,sage,saddress,spwd as password from stu </select>
as:给表中字段起别名,即将表中的字段名起别名为java实体类中的属性名,
第二种:手动映射(使用resultMap)(推荐使用)
<select id="selectAll" resultMap="stuResult"> select * from stu </select> <resultMap id="stuResult" type="stu1"> <id property