JavaWeb学习笔记-part7-MyBatis

MyBatis 框架

目录

MyBatis 框架

1 总体概述

1.1 软件开发常用结构

1.2 框架(Framework)

1.3 JDBC的缺陷

1.4 MyBatis框架是什么

2 快速入门

2.1 入门案例

2.2 主要类的介绍

2.3 Mybatis工具类

3 深入理解

3.1 Mybatis动态代理

3.2 传入参数

3.3 Mybatis内部机制其实是JDBC

3.4 封装MyBatis输出结果

3.5 模糊查询like

4 动态sql

4.1 标签

4.2 标签

4.3 标签

4.4 代码片段

5 MyBatis配置文件

5.1 主配置文件,见2.1.7

5.2 属性配置文件

6 拓展——PageHelper


1 总体概述

1.1 软件开发常用结构

1.1.1 三层架构

三层架构包括的三层:

界面层、业务逻辑层、数据访问层

三层的职责:

  1. 界面层:接受用户数据,显示请求的处理结果。(jsp,html,servlet)

  2. 业务逻辑层:接受界面层传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。(service)

  3. 数据访问层:与数据库打交道。实现对数据的增删改查。(dao)

三层对应的包:

  1. 界面层:controller (servlet)

  2. 业务逻辑层:service (service类)

  3. 数据访问层:dao (dao类)

三层中类的交互:

用户使用界面层——》业务逻辑层——》数据访问层——》数据库

三层对应的处理框架:

界面层——servlet——springmvc

业务逻辑层——service类——spring

数据访问层——dao类——mybatis

1.2 框架(Framework)

1.2.1 框架是一个模板

  1. 框架中定义好了一些功能,这些功能时可用的。

  2. 可以加入项目中自己的功能,这些功能可以利用框架中写好的功能。

框架是一个半成品软件,定义好了一些基础功能,需要加入自己的功能来完善。基础功能是可重复使用的,可升级的。

1.2.2 框架特点

  1. 框架是有局限的,不能干所有事情

  2. 框架是针对某一个领域有效。

  3. 框架是一个软件

1.3 JDBC的缺陷

使用JDBC的缺陷:

  1. 代码比较多,开发效率低

  2. 需要关注Connection,Statement,ResultSet对象创建和销毁

  3. 对Result查询的结果,需要自己封装为list

  4. 重复的代码比较多

  5. 业务代码和数据库的操作混在一起

总之,我们需要一个新的工具代替JDBC,以弥补JDBC的缺陷。那就是我们今天所学的MyBatis

1.4 MyBatis框架是什么

1.4.1 MyBatis的背景

MyBatis本是 apache 的一个开源项目 iBatis, 2010年这个项目由 apache software foundation迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects (DAOs)

1.4.2 MyBatis

mybatis是MyBatis SQL Mapper Framework for Java (sql映射框架)

  1. sql mapper:sql映射

    可以把数据库表中的一行数据映射为一个java对象

    一行数据可以看作是一个java对象,操作这个对象,就相当于操作表中的数据

  2. Data Access Objects (DAOs):数据访问

    对数据库执行增删改查

1.4.3 MyBatis提供了哪些功能

  1. 提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象

  2. 提供了执行sql语句的能力,不用你执行sql

  3. 提供了循环sql,把sql的结果转为java对象List集合的能力

  4. 提供了关闭资源的能力,不用你关闭connection,statement,resulset

开发人员需要做的是:提供sql语句(工作量大幅减少了)

流程:开发人员提供sql语句——》mybatis处理sql——》开发人员得到List集合或者java对象

1.4.4 总结

mybatis是一个sql映射框架,提供数据库的操作能力。增强的JDBC,使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection等的创建销毁,sql的执行。

2 快速入门

2.1 入门案例

2.1.1 使用MyBatis的准备

下载mybatis,此处我们使用的是3.5.1版本

Releases · mybatis/mybatis-3 · GitHub

2.1.2 创建一张表

DROP TABLE IF EXISTS student;
​
CREATE TABLE student (
    id int(11) NOT NULL,
    name varchar(255) DEFAULT NULL,
    email varchar(255) DEFAULT NULL,
    age int(11) DEFAULT NULL,
    PRIMARY KEY(id)
)ENGINE=innoDB DEFAULT CHARSET=utf8;
​
INSERT INTO student VALUES(1001,"李四","lisi@163.com",20);
INSERT INTO student VALUES(1002,"张三","zhangsan@163.com",28);

创建好的表:

2.1.3 创建项目(略)

2.1.4 编辑POM文件增加MYSQL-connector和MyBatis依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.3.1</version>
</dependency>
​
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.19</version>
</dependency>

2.1.5 创建Student实体类和对应的Dao类(略)

2.1.6 创建MyBatis使用的配置文件——sql映射文件

sql映射文件:

  1. 一个xml文件

  2. 一般一个表对应一个sql映射表

  3. 应当存放在dao接口所在的目录

  4. 文件名称和接口保持一致

其作用在于:写与接口中方法对应的sql语句

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
    <!-- 
        id:你要执行的sql语法的唯一标识,mybatis会使用这个id的值来找到要执行的sql语句
           可以自定义,但是要求你使用接口中的方法名称
        resultType:表示结果类型,是sql语句执行后得到的ResultSet
                   遍历这个Res得到的java对象的类型
                   值写的是类型的全限定名称
    -->
    <select id="selectBlog" resultType="Blog">
        select * from Blog where id = #{id}
    </select>
</mapper>
​
<!-- 以上为官方文档的示例代码 -->
​
<!--
    sql映射文件:写sql语句的,mybatis会执行这些sql
    1.指定约束文件
        <!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      mybatis-3-mapper.dtd 约束文件的作用,拓展名是dtd。
    2.约束文件的作用:限制,检查在当前文件中出现的标签,属性必须符合mybatis要求
    3.mapper 当前文件的根标签,必需的。
      namespace 命名空间,唯一值,可以是自定义的字符串。
                要求你使用dao接口的全限定名称。
    4.在当前文件中,可以使用特定标签,表示数据库的特定操作。
      <select> 查询,在标签内写select语句
      <update> 更新,在标签内写update语句
      ...
      基本与sql语句相同
-->

2.1.7 创建主配置文件

文件名可以自定义,文件类型为xml,文件应当被放置在resources的根目录下

其目的在于:

  1. 连接数据库

  2. 指定mapper文件的位置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 
        环境配置:数据库的连接信息
        default:必须和某个environment的id值一样
                告诉mybatis使用哪个数据库的连接信息。就是访问哪个数据库
    -->
    <environments default="development">
        <!--
            environment:一个数据库的配置,环境
            id:一个唯一值,自定义,表示环境的名称
        -->
        <environment id="development">
            <!--
                transactionManager:mybatis的事务类型
                    type:JDBC(表示使用jdbc中的connection对象的commit,rollback做事务处理)
                         MANAGED:把mybatis的事务处理委托给其他容器(一个服务器软件,一个框架spring)
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource:表示数据源,连接数据库
                数据源:表示连接connection对象的;
                      在java中的规范中,实现了javax.sql.DataSource的都是数据源。
                type:表示数据源类型
                pooled:表示使用连接池,mybatis会创建pooledDataSource类
                unpooled:不使用连接池,在每次执行sql语句,先创建连接,执行sql,再关闭连接
                         mybatis会创建一个unpooledDataSource类
                JNDI:java命名和目录服务(windows注册表)
            -->
            <dataSource type="POOLED">
                <!--
                    driver:数据库的驱动类型名
                    url:连接数据库的url字符串
                    username:访问数据库的用户名
                    password:访问数据库的密码
                    name是固定的不能修改
                -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- sql mapper(sql映射文件)的位置 -->
    <mappers>
         <!-- 
            一个mapper标签指定一个文件的位置 
            文件位置:要包括target/classes之后的文件路径
         -->
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
        <mapper resource="org/mybatis/example/OrderMapper.xml"/>
        <!-- 
            指定多个mapper文件 可以一条一条mapper,如上面
            也可以使用package,一次性添加多条mapper
        -->
        <!--
            name:xml文件所在得包的名称,这个包中所有xml文件一次加载进mybatis
            使用要求:
                mapper文件名称需要和接口名称一样,区分大小写
                mapper文件和dao接口需要在同一目录
        -->
        <package name="com.mybatis.example"/>
    </mappers>
</configuration>
​
<!--
    mybatis的主配置文件:主要定义了数据库的配置信息,sql映射文件的位置
    1.约束文件
    <!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
    mybatis-3-config.dtd是约束文件的名称
    2.<configuration>根标签。
-->

为了能在maven编译后读取到资源文件(sql映射文件)需要在pom加入一个插件

<resources>
    <resource>
        <directory>src/main/java</directory><!--所在目录-->
        <includes><!--包括目录下的.properties,.xml文件都会扫描到-->
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
    </resource>
</resources>

2.1.8 使用mybatis进行数据库的查询

使用mybatis的对象SqlSession,通过它的方法执行sql语句

public class MyApp {
​
    public static void main(String[] args) throws IOException {
        //访问mybatis读取student数据
        //1.定义mybatis主配置文件的名称,从根目录开始(target/classes)
        String config = "mybatis.xml";
        //2.读取这个文件
        InputStream in = Resources.getResourceAsStream(config);
        //3.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //4.创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //5.**取SqlSession对象,从SqlSessionFactory中获取SqlSession**
        SqlSession sqlSession = factory.openSession();
        //6.拼接sql语句标识。sql映射文件中的namespace+"."+标签的id值
        String sqlId = "com.pjh.dao.StudentDao"+"."+"findAll";
        //7.执行sql语句,通过sqlId找到语句
        List<Student> studentList = sqlSession.selectList(sqlId);
        //8.输出结果
        for(Student stu:studentList) {
            System.out.println("查询的学生="+stu);
        }
        //9.关闭SqlSession对象
        sqlSession.close();
    }
}

得到结果:

查询的学生=Student{id=1001, name='李四', email='lisi@163.com', age=20}
查询的学生=Student{id=1002, name='张三', email='zhangsan@163.com', age=28}

2.1.9 使用MyBatis进行增删改

mybatis默认不会自动提交事务,需要手动进行提交

具体:

int num = sqlSession.insert(sqlId,student);
sqlSession.commit();//****

2.1.10 sql映射文件中sql语句的写法

sql语句中用#{字段名}来读取类的属性,并填入sql语句中

例如:

insert into student values(#{id},#{name},#{email},#{age})

2.2 主要类的介绍

  1. Resources:

    InputStream in = Resources.getResourceAsStream(config);

    mybatis中的一个,负责读取主配置文件的类

  2. SqlSessionFactoryBuilder:

    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(in);

    负责创建SqlSessionFactory对象

  3. SqlSessionFactory:需要使用大量资源,整个程序只需创建一次就够了;它是一个接口,实现类为DefaultSqlFactory。

    作用:获取SqlSession对象

    SqlSession sqlSession = factory.openSession();

    openSession()方法说明:

    1. openSession():无参,获取非自动提交事务的SqlSession对象

    2. openSession(boolean):为true时,获取自动提交事务的SqlSession;为false,获取非自动提交事务的SqlSession

  4. SqlSession:接口,实现类为DefaultSqlSession

    定义了操作数据的方法,例如selectOne,selectList,insert,delete等等

    使用要求:SqlSession对象不是线程安全的,需要在方法内部使用,在执行sql语句之前,使用openSession()获取SqlSession对象,在执行完sql语句后,需要关闭它,执行SqlSession.close(),这样能保证它的使用是线程完全的

2.3 Mybatis工具类

以上入门案例使用的调用dao的方法十分繁琐,且有大量的代码复用问题,因此可以引入一个mybatis工具类,以减轻开发的繁琐程度。

package com.pjh.uitls;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisUtils {
	
    private static SqlSessionFactory factory = null;
	
    static {
        String config = "mybatis.xml";
        try {
            InputStream in = Resources.getResourceAsStream(config);
            factory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
	//主要提供的方法,返回一个sqlSession
    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        if(factory != null) {
             sqlSession = factory.openSession();
        }
        return sqlSession;
    }

}

再创建这个工具类后,2.1.8中的代码可以改写为

package com.pjh;

import com.pjh.domain.Student;
import com.pjh.uitls.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;

import java.io.IOException;
import java.util.List;

public class MyApp2 {

    public static void main(String[] args) throws IOException {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        String sqlId = "com.pjh.dao.StudentDao.findAll";

        List<Student> studentList = sqlSession.selectList(sqlId);

        for(Student stu:studentList) {
            System.out.println("查询的学生="+stu);
        }

        sqlSession.close();
    }
}

3 深入理解

3.1 Mybatis动态代理

在引入了工具类后尽管稍微减少了开发的难度,但是仍然存在部分代码相似度比较高的情况,可以进一步优化,由此引出Mybatis的动态代理。

简要原理如下:

  1. mybatis根据dao方法的调用,获取执行sql语句的信息。

  2. mybatis根据你的dao接口,创建出一个dao接口的实现类,并创建这个类的对象。

  3. 完成sqlSession调用方法,访问数据库。

再次对2.1.8进行修改:

package com.pjh;

import com.pjh.dao.StudentDao;
import com.pjh.domain.Student;
import com.pjh.uitls.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class TestMyBatis {
    /**
     * 使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口)
     * getMapper能获取dao接口对应的实现类对象
     */
    public static void main(String[] args) {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        //调用dao方法,执行数据库操作
        List<Student> students = dao.findAll();
        for(Student stu : students) {
            System.out.println("学生="+stu);
        }
    }
}

使用动态代理后,程序员仅需创建Dao接口和对应的mapper文件,即可完成对数据库的操作。

3.2 传入参数

从java代码中把数据传入mapper文件的sql语句中。

  1. parameterType:写在mapper文件中的一个属性。表示dao接口中方法参数的数据类型。其值为java数据类型的全限定名称或者mybatis定义的别名。

    AliasMapped Type
    _bytebyte
    _longlonglong
    _shortshort
    _intint
    _integerint
    _doubledouble
    _floatfloat
    _booleanboolean
    stringString
    byteByte
    longLong
    shortShort
    intInteger
    integerInteger
    doubleDouble
    floatFloat
    booleanBoolean
    dateDate
    decimalBigDecimal
    bigdecimalBigDecimal
    objectObject
    mapMap
    hashmapHashMap
    listList
    arraylistArrayList
    collectionCollection
    iteratorIterator

    mapper文件中:

    <!-- 全限定名称 -->
    <select id="selectById" parameterType="java.lang.Integer" resultType="com.pjh.domain.Student">
            select * from student where id=#{id}
    </select>
    
    <!-- 别名 -->
    <select id="selectById" parameterType="int" resultType="com.pjh.domain.Student">
            select * from student where id=#{id}
    </select>

    但实际上parameterType可以不写,mybatis通过反射机制可以发现接口参数类型。

    <select id="selectById" resultType="com.pjh.domain.Student">
            select * from student where id=#{id}
    </select>

  2. 简单类型参数:mybatis把java的基本数据类型和string都叫做简单类型。

    在mapper文件获取简单类型的一个参数的值,使用#{任意字符}

  3. 多个参数,使用@Param命名参数

    //接口
    public List<Student> selectMulitParam(String name, Integer age);
    //使用@Param("参数名") 
    public List<Student> selectMulitParam(@Param("myname") String name, 
    									  @Param("myage") Integer age);

    mapper文件:

    <select>
            select * from student where name=#{myname} and age=#{myage}
    </select>

  4. 多个参数,使用java对象参数

    使用对象语法:#{属性名, javaType=类型名称, jdbcType=数据类型} 完整格式

    javaType:指java中的属性数据类型

    jdbcType:指数据库中的数据类型

    JDBCTypes:
    BITFLOATCHARTIMESTAMPOTHERUNDEFINED
    TINYINTREALVARCHARBINARYBLOBNVARCHAR
    SMALLINTDOUBLELONGVARCHARVARBINARYCLOBNCHAR
    INTEGERNUMERICDATELONGVARBINARYBOOLEANNCLOB
    BIGINTDECIMALTIMENULLCURSORARRAY

    简化的格式:#{属性值},javaType和jdbcType的值mybatis反射可以获取,不用提供

  5. 多个参数,按参数位置传参

    语法格式:#{arg0},其中0是参数的位置,其他是固定的

  6. 多个参数,使用Map传参

    定义一个map:

    Map<String,Object> map = new HashMap<>();
    map.add("myname","张三");
    map.add("myage",22);

    Dao接口:

    public List<Student> select(Map<String, Object> map);

    语法格式:#{myname},其中大括号中写map中的key值

  7. #与$

    #:占位符,用来代替实际参数值,并使用PrepareStatement对象执行sql语句,#{}代替了sql语句中的?。这样做更加安全、迅速,建议使用。

    $:字符串替换,使用的Statement对象执行,效率比ps低,且存在sql注入的问题。一般用于替换列名或者表名

3.3 Mybatis内部机制其实是JDBC

3.4 封装MyBatis输出结果

mybatis执行了sql语句,得到的java对象

3.4.1 resultType

结果类型,指sql语句执行完毕后,数据转为的java对象类型,该java类型是任意的。

处理方法:

  1. mybatis执行sql语句,然后mybatis调用类的无参数构造方法,创建对象。

  2. mybatis把ResultSet指定列值付给同名的属性。

类型:

  1. 简单类型:同3.2.2

  2. 定义自定义类型的别名

    1. 在mybatis主配置文件中定义,使用<typeAlias>定义别名

    2. 或者使用<package>,name是包名,这个包中的所有类,类名就是别名(类名不区分大小写)

    3. 可以在resultType中使用自定义的别名

3.4.2 查询返回Map

mybatis可以把查询结果组织成一个map并返回

注意:

  1. 列名是map的key,列值是map的value

  2. 只能返回一行记录,多余一行会报错

3.4.3 resultMap

结果映射,指定列名和java对象的属性对应关系的

用途:

  1. 自定义列值赋值给哪个属性

  2. 当你的列名和属性名不一样时,一定使用resultMap

语法格式:

<!-- 定义resultMap
	 id:自定义名称,表示你定义的这个resultMap
 	 type:java类型的全限定名称
-->
<resultMap id="stuMap" type="com.pjh.domain.student">
    <!--
		列名和java属性将的关系
		主键列,使用id标签
		column:列名
		property:java类型的属性名
	-->
    <id column="" property=""/>
    <!-- 非主键列,使用result标签 -->
    <result column="" property=""/>
</resultMap>

<!-- 在select标签中使用resultMap属性,其中写id名 -->
<select id="selectById" resultMap="stuMap">
        select * from student where id=#{id}
</select>

注意:

  1. resultType和resultMap不要一起用

  2. 除了使用resultMap来解决列名和属性名不一致的方法,还可以通过sql语句中的as给列名取和属性名相同的别名来解决。

3.5 模糊查询like

在mybatis1中有两种方法:

  1. java代码中指定like的内容(推荐)

    <select id="selectByName" resultType="com.pjh.domain.Student">
            select * from student where name like #{name}
    </select>

    此方法需要提前准备传入的name属性,例如:

    String name = “%李%”

  2. 在mapper文件中拼接like的内容

    <select id="selectByName" resultType="com.pjh.domain.Student">
            select * from student where name like "%" #{name} "%"
    </select>

4 动态sql

sql的内容是变化的,可以根据条件获取到不同的sql语句,主要是where部分发生变化

动态sql的实现,主要使用mybatis提供的标签。

在使用动态sql时,使用java对象作为参数

4.1 <if>标签

if标签通过判断test中的判断结果是否为true,来判断是否将if标签中的sql语句加入

<if test="判断java对象的属性值">
	部分sql语句
</if>

4.2 <where>标签

where标签用来包含多个if的,当多个if有一个成立,where会自动增加一个where关键字,并去掉if中多余的and,or等。

<where>
    <if test="判断java对象的属性值">
		部分sql语句
	</if>
    <if test="判断java对象的属性值">
		部分sql语句
	</if>
</where>

4.3 <foreach>标签

循环java中的数组,list集合,主要用在sql的in语句中。

例如:学生id是1001,1002,1003的三个学生

select * from student where id in (1001,1002,1003)

<foreach collection="" item="" open="" close="" separator="">
	#{}
</foreach>
<!--
	collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
	item:自定义的表示数组和集合成员的变量
	open:循环开始的字符
	close:循环结束的字符
	separator:集合成员之间的分隔符
-->

4.4 代码片段

能够复用一些重复语句

步骤:

  1. 先定义

    <sql id="自定义名称唯一">sql语句,表名,字段等</sql>
  2. 再使用

    <include refid="id的值"/>

5 MyBatis配置文件

5.1 主配置文件,见2.1.7

settings:略

5.2 属性配置文件

把数据库连接信息放到一个单独的文件中。和mybatis主配置文件分开

便于修改,保存,处理多个数据库的信息。

步骤:

  1. 在resources目录中定义一个属性配置文件,xxxx.properties;在属性配置文件中,定义数据,格式是key=value。

    key:一般使用'.'做多级目录的。例如jdbc.mysql.driver,jdbc.driver

  2. 在mybatis的主配置文件,使用<properties>指定文件位置

    在需要使用值的地方,${key}

6 拓展——PageHelper

PageHelper可以便捷的帮你实现数据分页的功能,现已支持包括oricle,mysql在内的多达13种数据库。

安装步骤:

  1. 在pom中添加依赖:

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.10</version>
    </dependency>

    记得加载一下pom

  2. 在mybatis主配置文件中的<environments>之间添加插件

    <plugins>
    	<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
    </plugins>

  3. 在使用时调用PageHelper的静态方法startPage,会自动为你的sql语句加上limit

    @test
    public void testSelectAll() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        //加入PageHelper的方法,分页
        //pageNum表示:第几页P
        //pageSize:一页中有多少数据
        PageHelper.startPage(1,2);
        List<Student> studentList = dao.selectAll();
    
        for(Student stu : studentList) {
            System.out.println(stu);
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值