目录
7.分页
为什么要分页
- 减少数据的处理量
使用limit分页
语法:SELECT *FROM user limit startIndex,pageSize;
SELECT *from user limit 3;#[0,n]
limit关于第二个参数是-1的问题
以前是一个bug,现在修复了
使用Mybatis 实现分页,核心是SQL
1.接口
//分页
List<User>getUserByLimit(Map<String,Integer> map);
2.Mapper.XML
<!--分页-->
<select id="getUserByLimit" parameterType="map" resultMap="UserMap">
select * from mybatis.user limit #{startIndex},#{pageSize}
</select>
3.测试
@Test
public void getUserByLimit(){
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
HashMap<String, Integer> map = new HashMap<String,Integer>();
map.put("startIndex",0);
map.put("pageSize",5);
List<User> userList = userDao.getUserByLimit(map);
for (User user : userList) {
System.out.println(user);
}
}catch(Exception e){
logger.error("error进入了getUserByLimit");
e.printStackTrace();
}finally {
sqlSession.close();
}
}
7.2RowBounds分页
不建议在开发中使用
不再使用SQL实现分页
1.接口
//分页2
List<User>getUserByRowBounds();
2.mapper.xml
<!--分页2-->
<select id="getUserByRowBounds" resultMap="UserMap">
select *from mybatis.user
</select>
3.测试
@Test
public void getUserByRowBounds(){
SqlSession sqlSession = null;
try{
sqlSession=MybatisUtils.getSqlSession();
//RowBounds实现
RowBounds rowBounds = new RowBounds(1, 2);
//通过java代码层面实现分页
List<User> UserList = sqlSession.selectList("chen.dao.UserDao.getUserByRowBounds",null,rowBounds);
for (User user : UserList) {
System.out.println(user);
}
}catch (Exception e){
logger.error("error进入了GetUserByRowBounds");
e.printStackTrace();
}finally{
sqlSession.close();
}
}
7.3分页插件
了解即可,万一以后架构师要使用,就需要知道它是什么东西
8.使用注解开发
8.1面向接口编程
根本原因:解耦,可拓展,提高复用,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性好
关于接口的理解
- 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离
- 接口本身反映了系统设计人员对系统的抽象理解
- 接口应该有两类:
- 第一类是对一个个体的抽象,他可对应为一个抽象体
- 第二类是对一个个体某一方面的抽象,即形成一个抽象面
- 一个体有可能有多个抽象面,抽象体和抽象面是有去别的
三个面向区别
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a528122a8dc0dd8adde557f003e397ee.png)
8.2使用注解开发
对于像 BlogMapper 这样的映射器类来说,还有另一种方法来完成语句映射。 它们映射的语句可以不用 XML 来配置,而可以使用 Java 注解来配置。比如,上面的 XML 示例可以被替换成如下的配置:
1.注解在接口上实现
package org.mybatis.example;
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
2.在核心文件中绑定接口
<!--绑定接口-->
<mappers>
<mapper class="chen.dao.UserDao"/>
</mappers>
3.定义测试类
本质:反射机制实现
底层:动态代理
测试类
public class UserMapperTest {
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//底层主要应用反射
UserDao users = sqlSession.getMapper(UserDao.class);
List<User> userList = users.getUsers();
for (User user : userList) {
System.out.println(user);
}
}
}
代理类初始化聚合的是Object【解耦】,后面才通过反射持有代理对象
动态代理和静态代理的区别就是代理对象如何创建
动态代理:
Mybatis详细的执行流程