目录
~我们用student实体来做一个查询的实例 使用方式 spring注解注入
5.分页 插件 pagehelper 的实现 使用spring切面与自定义注解实现功能
Mybatis是Apache的一个Java开源项目,是一个支持动态Sql语句的持久层框架。Mybatis可以将Sql语句配置在XML文件中,避免将Sql语句硬编码在Java类中。与JDBC相比: 1)Mybatis通过参数映射方式,可以将参数灵活的配置在SQL语句中的配置文件中,避免在Java类中配置参数(JDBC) 2)Mybatis通过输出映射机制,将结果集的检索自动映射成相应的Java对象,避免对结果集手工检索(JDBC) 3)Mybatis可以通过Xml配置文件对数据库连接进行管理
2. mybatis基本构成
SqlSessionFactoryBuilder: 根据配置信息生成SqlSessionFactory SqlSessionFactory: 用于生成SqlSession SqlSession: SqlSession是MyBatis的关键对象,通过这个接口可以操作命令,管理事务等 SqlMapper:MyBatis的设计组件,有java接口和xml文件构成。需要给出对应的sql映射和映射规则
两者均为ORM框架,但也有一些不同
| mybatis | hibernate |
|---|---|
| 轻量级 | 重量级 |
| 半自动化 | 全自动化 |
| sql | hql(但也可以使用sql,但违背了hibernate的初衷) |
| 扩展性、迁移性比较差 | 无缝移植 |
1) 使用maven新建一个web工程 2) idea在创建web工程时不会自动创建java,resources,test等目录,可以手动创建

3)通过pom.xml添加必要的依赖,直接将相关依赖考到项目中的pom.xml文件即可。
- "1.0" encoding="UTF-8"?>
-
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0modelVersion>
-
- <groupId>org.examplegroupId>
- <artifactId>deomMybatisartifactId>
- <version>1.0-SNAPSHOTversion>
- <packaging>warpackaging>
-
- <name>deomMybatis Maven Webappname>
-
- <url>http://www.example.comurl>
-
- <properties>
- <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
- <maven.compiler.source>1.8maven.compiler.source>
- <maven.compiler.target>1.8maven.compiler.target>
-
- <mysql-version>8.0.29mysql-version>
- <mybatis-version>3.5.9mybatis-version>
- <spring-version>5.3.18spring-version>
- properties>
-
- <dependencies>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.13.1version>
- <scope>testscope>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>${spring-version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webartifactId>
- <version>${spring-version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-txartifactId>
- <version>${spring-version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-aopartifactId>
- <version>${spring-version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-testartifactId>
- <version>${spring-version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-jdbcartifactId>
- <version>${spring-version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>${spring-version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-aspectsartifactId>
- <version>${spring-version}version>
- dependency>
-
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatis-springartifactId>
- <version>2.0.6version>
- dependency>
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-dbcp2artifactId>
- <version>2.9.0version>
- dependency>
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-pool2artifactId>
- <version>2.11.1version>
- dependency>
-
-
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql-version}version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>${mybatis-version}version>
- dependency>
-
- <dependency>
- <groupId>com.belerwebgroupId>
- <artifactId>pinyin4jartifactId>
- <version>2.5.1version>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <version>1.18.22version>
- <scope>providedscope>
- dependency>
-
-
-
- <dependency>
- <groupId>org.slf4jgroupId>
- <artifactId>slf4j-apiartifactId>
- <version>1.7.36version>
- dependency>
-
- <dependency>
- <groupId>ch.qos.logbackgroupId>
- <artifactId>logback-classicartifactId>
- <version>1.2.10version>
- dependency>
-
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>3.1.0version>
- <scope>providedscope>
- dependency>
-
- <dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>5.1.2version>
- dependency>
-
- <dependency>
- <groupId>jstlgroupId>
- <artifactId>jstlartifactId>
- <version>1.2version>
- dependency>
- <dependency>
- <groupId>taglibsgroupId>
- <artifactId>standardartifactId>
- <version>1.1.2version>
- dependency>
-
- dependencies>
-
- <build>
- <finalName>deomMybatisfinalName>
- <pluginManagement>
- <plugins>
-
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-clean-pluginartifactId>
- <version>3.1.0version>
- plugin>
-
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-resources-pluginartifactId>
- <version>3.0.2version>
- plugin>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-compiler-pluginartifactId>
- <version>3.8.0version>
- plugin>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-surefire-pluginartifactId>
- <version>2.22.1version>
- plugin>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-war-pluginartifactId>
- <version>3.2.2version>
- plugin>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-install-pluginartifactId>
- <version>2.5.2version>
- plugin>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-deploy-pluginartifactId>
- <version>2.8.2version>
- plugin>
-
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-surefire-pluginartifactId>
- <configuration>
- <testFailureIgnore>truetestFailureIgnore>
- configuration>
- plugin>
-
-
- plugins>
- pluginManagement>
- build>
- project>
-
4)将mybatis 配置到spring中的 核心配置文件(applicationContext-base.xml),jdbc.properties 连接参数, logback.xml日志考到项目的resources目录下,并修改数据库的连接。
applicationContext-base.xml spring核心配置文件
- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
-
-
-
-
-
- <context:component-scan base-package="com.zking.mybatis01"/>
-
-
-
-
-
- <context:property-placeholder location="classpath:jdbc.properties" ignore-resource-not-found="true"/>
-
-
- <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="${driver.name}"/>
- <property name="url" value="${db.url}"/>
- <property name="username" value="${db.user}"/>
- <property name="password" value="${db.password}"/>
-
- <property name="initialSize" value="10"/>
-
- <property name="maxTotal" value="100"/>
-
- <property name="maxIdle" value="50"/>
-
- <property name="minIdle" value="10"/>
-
-
- <property name="maxWaitMillis" value="-1"/>
-
- <property name="testWhileIdle" value="true">property>
- <property name="validationQuery" value="select 1">property>
-
- bean>
-
-
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
-
- <property name="dataSource" ref="dataSource"/>
-
-
-
- <property name="mapperLocations" value="classpath:/mapper/**/*.xml"/>
-
- <property name="plugins">
- <list>
- <bean class="com.github.pagehelper.PageInterceptor">
- <property name="properties">
-
- <value>
- helperDialect=mysql
- value>
- property>
- bean>
- list>
- property>
-
- bean>
-
-
-
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-
-
- <property name="basePackage" value="com/zking/**/mapper"/>
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
- bean>
-
-
-
- <aop:aspectj-autoproxy/>
-
-
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"/>
- bean>
-
-
- <tx:annotation-driven transaction-manager="transactionManager"/>
-
- beans>
jdbc.properties mysql 8.0 连接配置文件
- driver.name=com.mysql.cj.jdbc.Driver
- db.url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&allowPublicKeyRetrieval=true
- db.user=root
- db.password=123456
logback.xml 配置日志文件
- "1.0" encoding="UTF-8"?>
- <configuration debug="false">
-
-
- <property name="LOG_HOME" value="d:\\temp\\mylogs" />
-
- <property name="LOG_NAME" value="mybatisdemo"/>
-
-
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- encoder>
- appender>
-
-
- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <FileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.logFileNamePattern>
-
- <MaxHistory>30MaxHistory>
- rollingPolicy>
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- encoder>
-
- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <MaxFileSize>10MBMaxFileSize>
- triggeringPolicy>
- appender>
-
-
-
-
-
-
- <root level="INFO">
- <appender-ref ref="STDOUT" />
- <appender-ref ref="FILE"/>
- root>
-
- configuration>
5) 在src/main/resources目录下创建mapper用于方式mybatis的映射文件

6)创建包的目录结构,如下图所示:

7)ssh2与ssm的对应关系
| ssh2 | ssm |
|---|---|
| action | controller |
| service | service |
| dao | mapper |
| IXxxDao.java | XxxMapper |
| XxxDao.java | XxxMapper.xml |
| entity | model |
| Xxx.java | Xxx.java |
| Xxx.hbm.xml |
8)编写model,即存放数据的对象,在ssh2时叫做entity。
这里就可以看到 我们所用的lombok的强大的 @Data 会自动生成 get set 与tostring 等等。。。。
使用lombok需要有的插件


9)mapper编写(相当于dao)。
编写之前我们需下载一个插件方便编写mybatis 如下图

10)在目录结构中加入一个mapper包,在该包中创建一个TestMapper接口
创建好接口后 ----可直接使用插件生成 mybatis的xml配置文件

注意 :第一次创建的时候会提示你选择地址 我们直接选择 resources 中我们创建的mapper文件


1.mapper中定义的接口
- package com.zking.mybatis01.mapper;
-
- import com.zking.mybatis01.dto.StudentDto;
- import com.zking.mybatis01.model.Student;
-
- import org.springframework.stereotype.Repository;
-
- import java.util.List;
- @Repository("studentMapper")
- public interface IStudentMapper {
- /**
- * 查询所有学生
- * @param stu 根据姓名 模糊查询
- * @return 返回 学生集合
- */
- public List<Student> listStudent(Student stu);
-
- /**
- * 增加学生
- * @param stu 学生实体
- */
- public Integer addStudent(Student stu);
-
- /**
- * 修改学生信息
- * @param upd
- * @return
- */
- public Integer updStudent(Student upd);
-
- /**
- * 根据学生id 进行删除
- * @param stu
- * @return
- */
- Integer delStudent(Student stu);
-
- /**
- * 根据 用户多个id查询
- * @return
- */
- List<Student> listStudentByid(StudentDto dto);
-
- }
注意:在xml中注释的方法要在对应的java接口中注释掉,(注释掉只是为了少写点代码,尽快测试)
注:#{} 与 ${} 的区别 #{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号,如上面的值 “4,44,514”就会变成“ ‘4,44,514’ ”
${ }是字符串替换, MyBatis在处理${ }时,它会将sql中的${ }替换为变量的值,传入的数据不会加两边加上单引号。
使用${ }会导致sql注入,不利于系统的安全性!
SQL注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。常见的有匿名登录(在登录框输入恶意的字符串)、借助异常获取数据库信息等
2.如数据库与实体的属性名不一致 需要配置映射关系 如图:👇

2.1 .我们配置好的 增删改查
- "1.0" encoding="UTF-8" ?>
- mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
- <mapper namespace="com.zking.mybatis01.mapper.IStudentMapper">
-
-
- <select id="listStudent" resultType="com.zking.mybatis01.model.Student">
- select sid,sname,birthday,ssex
- FROM t_student
- <where>
- <if test="sname !=null and ''!=sname ">
- sname like concat(#{sname},'%')
- if>
- where>
- select>
-
- <select id="listStudentByid" resultType="com.zking.mybatis01.model.Student">
- select sid,sname,birthday,ssex from t_student
- <where>
- <choose>
-
- <when test="listSid != null and listSid.size != 0">
- and sid in
-
- <foreach collection="listSid" item="sid" open="(" close=")" separator=",">
- #{sid}
- foreach>
- when>
- choose>
- where>
-
- select>
-
-
- <insert id="addStudent" parameterType="com.zking.mybatis01.model.Student">
- Insert into t_student (sname,birthday,ssex)
- values (#{sname},#{birthday},#{ssex})
-
- insert>
-
- <update id="updStudent" parameterType="com.zking.mybatis01.model.Student">
- update t_student
- <set>
- <if test="sname !=null and ''!=sname">
- sname = #{sname},
- if>
- <if test="birthday !=null">
- birthday = #{birthday},
- if>
- <if test="ssex !=null and ''!=ssex">
- ssex = #{ssex,jdbcType=NUMERIC}
- if>
- set>
- <where>
- sid = #{sid}
- where>
- update>
- <delete id="delStudent" parameterType="com.zking.mybatis01.model.Student">
- delete from t_student <where>
- sid = #{sid}
- where>
-
- delete>
- mapper>
3.接下来我们编写service 事务层
定义我们的service接口 ↓
- package com.zking.mybatis01.service;
-
- import com.zking.mybatis01.dto.StudentDto;
- import com.zking.mybatis01.model.Student;
- import com.zking.mybatis01.utils.PageBean;
-
- import java.util.List;
-
- public interface IStudentService {
-
-
- /**
- * 查询所有学生信息
- * @param stu 模糊查询
- * @return 学生集合
- */
- List<Student> listStudentpaging(Student stu , PageBean pge);
- /**
- * 增加学生
- * @param stu 学生实体
- */
- Integer addStudent(Student stu);
- /**
- * 修改学生信息
- * @param upd
- * @return
- */
- public Integer updStudent(Student upd);
- /**
- * 根据学生id 进行删除
- * @param stu
- * @return
- */
- Integer delStudent(Student stu);
- /**
- * 根据 用户多个id查询
- * @return
- */
- List<Student> listStudentByid(StudentDto dto );
- }
定义实现类
- package com.zking.mybatis01.service;
-
- import com.github.pagehelper.PageHelper;
- import com.github.pagehelper.PageInfo;
- import com.zking.mybatis01.dto.StudentDto;
- import com.zking.mybatis01.interfaces.Paging;
- import com.zking.mybatis01.mapper.IStudentMapper;
- import com.zking.mybatis01.model.Student;
- import com.zking.mybatis01.utils.PageBean;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.stereotype.Service;
-
- import javax.annotation.Resource;
- import java.util.List;
- @Service
- public class StudentServiceImpl implements IStudentService {
- //类型判断 注入
- @Autowired
- private IStudentMapper stu;
-
-
- @Override
- public List<Student> listStudentpaging(Student stu, PageBean pge) {
-
-
- return this.stu.listStudent(stu);
- }
-
- @Override
- public Integer addStudent(Student stu) {
- return this.stu.addStudent(stu);
- }
-
- @Override
- public Integer updStudent(Student upd) {
- return this.stu.updStudent(upd);
- }
-
- @Override
- public Integer delStudent(Student stu) {
- return this.stu.delStudent(stu);
- }
-
- @Override
- public List<Student> listStudentByid(StudentDto dto) {
- return this.stu.listStudentByid(dto);
- }
- }
-
-
编写测试用例 测试功能
部分测试
- package com.zking.mybatis01.service;
-
- import com.zking.mybatis01.dto.StudentDto;
- import com.zking.mybatis01.model.Student;
- import com.zking.mybatis01.utils.PageBean;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
- import java.util.Arrays;
- import java.util.Date;
- import java.util.List;
- //帮我们去生成spring 上下文对象
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(locations={"classpath*:applicationContext*.xml"})
- public class StudentServiceImplTest {
- @Autowired
- private IStudentService studentService;
-
-
- @Test
- public void listStudent() {
- Student st=new Student();
- st.setBirthday(new Date());
- st.setSname("小黑");
- st.setSsex(1);
- /*List<Student> students = studentService.listStudent(st);
- students.forEach(t->System.out.println(t));*/
-
- Integer i= studentService.addStudent(st);
- System.out.println(i);
-
- }
- @Test
- public void updStudent(){
- Student st=new Student();
- st.setSid(1);
- st.setBirthday(new Date());
- st.setSname("小名");
- st.setSsex(1);
- Integer integer = studentService.updStudent(st);
- System.out.println(integer);
- }
- @Test
- public void delStudent(){
- Student st=new Student();
- st.setSid(18);
- Integer integer = studentService.delStudent(st);
- System.out.println(integer);
- }
- @Test
- public void listStudentByid(){
- StudentDto studentDto = new StudentDto();
- studentDto.setListSid(Arrays.asList(1,2,3,5,6));
- List<Student> students = studentService.listStudentByid(studentDto);
- students.forEach(System.out::println);
- }
-
- }
引入pagehelper 包 如果复制了上方的pom的 可不需要加入
- <dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>5.1.2version>
- dependency>
1.编写分页实体便于分页
- package com.zking.mybatis01.utils;
-
- import com.mysql.cj.util.StringUtils;
-
- import java.util.Map;
-
- import javax.servlet.http.HttpServletRequest;
-
-
-
- public class PageBean {
-
- /**
- * 页码
- */
- private int page = 1;
-
- /**
- * 每页显示的记录数
- */
- private int rows = 10;
-
- /**
- * 总记录数
- */
- private int total = 0;
-
- /**
- * 是否分页
- */
- private boolean pagination = true;
-
- /**
- * 记录查询的url,以便于点击分页时再次使用
- */
- private String url;
-
- /**
- * 存放请求参数,用于生成隐藏域中的元素
- */
- private Map
parameterMap; -
- /**
- * 根据传入的Request初始化分页对象
- * @param request
- */
- public void setRequest(HttpServletRequest request) {
-
- if(!StringUtils.isNullOrEmpty(request.getParameter("page"))) {
- this.page = Integer.valueOf(request.getParameter("page"));
- }
- if(!StringUtils.isNullOrEmpty(request.getParameter("rows"))) {
- this.rows = Integer.valueOf(request.getParameter("rows"));
- }
- if(!StringUtils.isNullOrEmpty(request.getParameter("pagination"))) {
- this.pagination = Boolean.valueOf(request.getParameter("pagination"));
- }
-
- this.url = request.getRequestURI();
- this.parameterMap = request.getParameterMap();
-
- request.setAttribute("pageBean", this);
- }
-
-
- public int getPage() {
- return page;
- }
-
-
- public void setPage(int page) {
- this.page = page;
- }
-
-
- public int getRows() {
- return rows;
- }
-
-
- public void setRows(int rows) {
- this.rows = rows;
- }
-
-
- public int getTotal() {
- return total;
- }
-
-
- public void setTotal(int total) {
- this.total = total;
- }
-
- public boolean isPagination() {
- return pagination;
- }
-
- public void setPagination(boolean pagination) {
- this.pagination = pagination;
- }
-
- public String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public Map
getParameterMap() { - return parameterMap;
- }
-
- public void setParameterMap(Map
parameterMap) { - this.parameterMap = parameterMap;
- }
-
- //计算起始页码
- public int getStartIndex() {
- return (this.page - 1) * this.rows;
- }
-
- //获取总页数
- public int getTotalPage() {
- if (this.getTotal() % this.rows == 0) {
- return this.getTotal() / this.rows;
- } else {
- return this.getTotal() / this.rows + 1;
- }
- }
-
- //上一页
- public int getPreviousPage() {
- return this.page - 1 > 0 ? this.page - 1 : 1;
- }
-
- //下一页
- public int getNextPage() {
- return this.page + 1 > getTotalPage() ? getTotalPage() : this.page + 1;
- }
-
- }
2.在aop包中定义分页切面 定义切面前需要 架包 spring-aspects

- package com.zking.mybatis01.aop;
-
- import com.github.pagehelper.PageHelper;
- import com.github.pagehelper.PageInfo;
- import com.zking.mybatis01.utils.PageBean;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.springframework.stereotype.Component;
-
- import java.util.List;
-
- @Component
- @Aspect
- public class PaginAop {
- //环绕通知 自定义注解 分辨是否调用
- @Around("@annotation(com.zking.mybatis01.interfaces.Paging)")
- public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
- //获取目标方法的所有参数
- Object[] args = joinPoint.getArgs();
- PageBean pag =null;
- for (Object arg : args) {
- if(arg instanceof PageBean){
- pag=(PageBean) arg;
- if(pag!=null && pag.isPagination()){
- PageHelper.startPage(pag.getPage(),pag.getRows());
- }
- }
- }
- Object proceed = joinPoint.proceed();
- if(pag!=null && pag.isPagination()){
- PageInfo info=new PageInfo((List) proceed);
- pag.setTotal((int)info.getTotal());
- }
- return proceed;
- }
-
-
- }

接下来我们就可以去使用注解了
1.我们将自定义注解标记在我们需要分页的方法上 在service中实现

2.测试用例中添加

- @Test
- public void listStudentPage(){
- PageBean page=new PageBean();
- page.setRows(3);
- List<Student> students = studentService.listStudentpaging(null, page);
- students.forEach(System.out::println);
- }
3.运行结果
