七、分页
7.1 使用Limit分页
思考:为什么要分页?
- 减少数据的处理量
使用Limit分页
语法:select * from user limit startIndex,pageSize;
使用Mybatis实现分页
接口
List<User> getUserByLimit(Map<String,Integer> map);
Mapper.xml
<select id="getUserByLimit" parameterType="map" resultType="cn.imut.pojo.User"> select * from user limit #{startIndex}, #{pageSize}; </select>
测试
@Test public void getUserByLimit() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Integer> map = new HashMap<String, Integer>(); map.put("startIndex",0); map.put("pageSize",2); List<User> userList = mapper.getUserByLimit(map); for(User user: userList) { System.out.println(user); } sqlSession.close(); }
7.2 RowBounds分页
不再使用sql实现分页
接口
List<User> getUserByRowBounds();
mapper.xml
<select id="getUserByRowBounds" resultMap="userMap"> select * from user; </select>
测试
@Test public void getUserByRowBounds() { SqlSession sqlSession = MybatisUtils.getSqlSession(); RowBounds rowBounds = new RowBounds(1, 2); List<User> list = sqlSession.selectList("cn.imut.dao.UserMapper", null, rowBounds); for(User user: list) { System.out.println(user); } sqlSession.close(); }
7.3 分页插件
PageHelper
八、注解开发
8.1 面向接口编程
原因:
解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更号。
关于接口的理解:
- 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离
- 接口从本身反映了系统设计人员对系统的抽象理解
- 接口应有两类:
- 对一个 个体 的抽象,对应为一个抽象体
- 对一个 个体 某一方面的抽象,形成一个抽象面
- 一个 个体 可能有多个抽象面,抽象体与抽象面是有区别的
三个面向的区别:
- 面向对象指,考虑问题时,以对象为单位,考虑其属性和方法
- 面向过程指,考虑问题时,以一个具体的流程为单位,考虑它的实现
- 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题,更多体现是对系统整体的架构
8.2 使用注解开发
注解在接口上实现
@Select("select * from user"); List<User> getUsers();
在核心配置文件中绑定接口
<!-- 绑定接口> <mappers> <mapper class = "cn.imut.dao.UserMapper"/> </mappers>
测试
- 本质:反射机制实现
- 底层:动态代理!
8.3 Mybatis的详细执行流程
8.4 CRUD
可以在工具类中实现自动提交事务
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
关于@Param()注解
- 基本类型或者String需要使用
- 引入类型不需要加
- 如果只有一个基本类型可以忽略,但是建议使用
- 我们在SQL中引用的就是我们这里的@Param("uid")中设定的属性名
#{} ${} 区别
$不安全,用#就OK