一、目标
以分页的形式把管理员信息显示到页面上。 特殊需求:兼顾关键词查询,让后端代码不管有没有查询条件都能够以分页形式显示数据。二、思路
- 流程图
三、代码
- 引入PageHelper插件依赖(MyBatis插件)
<!-- MyBatis 分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> </dependency>
- 在SqlSessionFactoryBean中配置PageHelper插件
<!-- 配置 SqlSessionFactoryBean --> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 装配数据源 --> <property name="dataSource" ref="dataSource" /> <!-- 指定 MyBatis 全局配置文件位置 --> <property name="configLocation" value="classpath:mybatis-config.xml" /> <!-- 指定 Mapper 配置文件位置 --> <property name="mapperLocations" value="classpath:mapper/*Mapper.xml" /> <!-- 配置插件 --> <property name="plugins"> <array> <!-- 配置PageHelper插件 --> <!-- 内部bean可以不写id --> <bean class="com.github.pagehelper.PageHelper"> <!-- 配置相关属性 --> <property name="properties"> <props> <!-- 配置数据库方言,告诉 PageHelper 当前使用的具体数据库, --> <!-- 让 PageHelper 可以根据当前数据库生成对应的分页SQL语 句 --> <prop key="dialect">mysql</prop> <!-- 配置页码的合理化修正,自动把浏览器传来的 PageNum 修正到 0~总页数范围 --> <prop key="reasonable">true</prop> </props> </property> </bean> </array> </property> </bean>
- AdminMapper.xml中编写SQL语句,并在AdminMapper中补上该接口,形成映射
<!-- 该部分<sql>是逆向工程自动生成的 -->
<sql id="Base_Column_List"> id, login_acct, user_pswd, user_name, email, create_time </sql>
<!-- 有关limit的语句已经由PageHelper写好了,我们只需要写select语句 -->
<!-- 这个BaseResultMap是逆向工程里自带的 --> <select id="selectAdminListByKeyword" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from t_admin where
<!-- CONCAT是sql里拼字符串的函数 -->
<!-- 这样可以做到兼容有关键字查询和无关键字查询 --> login_acct like CONCAT("%",#{keyword},"%") or user_name like CONCAT("%",#{keyword},"%") or email like CONCAT("%",#{keyword},"%") </select
List<Admin> selectAdminListByKeyword(String keyword);
- AdminService.java
/** * 获取PageInfo(内部封装了List类型的属性来放Admin) * @param keyword * @param pageSize * @param pageNum * @return */ PageInfo<Admin> getPageInfo(String keyword,Integer pageSize,Integer pageNum);
- AdminServiceImpl.java
@Override public PageInfo<Admin> getPageInfo(String keyword, Integer pageSize, Integer pageNum) { // 1.调用PageHelper的静态方法开启分页功能 // 这里体现了PageHelper的"非侵入式"设计:原本的查询代码不必有任何修改,要分页就加上这句话,不分页去掉就行了 PageHelper.startPage(pageNum, pageSize); // 2.执行查询 // 老师说这个AdminListByKeyword是Page类型的,Page继承了ArrayList,所以可以直接赋值给List,这是多态 List<Admin> AdminListByKeyword = adminMapper.selectAdminListByKeyword(keyword); //Page<Admin> AdminListByKeyword = adminMapper.selectAdminListByKeyword(keyword); // 3.封装到PagInfo对象中 return new PageInfo<Admin>(AdminListByKeyword); }
- 注:int与Integer
- int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,故int不适合作为web层的表单数据的类型
- Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量
- 泛型支持Integer,并不支持int。如:ArrayList list = new ArrayList();你不能在泛型中写int
- Integer是int的包装类,int则是java的一种基本数据类型
- 声明为Integer的变量需要实例化,而声明为int的变量不需要实例化
- Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值