0%

(十)MyBatis学习笔记-扩展

1. PageHelper分页插件

PageHelper是Mybatis通用的分页插件,更加详细地用法参考官方文档

下面演示一下该插件的一些功能的用法。

1.1 步骤

  1. 先导入需要的Jar包,可以在官方文档地址处下载。
    在这里插入图片描述

  2. 在全局配置文件中,配置插件。
    在这里插入图片描述

  3. 演示PageHelper类代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    @Test
    public void test() throws IOException {
    //1.根据MyBatis的配置文件,即mybatis-config.xml创建SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    //2.获取session实例,能直接执行*已经映射的SQL语句*
    SqlSession session = sqlSessionFactory.openSession();
    try {
    //3.获取接口的实现类对象
    EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
    //第一个参数为页码,第二个参数为每页显示的数量
    Page<Object> page = PageHelper.startPage(1, 4);
    //查询获取所有的员工对象
    List<Employee> emps = mapper.getAllEmps();
    //输出所有员工的数据
    for (Employee emp : emps) {
    System.out.println(emp);
    }
    //获取全部查询的员工数据数量
    long total = page.getTotal();
    System.out.println("员工数据数量:" + total);
    //获取所有页码数量
    int pages = page.getPages();
    System.out.println("所有页码数量" + pages);

    int pageSize = page.getPageSize();
    System.out.println("每页大小:" + pageSize);
    int pageNum = page.getPageNum();
    System.out.println("当前页号:" + pageNum);
    int startRow = page.getStartRow();//从0开始算
    System.out.println("当前页的开始行号:" + startRow);
    } finally {
    //4.关闭会话session
    session.close();
    }
    }

    public SqlSessionFactory getSqlSessionFactory() throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    return sqlSessionFactory;
    }

    注意:PageHelper的调用需要在查询数据库之前,否则不会分页显示数据的。

  4. 演示PageInfo类代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    @Test
    public void test() throws IOException {
    //1.根据MyBatis的配置文件,即mybatis-config.xml创建SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    //2.获取session实例,能直接执行*已经映射的SQL语句*
    SqlSession session = sqlSessionFactory.openSession();
    try {
    //3.获取接口的实现类对象
    EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
    PageHelper.startPage(4, 1);//分页
    //查询获取所有的员工对象
    List<Employee> emps = mapper.getAllEmps();
    //输出所有员工的数据
    for (Employee emp : emps) {
    System.out.println(emp);
    }

    // PageInfo<Employee> pageInfo = new PageInfo<>(emps);
    //第二个参数为页码,表示要连续显示几页
    PageInfo<Employee> pageInfo = new PageInfo<>(emps,4);
    int[] navigatepageNums = pageInfo.getNavigatepageNums();
    System.out.println("连续显示的页码:");
    for (int i : navigatepageNums) {
    System.out.print(i + " ");
    }
    System.out.println();
    //获取所有页码数量
    int pages = pageInfo.getPages();
    System.out.println("所有页码数量:" + pages);

    int pageSize = pageInfo.getPageSize();
    System.out.println("每页大小:" + pageSize);
    int pageNum = pageInfo.getPageNum();
    System.out.println("当前页号:" + pageNum);
    int startRow = pageInfo.getStartRow();//从0开始算
    System.out.println("当前页的开始行号:" + startRow);
    boolean isFirstPage = pageInfo.isIsFirstPage();
    System.out.println("是否为第一页:" + isFirstPage);
    long total = pageInfo.getTotal();
    System.out.println("员工数据总数量:" + total);
    } finally {
    //4.关闭会话session
    session.close();
    }
    }

    运行结果:
    在这里插入图片描述

    2. 批量操作

    之前我们执行批量插入的时候,通常调用数据库进行如下的SQL语句格式的操作:

    1
    2
    1. insert into 表名 values(xxx,xxx,xxx),values(xxx,xxx,xxx),...
    2. insert into 表名 values(xxx,xxx,xxx);insert into 表名 values(xxx,xxx,xxx);

但是以上的做法可能形成冗长的SQL语句,从而超出数据库的限制,下面我们可以通过设置BatchExector配置的形式来处理。

假如映射器定义有如下方法:

1
2
//增加员工方法
public void addEmp(Employee emp);

对应的映射器文件配置如下:

1
2
3
<insert id="addEmp" useGeneratedKeys="true" keyProperty="id">
insert into tbl_employee(last_name,gender,email) values(#{lastName},#{gender},#{email})
</insert>

测试代码如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
如果我们改用之前的sqlSession对象,也就是通过如下语句获取创建的:

1
SqlSession session = sqlSessionFactory.openSession(false);

其运行结果如下所示:
在这里插入图片描述
从以上两次运行结果可以明显得知,使用ExectorType.BATCH配置来执行批量插入耗时更短,它只预编译一次并执行一次SQL语句。而原本的方式则每次都会预编译一次SQL语句,并且每次都会执行一次SQL语句,也就说我每插入100条数据,数据库就会执行100百次SQL语句。显然,这是不可取的。

------ 本文结束------