前言

关于这篇博文?

这一篇博文主要是看完狂神的MyBatis教程之后,结合官网文档写的总结,分为前篇和后篇总共35160+29877,大概有6万多字,对于底层的讲解基本上没有多少,主要都是实际操作,这也是自己第一次学习MyBatis,全文感觉写的还是挺详细基本上每一步操作我都详细的写出来啦,对于新手来说,个人感觉还是挺有帮助的。

关于博文的相关资源?
狂神MyBatis教程官网:官网地址,点击开始学习吧!
MyBatis官网文档:点击查询官方文档吧!
IDEA项目源码,这里面的mybatisdemo02就是前后篇的源码: 提取码:9999,点击进行下载吧!

关于完整的目录?
MyBatis学习前篇
MyBatis学习后篇

关于本篇博客目录:

  • 前言
  • 一.MyBatis
    • 1.1 MyBatis简介
    • 1.2 Mybatis执行过程
    • 1.3 生命周期和作用域
  • 二. 初次使用MyBatis进行编程
    • 2.1 准备工作
      • 2.1.1 创建名为mybatis的数据库
      • 2.1.2 在IDEA中创建项目
    • 2.2 CRUD
      • 2.2.1 SELECT
      • 2.2.2 INSERT
      • 2.2.3 DELETE
      • 2.2.4 UPDATE
    • 2.3 map和模糊查询
      • 2.3.1 map
      • 2.3.2 模糊查询
  • 三. 配置解析
    • 3.1 核心配置文件
      • 3.1.1 属性(properties)
      • 3.1.2 settings(设置)
      • 3.1.3 类型别名(typeAliases)
      • 3.1.4 映射器(mappers)
      • 3.1.5 其他配置
  • 四. Xml映射文件
    • 4.1 ResultMap
      • 4.1.1 实体类和数据库字段名不一致问题
  • 五. 日志
    • 5.1 标准日志工厂
    • 5.2 Log4j
  • 六.分页查询操作
    • 6.1 Limit实现分页
    • 6.2 RowBounds

一.MyBatis

1.1 MyBatis简介


【来源于搜狐百科】:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码手动设置参数以及获取结果 MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。[1]

  • 持久层框架
  • 避免:JDBC 代码,手动设置参数,获取结果
  • 配置和映射原生信息: XML,注解来配置
  • 对应三层架构中的dao层

1.2 Mybatis执行过程

流程图:

从官方文档分析执行过程:mybatis官方文档

官方文档分析:
1.构建 SqlSessionFactory

  • 从 XML 中构建 SqlSessionFactory
  • 不使用 XML 构建 SqlSessionFactory

从 XML 中构建 SqlSessionFactory:
在使用中可以自定义类来创建SqlSessionFactory

SqlSessionFactory 的实例是通过SqlSessionFactoryBuilder 获得

不使用 XML 构建 SqlSessionFactory:
相关信息请查看官方文档进行学习吧:点击跳转,进行学习!

2.从 SqlSessionFactory 中获取 SqlSession

直接通过SqlSessionFactory.openSession()方法进行获取openSession(boolean b) 当参数为true时执行增删改操作时无需提交业务。

public static SqlSession getSqlSession(){return sqlSessionFactory.openSession();
}
//传递一个true,在执行增删改操作的时候就无需在手动提交业务了。
public static SqlSession getSqlSession(boolean b){return sqlSessionFactory.openSession(b);
}

3.通过SqlSession 获取对应的 Mapper
4.通过对应Mapper实现相应业务

注意步骤3,4这里还可以直接通过SqlSession直接进行相应的增删改查操作,但是这种方式不推荐!,这种方式对应流程图中SqlSession直接到结束路线,SqlSession类中具备相应的增删改查,提交事务,回滚事务,等一系列数据库操作。

1.3 生命周期和作用域

生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的并发问题

这里的每一个Mapper对应一个相应的业务。

SqlSessionFactoryBuilder :

  • 一旦创建了SqlSessionFactory,就不再需要它了
  • 局部变量

SqlSessionFactory:

  • 说白了就是可以想象为︰数据库连接池

  • SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例

  • 因此SqlSessionFactory的最佳作用域是应用作用域。

  • 最简单的就是使用单例模式或者静态单例模式。

SqlSession:

  • 连接到连接池的一个请求!
  • SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
  • 用完之后需要赶紧关闭,否则资源被占用!

二. 初次使用MyBatis进行编程

2.1 准备工作

2.1.1 创建名为mybatis的数据库


相应sql语句如下:

drop database if exists mybatis;
use mybatis;
drop table  if exists user_test;
create table user_test
(id int(20) primary key,name varchar(30) ,pwd varchar(30)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user_test(id,name,pwd) value(1,'张三','123456');
insert into user_test(id,name,pwd) value(2,'李四','123456');
insert into user_test(id,name,pwd) value(3,'王五','123456');

2.1.2 在IDEA中创建项目

项目结构如下:【这里我是通过Maven来构建项目】

1:导入jar包依赖

如果不是使用Maven构建项目,可以直接使用MyBatis的jar包进行编程, 只需将 mybatis-x.x.x.jar文件置于类路径(classpath)中即可。

 <!--导入依赖--><dependencies><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--mybatis--><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>

第一个是mysql的依赖,第二个为mybatis的依赖,第三个junit注解的依赖, 常常在pom.xml依赖后面加上如下部分用于项目加载的时候生成后缀为properties,和后缀为xml的文件。

 <build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>

2:mybatis-config.xml数据库配置文件

注意:这里的mappers中的< mapper resource=“dao/user/UserMapper.xml”></ mapper>是指向对应的mapper的xml文件,一定不能缺少该指向。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="dao/user/UserMapper.xml"></mapper></mappers></configuration>

3.utils

从 XML 中构建SqlSessionFactory方式,通过读取mybatis-config.xml的配置信息对SqlSessionFactory进行初始化操作

package utils;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 sqlSessionFactory=null;static {String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}
}

4:pojo存放实体对象User

注意:一定不能少了属性的Set方法!

package com.zhumin.pojo;
public class User {private int id;private String name;private int pwd;public User() {}public User(int id, String name, int pwd) {this.id = id;this.name = name;this.pwd = pwd;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPwd() {return pwd;}public void setPwd(int pwd) {this.pwd = pwd;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", pwd=" + pwd +'}';}
}

5:dao中存放数据访问对象【在dao中发生了巨大的变化,在MyBatis中主要是针对该层进行一些改进】

UserMapper接口,实现相应数据操作的接口
UserMapper.xml为对应接口配置信息,包括接口中各个方法对应的SQL 映射语句,参数类型,返回数据类型等。

2.2 CRUD

2.2.1 SELECT

业务1:通过MyBatis查询user表中所有数据
步骤1:在UserMapper接口编写查询用户数据方法:

public interface UserMapper {List<User> selectUserAll();
}

步骤2:在UserMapper.xml中书写相应实现方法

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="dao.user.UserMapper"><select id="selectUserAll" resultType="pojo.User">select * from user_test;
</select></mapper>

注意:

< mapper namespace=“com.zhumin.dao.user.UserMapper”>这里的namespace必须指向对应的Mapper接口类;<select id=“selectUserAll” 这里的id必须指向对应的Mapper接口类中对应的方法名; resultType=“com.zhumin.pojo.User”,这里写明对应的方法访问的数据类型【这里就是该List中的泛型类型】。

步骤3:查询所有数据
在Test文件下创建DemoTest的测试类

最好像官方文档那样:

运行效果:

2.2.2 INSERT

业务2:向User表中添加一条数据
步骤1:在UserMapper接口编写添加用户方法:

步骤2:在UserMapper.xml中书写相应实现方法

注意:这里parameterType就是指向的参数类型,这里的#{id},#{name},#{pwd}指向的就是User下面的id,name,pwd


步骤3:在Test文件下DemoTest测试类下创建一个addUserTest测试方法

注意:要在方法前面加@Test才行,这里@Test就是junit依赖的使用,这样就可以直接对该方法进行测试。

运行效果:

但是当你查询数据库的时候会发现,其实并没有将数据写入到数据库中,因为在Mybatis中对数据库进行,增,删,改操作需要进行提交事务

其实还可以这样【就无需直接写提交代码了】
在utils中给getSqlSession,传递一个布尔值,再将这个布尔值传递给openSession如果传递为true,就无需提交:



2.2.3 DELETE

业务3:删除一天id名为4的用户
步骤1:在UserMapper接口编写删除用户方法:

步骤2:在UserMapper.xml中书写相应实现方法

步骤3:编写测试方法进行测试

运行效果:

2.2.4 UPDATE

业务4:更改李四的密码为654321
步骤1:在UserMapper接口编写更改用户方法

步骤2:在UserMapper.xml中书写相应实现方法

步骤3:编写测试方法进行测试

运行效果:

2.3 map和模糊查询

2.3.1 map

如果在执行一个方法时,该方法有多个参数,并且多个参数并不是一个实体对象时,考虑使用map对象,进行传参。

业务1:同时删除用户id为3和4的对象
步骤1:在UserMapper接口编写同时删除用户方法:

步骤2:在UserMapper.xml中书写相应实现方法

注意:parameterType的值为map,这个**#{属性名}**的属性名可以自己定义,无需关心实体对象中的属性名,然后通过map直接对对应的属性名进行赋值即可。


步骤3:编写测试方法进行测试


运行效果:

补充:返回值类型也可考虑使用map
业务:通过id查询对应用户的信息
步骤1:在UserMapp接口中编写对应的查询方法,这里该方法的返回值类型为Map<String,String>

步骤2:在UserMapper.xml中编写对应的SQL语句:

步骤3:在测试类中编写对应的测试方法:

运行效果:

2.3.2 模糊查询

业务2:查询用户中包含李的用户
先向数据库添加一个用户名李小明的用户,方便观察数据。

步骤1:在UserMapper接口编写模糊查询用户方法

步骤2:在UserMapper.xml中书写相应实现方法

步骤3:编写测试方法进行测试

运行效果:

其实还可以通过字符串拼接的方式实现,在UserMapper.xml中sql语句如下

    <select id="selectUserCondition"  resultType="pojo.User">select * from user_test  where name like "%"#{value}"%";</select>

测试端只需要传输一个要包含的字符即可

但是这种方式避免不了SQL注入,比如当测试端传递字符为%时就可以查询出所有的用户信息

运行效果:

三. 配置解析

3.1 核心配置文件

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

从前面的小Demo可以看出,我们的MyBatis的配置都是存放在mybatis-config.xml中

注意:这里一定要注意每个标签的顺序,如果顺序不对会报错

3.1.1 属性(properties)

在mybaits-config.xml中的propertie主要是数据库连接的一些参数,比如使用什么数据库,数据库连接url,数据库的账号,密码等…


properties就是propertie的集合,可以定义在外面,dataSource中propertie的**${“name”}**这里的name就是对应properties下propertie的name对应的value值.

properties下的 resource="db.properties"属性可以通过外部文件进行赋值,这样就可以实现动态修改,这里的db.properties和三层架构中的db.properties没有任何区别。

如果properties下既有resource="db.properties"又有propertie的话优先使用properties下的propertie.

在官方文档中还提到了第三种方式,就是直接给SqlSessionFactoryBuilder().build(传入参数);进行传参。


这三种方式的优先级官方也说得非常的明确:

  • 首先读取在 properties 元素体内指定的属性。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

3.1.2 settings(设置)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。【下图来源于点击跳转查看】

一个配置完整的 settings 元素的示例如下【在实际的应用种根据自己的需求进行配置】:

<settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="multipleResultSetsEnabled" value="true"/><setting name="useColumnLabel" value="true"/><setting name="useGeneratedKeys" value="false"/><setting name="autoMappingBehavior" value="PARTIAL"/><setting name="autoMappingUnknownColumnBehavior" value="WARNING"/><setting name="defaultExecutorType" value="SIMPLE"/><setting name="defaultStatementTimeout" value="25"/><setting name="defaultFetchSize" value="100"/><setting name="safeRowBoundsEnabled" value="false"/><setting name="mapUnderscoreToCamelCase" value="false"/><setting name="localCacheScope" value="SESSION"/><setting name="jdbcTypeForNull" value="OTHER"/><setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

3.1.3 类型别名(typeAliases)

作用:

  • 类型别名可为 Java 类型设置一个缩写名字
  • 降低冗余的全限定类名书写

使用别名的方式:
方式一:

 <typeAliases><typeAlias type="pojo.User" alias="user"/></typeAliases>


没有使用别名之前:

使用别名之后:

方式二:

  <typeAliases><package name="pojo"/></typeAliases>

这种方式直接扫描包名,别名为对应类类名,官方建议使用该类的首字母小写
【官方解释:在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名】

方式一可以使用自己定义的别名,而方式二在不使用注解的情况下是不能自己定义别名的。

方式二使用注解:
在对应的实体类上方,加@Alias(“别名”)

配置里使用方式二:

对应的使用该别名即可

下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格

  • 基本数据类型别名:基本数据类型类名前加 "_"
  • 包装类别名:基本数据类型类名
  • 其他类型别名该类首字母小写类名

对于前面parameterType=“对应数据类型的别名” resultType=“对应数据类型的别名” 的值为对应类型的别名。

3.1.4 映射器(mappers)

在配置文件中有一个mappers标签:

当没有该mappers标签时运行程序:

这时就会出现一个异常,异常大概意思就是UserMapper是一个未知的没有注册的Mapper;这里MapperRegistry大概意思就是注册绑定Mapper文件【这里的Mapper文件就是前面Demo中Dao层所包含的文件】


mappers标签的作用:
官方文档其实已说得非常明确了:
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。

定义方式:

  • 方式一:使用相对于类路径的资源引用

  • 方式二:使用完全限定资源定位符(URL)【不推荐使用】

<!-- 使用完全限定资源定位符(URL) -->
<mappers><mapper url="file:///var/mappers/AuthorMapper.xml"/><mapper url="file:///var/mappers/BlogMapper.xml"/><mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
  • 方式三:使用映射器接口实现类的完全限定类名

  • 方式四:将包内的映射器接口实现全部注册为映射器

    方式三和四需要注意:

  • 接口和他的Mapper配置文件必须同名

  • 接口和他的Mapper配置文件必须在同一个包下

3.1.5 其他配置

其他配置使用较少,相关学习参照官方文档
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
常使用的插件:

  • mybatis-generator-core

  • mybatis-plus

  • 通用mapper
    数据库厂商标识(databaseIdProvider)

四. Xml映射文件

4.1 ResultMap

详细信息见官方文档:结果映射

4.1.1 实体类和数据库字段名不一致问题

运行DemoTest.main()

运行效果:

将实体类中pwd字段名修改为password,并修改相应的get,set方法【这样实体类的password字段名就和数据库中的pwd不一致了】

然后运行DemoTest.main():

实体类和数据库中对应字段名不一致,将无法获取该字段在数据库中的值,其实也很容易理解,在数据库中查出的pwd字段是有值的,但是对应的实体类中没有pwd,并且类构造器也不知道password就是pwd,所以password字段使用默认值就是0。

解决方案:

  • 取别名
  • ResultMap

1.取别名
在sql中给pwd取一个别名为password



运行DemoTest.main():

2.ResultMap
将resultType删掉使用resultMap


对应创建一个id为user_resultMap的结果集映射:

运行DemoTest.main():

五. 日志

详细信息见官方文档:日志

5.1 标准日志工厂

1.在mybatis-config.xml中配置日志为STDOUT_LOGGING的实现
value可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING【标准日志工厂】、NO_LOGGING


2.在测试类中运行DemoTest.main()
使用标准日志工厂,就无需再导包,就可以直接使用:

5.2 Log4j

什么是Log4j来自搜狗百科?

  • Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等
  • 我们也可以控制每一条日志的输出格式
  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
  • 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

业务:在项目中通过log4j实现简单的日志功能。
步骤 1:添加 Log4J 的 jar 包
由于我们使用的是 Log4J,我们要确保它的 jar 包可以被应用使用。为此,需要将 jar 包添加到应用的类路径中。Log4J 的 jar 包下载地址点击下载!。
对于 web 应用或企业级应用,你可以将 log4j.jar 添加到 WEB-INF/lib 目录下;对于独立应用,可以将它添加到 JVM 的 -classpath 启动参数中。
这里我是用Maven方式进行导包:Maven地址:

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

步骤 2:配置 Log4J
1.在mybatis-config.xml中配置日志为Log4J的实现

2.在应用的类路径中创建一个名为log4j.properties 的文件(使用xml也可以但是properties更常用),文件的具体内容如下:

比较干净的 log4j.properties 配置:

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/zhu.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

相关配置的讲解我随便在网上找了一篇CSDN博客:来源于博主iceburg-blogs的Log4j框架配置文件log4j.properties配置使用详解

3.Log4j的使用
直接测试使用,在测试类中运行DemoTest.main()

其实你细心一点会发现项目结构中会多一个log文件,该文件下有一个zhu.log的日志,该日志里面存放日志信息

这是因为在log4j.properties中我们设置了文件输出

简单使用:
步骤1:创建一个名log4jUtils的工具类

步骤2:在测试类中编写测试方法进行测试

运行效果:

zhu.log中内容:

六.分页查询操作

使用分页的原因:

  • 当你数据库查询记录有几万、几十万时使用limit查询效率非常快
  • 减少数据处理量

分页方式:

  • Limit实现分页
  • RowBounds分页

6.1 Limit实现分页

1.SQL语句中的LIMIT
Limit实现分页操作,是通过SQL语句进行分页操作

select * from Customer LIMIT 10;--检索前10行数据,显示1-10条数据
select * from Customer LIMIT 0,10;--检索从第1行开始,累加10条id记录,共显示id为1....10
select * from Customer LIMIT 1,10;--检索从第2行开始,累加10条id记录,共显示id为2....11

2.在接口类中编写分页查询方法

3.编写UserMapper.xml

4.在测试类中编写对应的测试方法进行测试

运行结果:

6.2 RowBounds

RowBounds实现分页操作,在实际开发中并不是很推荐,这里知道怎么使用即可 。
1.在接口类中编写分页查询方法

3.编写UserMapper.xml

4.在测试类中编写对应的测试方法进行测试
注意这里没有通过获取UserMapper再调用相应方法的方式,而是直接通过sqlSession下的SelectList方法进行数据库查询操作,这种方式也可以查询数据但是并不推荐。

其实跳转【鼠标移动到该类上,按ctrl+鼠标左键】到Sqlsession类中会发现,里面包括相应的查询,添加,删除,修改等操作。


观察selectList方法可以看出,有一个参数RowBounds,这里就是通过RowBounds这个参数进行分类操作

 <E> List<E> selectList(String var1, Object var2, RowBounds var3);

5.RowBounds类
当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数

select * from user_test LIMIT 3 OFFSET 1;

查询结果:
跳过一条数据,跳过id为1的数据,取三条数据:

初始化RowBounds中这二个参数即可

关于RowBounds的原理可以查看CSDN博主归田的博文Mybatis逻辑分页原理解析RowBounds


MyBatis前篇学完看看后篇吧!
MyBatis学习后篇

MyBatis学习前篇相关推荐

  1. 图像处理学习--前篇--像素相关

    部分内容转自:作者:jasonhehee 链接:https://www.jianshu.com/p/b2d92032a9c3 PPI (Pixels per inch) 每英寸像素数量,是像素密度的测 ...

  2. ant的下载与安装——mybatis学习笔记之预备篇(一)

    看到这个标题是不是觉得有点奇怪呢--不是说mybatis学习笔记吗,怎么扯到ant了?先别急,请容我慢慢道来. mybatis是另外一个优秀的ORM框架.考虑到以后可能会用到它,遂决定提前学习,以备不 ...

  3. 【应用篇】MyBatis学习笔记

    MyBatis学习笔记 一 环境配置 1 什么是MyBatis? ​ MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参 ...

  4. MyBatis学习笔记(1)—使用篇

    MyBatis学习笔记(1)-使用篇 MyBatis学习笔记(2)-映射关系篇 MyBatis学习笔记(3)-高级映射之一对一映射 Mybatis学习笔记(4)-高级映射之一对多映射 Mybatis学 ...

  5. mybatis学习指南--xml文件方式篇

    mybatis学习指南---xml文件篇 以下内容是由我总结mybatis官方文档和实践中的一些经验,总共分为四篇:xml文件配置篇,java方式配置篇,缓存篇,其他配置篇,第一次这样正式的写一篇文章 ...

  6. 【初学者技术修炼】毕业生初学者学习前后端技术路线图

    [初学者技术修炼]毕业生初学者学习前后端技术路线图 1 序 2 路线图 2.1 搭建可交互的前端WEB界面路线图 2.1.1 静态页面构造 2.1.2 JavaScript学习 2.1.3 低代码平台 ...

  7. mybatis学习笔记(13)-延迟加载

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(13)-延迟加载 标签: mybatis [TOC] resultMap可以实现高级映射(使用asso ...

  8. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  9. MyBatis学习--简单的增删改查

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 1 Public static void main(String[] arg ...

  10. 深度学习实战篇-基于RNN的中文分词探索

    深度学习实战篇-基于RNN的中文分词探索 近年来,深度学习在人工智能的多个领域取得了显著成绩.微软使用的152层深度神经网络在ImageNet的比赛上斩获多项第一,同时在图像识别中超过了人类的识别水平 ...

最新文章

  1. 交替最小二乘+ALS+推荐+Spark
  2. synchronous_commit 参数的再次说明
  3. Mahout快速入门教程
  4. 【转】多线程之有状态对象和无状态对象
  5. 调整标志位方法oracle,面试题(二)(示例代码)
  6. ADB投屏_最强开源投屏神器,跨平台电脑控制+文件传输——scrcpy
  7. Python 正则表达式re模块的使用
  8. [Linux] LD_LIBRARY_PATH
  9. 佳能102种相片风格_一位妈妈用蔬菜水果等,为女儿拍了一组相片,没想到在INS火了...
  10. python操作日期和时间的方法
  11. layer弹窗弹出位置不在浏览器窗口居中的问题的解决方法
  12. linux模拟lcd显示文字,求助 armlinux中实现lcd显示
  13. 图片调整大小后变得不清晰了怎么办?
  14. Python办公自动化实战 01 | Python优势与自动化思维让你的工作化繁为简
  15. 智慧园区数据可视化大屏的优势分析
  16. obj-c中Autorelease、属相定义Property、对象的操作
  17. 自定义Maven Archetype模板工程
  18. 渗透之——Metasploit渗透BSPlayer V2.68
  19. vue常用主流插件排名!
  20. php readfile,使用php readfile确定成功下载

热门文章

  1. ZStack实践汇 | 快照和备份的区别
  2. crt 生成pem_如何将.pem转换为.crt和.key?
  3. 【车辆计数】基于matlab形态学停车场车辆计数【含Matlab源码 628期】
  4. SPSS制作三线表【SPSS 013期】
  5. java mongodb 读取文件_Java操作Mongodb之文件读写
  6. ansys电力变压器模型_最佳变压器模型的超参数优化
  7. 自动化生产线认知_什么是认知自动化?
  8. 二重指针、二维数组及二者如何进行赋值
  9. vs中readfile的作用_脚本中和在解释器中使用 fs.readFile() 得到不同的结果
  10. python输出欢迎某某某_Python基础中所出现的异常报错总结,python基础总结