前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot整合MVC Mybatis plus 最全thymeleaf讲解(保姆级讲解,带Java代码案例讲解)

SpringBoot整合MVC Mybatis plus 最全thymeleaf讲解(保姆级讲解,带Java代码案例讲解)

作者头像
CaesarChang张旭
发布2021-01-26 15:11:20
1.1K0
发布2021-01-26 15:11:20
举报
文章被收录于专栏:悟道悟道

1.整合SpringMVC

上篇文章https://blog.csdn.net/weixin_45434902/article/details/109577471已经能实现mvc自动配置,这里我们主要解决以下3个问题 修改端口 静态资源 拦截器配置

修改端口 查看 SpringBoot 的全局属性可知,端口通过以下方式配置: # 映射端口 server.port = 80 重启服务

访问静态资源

ResourceProperties 的类,里面就定义了静态资源的默认查找路径:

默认的静态资源路径为: classpath:/META-INF/resources/ 或者 classpath:/resources/ 或者 classpath:/static/ 或者 classpath:/public 或者 只要静态资源放在这些目录中任何一个, SpringMVC 都会帮我们处理。 我们习惯会把静态资源放在 classpath:/static/ 目录下。

添加拦截器:

1 首先写一个类来 implements HandlerInterceptor,重写里面的 prehandle posthandle afterhandle 方法

2 通过实现 WebMvcConfigurer ,然后重写接口中的addInterceptors方法,添加自定义拦截器 并添加 @Configuration 注解来实现自定义部分SpringMvc配置:

路径匹配通配符 ‘?’ 匹配任何单字符 ‘*’ 匹配 0 或者任意数量的字符 (只是一层,/test1/* 比如test1/test.html 可以拦截 ,但是/test1/test2/test3.html不可以拦截 ‘/**’ 匹配 0 或者更多的目录(可以多层拦截)

你会发现日志中什么都没有,因为我们记录的log级别是debug,默认是显示info以上

SpringBoot 通过 logging.level.*=debug 来配置日志级别, * 填写包名 # 设置 com.lxs 包的日志级别为 debug logging.level.com.lxs = debug

2.整合jdbc

引入依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>

当然, 不要忘了数据库驱动 , SpringBoot 并不知道我们用的什么数据库,这里我们选择 MySQL :

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> 配置连接池

其实,在刚才引入 jdbc 启动器的时候, SpringBoot已经自动帮我们引入了一个连接池: HikariCP

目前速度最快的连接池了,我们看看它与 c3p0 的对比: 因此,我们只需要指定连接池参数即可:

# 连接四大参数 spring.datasource.url = jdbc : mysql : //localhost : 3306/ spring.datasource.username = root spring.datasource.password = root # 可省略, SpringBoot 自动推断 spring.datasource.driverClassName = com.mysql.jdbc.Driver spring.datasource.hikari.idle-timeout = 60000 spring.datasource.hikari.maximum-pool-size = 30 spring.datasource.hikari.minimum-idle = 10

示例:

1 建立实体类(比如User类) 2 建立dao ,UserDao类 ,JDBC的不用实现类,直接就 用jdbcTemplate就可以

3.整合mybatis

mybatis

SpringBoot 官方并没有提供 Mybatis 的启动器,不过 Mybatis 官网 自己实现了:

<!--mybatis --> <dependency> <groupId> org.mybatis.spring.boot </groupId> <artifactId> mybatis-spring-boot-starter </artifactId> <version> 1.3.2 </version> </dependency>

配置

# mybatis 别名扫描 mybatis.type-aliases-package = com.zx.dao # mapper.xml 文件位置 , 如果没有映射文件,请注释掉 mybatis.mapper-locations = classpath :/ mappers/*.xml

示例:

1 建立实体类(比如User类) 2 建立dao ,UserDao接口

3配置映射文件 (在resource下的mappers 建立UserDaoMapper)

4加载mapper的接口代理对象(两种 推荐第二种) 第一种:使用@Mapper注解(不推荐) 需要注意,这里没有配置 mapper 接口扫描包,因此我们需要给每一个 Mapper 接口添加 @Mapper 注解,才能被识 别。

第二种 在启动类上面 设置 MapperScan, 注解扫描的包 ( 推荐 ) @MapperScan("dao 所在的包 ") ,自动搜索包中的接口,产生 dao 的代理对象

4 整合通用:mybatis(tk mybatis)

概念

使用 Mybatis 时,最大的问题是,要写大量的重复 SQL 语句在 xml 文件中,除了特殊的业务逻辑 SQL 语句之外,还有 大量结构类似的增删改查 SQL 。而且,当数据库表结构改动时,对应的所有 SQL 以及实体类都需要更改。这大量增 加了程序员的负担。避免重复书写 CRUD 映射的框架有两个

1 mybatis plus ,通能更加强大,后面实战项目中讲解 2 通用mybatis( tk mybatis )

通用Mapper的作者也为自己的插件编写了启动器,我们直接引入即可:

<!-- 通用 mapper --> <dependency> <groupId> tk.mybatis </groupId> <artifactId> mapper-spring-boot-starter </artifactId> <version> 2.0.2 </version> </dependency>

tk mybatis 实体类使用的注解是jpa注解 @Table(name = "tb_user") public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 用户名 private String userName; ......... 注意事项: 1. 默认表名 = 类名,字段名 = 属性名 2. 表名可以使用 @Table(name = "tableName") 进行指定 3. @Column(name = "fieldName") 指定 4. 使用 @Transient 注解表示跟字段不进行映射

不需要做任何配置就可以使用了。 @Mapper public interface UserMapper extends tk.mybatis.mapper.common.Mapper<User>{ public List<User> findByUser(User user); }

自定义映射文件 映射复杂方法 resources/mappers/UserMapper.xml <?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="com.lxs.demo.dao.UserMapper"> <select id="findByUser" resultType="user"> SELECT * FROM tb_user <where> <if test="name != null"> name like '%${name}%' </if><if test="note != null"> and note like '%${note}%' </if> </where> </select> </mapper> 一旦继承了 Mapper , 继承的Mapper就拥有了Mapper所有的通用方法: Select 方法: List<T> select(T record) ; 说明:根据实体中的属性值进行查询,查询条件使用等号 方法: T selectByPrimaryKey(Object key) ; 说明:根据主键字段进行查询,方法参数必须包含完整的主键属性, 查询条件使用等号 方法: List<T> selectAll() ; 说明:查询全部结果, select(null) 方法能达到同样的效果 方法: T selectOne(T record) ; 说明:根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异 常,查询条件使用等号 方法: int selectCount(T record) ; 说明:根据实体中的属性查询总数,查询条件使用等号 Insert 方法: int insert(T record) ; 说明:保存一个实体, null 的属性也会保存,不会使用数据库默认值 方法: int insertSelective(T record) ; 说明:保存一个实体, null 的属性不会保存,会使用数据库默认值 Update 方法: int updateByPrimaryKey(T record) ; 说明:根据主键更新实体全部字段, null 值会被更新 方法: int updateByPrimaryKeySelective(T record) ; 说明:根据主键更新属性不为 null 的值 Delete 方法: int delete(T record) ; 说明:根据实体属性作为条件进行删除,查询条件使用等号 方法: int deleteByPrimaryKey(Object key) ; 说明:根据主键字段进行删除,方法参数必须包含完整的主键属性 Example 方法 方法: List<T> selectByExample(Object example) ; 说明:根据 Example 条件进行查询 重点:这 个查询支持通过 Example 类指定查询列,通过 selectProperties 方法指定查询列 方法: int selectCountByExample(Object example) ; 说明:根据 Example 条件进行查询总数 方法: int updateByExample(@Param("record") T record, @Param("example") Object example) ; 说明:根据 Example 条件更新实体 record 包含的全部属性, null 值会被更新 方法: int updateByExampleSelective(@Param("record") T record, @Param("example") Object example) ; 说 明:根据 Example 条件更新实体 record 包含的不是 null 的属性值 方法: int deleteByExample(Object example) ; 说明:根据 Example 条件删除数据

注意要把MapperScan类改成tk-mybatis构件的类import tk.mybatis.spring.annotation.MapperScan; @SpringBootApplication @EnableConfigurationProperties @MapperScan ("com.lxs.demo.dao") public class Application {

示例测试:

@RunWith(SpringRunner.class) @SpringBootTest public class UserDaoTest { @Autowired private UserDao userDao; @Test public void testFindByUser() { User condition = new User(); condition.setName("a"); List<User> list = userMapper.findByUser(condition); for (User user : list) { System.out.println(user); } } @Test public void testFindAll() { List<User> list = userDao.selectAll(); for (User user : list) { System.out.println(user); } } @Test public void testFindById() { User user = userDao.selectByPrimaryKey(4); System.out.println(user); } @Test public void testFindByExample() { Example example = new Example(User.class); example.createCriteria().andLike("name", "%a%"); userMapper.selectByExample(example).forEach(user -> { System.out.println(user); }); }@Test public void testInsert() { User user = new User(); user.setAge(18); user.setBirthday(new Date()); user.setCreated(new Date()); user.setName("周星驰"); userDao.insert(user); }

5.Thymeleaf

概念

Thymeleaf 是一个跟 FreeMarker 类似的模板引擎,它可以完全替代 JSP 。

特 点:

1 动静结合: Thymeleaf 在有网络和无网络的环境下皆可运行,无网络显示静态内容,有网络用后台得到数据 替换静态内容 2 SpringBoot 完美整合, springboot 默认整合 thymeleaf

直接引入启动器:

<dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-thymeleaf </artifactId> </dependency>

5.1 入门案例 编写接口 编写 UserService ,调用 UserMapper 的查询所有方法

@Service public class UserService { @Autowired private UserDao userDao; public List<User> queryAll() { return this.userDao.selectAll(); } } 编写一个controller,返回一些用户数据,放入模型中,等会在页面渲染 编写一个controller,返回一些用户数 据,放入模型中,等会在页面渲染 @Controller public class UserController { @Autowired private UserService userService; @RequestMapping("/all") public String all(Model model) { List<User> list = userService.findAll(); model.addAttribute("users", list); // 返回模板名称(就是classpath:/templates/目录下的html文件名) return "users"; } }

SpringBoot 会自动为 Thymeleaf 注册一个视图解析器:

, Thymeleaf 也会根据前缀和后缀来确定模板文件的位置:

模板默认放在classpath下的templates文件夹,我们新建一个html文件放入其中:

5.2 thymeleaf页面:

把 html 的名称空间,改成: xmlns:th="http://www.thymeleaf.org" 会有语法提示(th: XX)

${} :这个类似与 el 表达式,但其实是 ognl 的语法,比 el 表达式更加强大 th- 指令: th- 是利用了Html5中的自定义属性来实现的。如果不支持H5,可以用 data-th- 来代替 th:each :类似于 c:foreach 遍历集合,但是语法更加简洁 th:text :声明标签中的文本 例如 <td th - text='${user.id}'>1</td> ,如果 user.id 有值,会覆盖默认的 1 如果没有值,则会显示 td 中默认的 1 。这正是 thymeleaf 能够动静结合的原因,模板解析失败不影响 页面的显示效果,因为会显示默认值!

5.3模板缓存

Thymeleaf会在第一次对模板解析之后进行缓存,极大的提高了并发处理能力。但是这给我们开发带来了不便,修 改页面后并不会立刻看到效果,我们开发阶段可以关掉缓存使用: # 开发阶段关闭 thymeleaf 的模板缓存 spring.thymeleaf.cache = false 关闭了 就可以使用点击 ?锤子标志 进行重新编译,页面就会变化,不用重启启动器

6 thymeleaf详解

表达式 它们分为三类 1. 变量表达式 2. 星号表达式 3. URL表达式

1 变量表达式 : $ { session . user . name } 它们将以 HTML 标签的一个属性来表示: <h5> 表达式 </h5> <span>${text}</span> <span th:text="${text}"> 你好 thymleaf</span>

2 星号表达式 选择表达式很像变量表达式,不过它们用一个预先选择的对象来代替上下文变量容器 (map) 来执行,如下: * {customer.name} 被指定的 object 由 th:object 属性定义: <tr th:each="user : <td th:text="${user.id}">1</td> <td th:text="*{name}"> 张三 </td> <td th:text="*{userName}">zhangsan</td>

3URL表达式 URL 表达式指的是把一个有用的上下文或回话信息添加到 URL ,这个过程经常被叫做 URL 重写。 @{/order/list} URL 还可以设置参数: @{/order/details(id=${orderId}, name=*{name})} 相对路径: @{../documents/report} 让我们看这些表达式: <form th:action="@{/createOrder}"> <a href="main.html" th:href="@{/main}"> url 表达式 <a th:href="@{/delete(id=${user.id}, userName=*{userName})}">删除</a> 文本替换(两个竖线||) <a th:href="| /update/${user.id} |"> 修改 </a> 字符串拼接('/XX/'+${XXX}) <a th:href="'/approve/' + ${user.id}"> 审核 </a>

表达式常见用法 字面( Literals ) 文本文字( Text literals ) : 'one text', 'Another one!',… 数字文本( Number literals ) : 0, 34, 3.0, 12.3,… 布尔文本( Boolean literals ) : true, false 空( Null literal ) : null 文字标记( Literal tokens ) : one, sometext, main,… 文本操作( Text operations ) 字符串连接 (String concatenation): + 文本替换(Literal substitutions): |The name is ${name}| 算术运算( Arithmetic operations ) 二元运算符( Binary operators ) : +, - , *, /, % 减号(单目运算符) Minus sign (unary operator): - 布尔操作( Boolean operations ) 二元运算符(Binary operators): and, or 布尔否定(一元运算符): !, not 比较和等价 (Comparisons and equality) 比较( Comparators ) : >, <, >=, <= (gt, lt, ge, le) 等值运算符( Equality operators ) : ==, != (eq, ne) 条件运算符( Conditional operators ) If-then: (if) ? (then) If-then-else: (if) ? (then) : (else) Default: (value) ?: (defaultvalue)

常用th标签:

基本用法

1. 赋值、字符串拼接 字符串拼接还有另外一种简洁的写法 <a th:href="|/update/${user.id}|"> 修改 </a> <a th:href="'/approve/' + ${user.id}"> 审核 </a>

2. 条件判断 If/Unless

Thymeleaf 中使用 th:if和th:unless 属性进行条件判断,下面的例子中, <a> 标签只有在 th:if 中条件成立时才显 示:

<h5>if 指令 </h5> <a th:if="${users.size() > 0}"> 查询结果存在 </a><br> <a th:if="${users.size() <= 0}"> 查询结果不存在 </a><br> <a th:unless="${session.user != null}" href="#"> 登录 </a><br> th:unless 于 th:if 恰好相反,只有表达式中的条件不成立,才会显示其内容。 也可以使用 (if) ? (then) : (else) 这种语法来判断显示的内容

3. for 循环

<tr th:each="user, status : ${users}" th:object="${user}" th:class="${status.even} ? 'grey'"> <td th:text="${status.even}"></td> <td th:text="${user.id}">1</td> <td th:text="*{name}"> 张三 </td> <td th:text="*{userName}">zhangsan</td> <td th:text="${user.age}">20</td> <td th:text="${user.sex} == 1 ? ' 男 ' : ' 女 '"> 男 </td> <td th:text="${#dates.format(user.birthday, 'yyyy-MM-dd')}">1980-02-30</td> <td th:text="${user.note}">1</td> </tr> status 称作状态变量, 属性有: index: 当前迭代对象的 index (从 0 开始计算) count: 当前迭代对象的 index( 从 1 开始计算 ) size: 被迭代对象的大小 current: 当前迭代变量 even/odd: 布尔值,当前循环是否是偶数 / 奇数(从 0 开始计算) first: 布尔值,当前循环是否是第一个 last: 布尔值,当前循环是否是最后一个

4. 内联文本

内联文本: [[…]] 内联文本的表示方式,使用时,必须先用 th:inline=”text/javascript/none” 激活, <h5> 内联文本 </h5> <div> <h6 th:inline="text">[[${text}]]</h6> <h6 th:inline="none">[[${text}]]</h6> <h6>[[${text}]]</h6> </div> 原则能用指令就用 th 指令

5. 内联 js

内联文本: [[…]] 内联文本的表示方式,使用时,必须先用 th:inline=”text/javascript/none” 激活, th:inline 可以在 父级标签内使用,甚至作为 body 的标签。内联文本尽管比 th:text 的代码少,不利于原型显示。 <h5> 内联 js</h5> <script th:inline="javascript"> var text = '[[${text}]]'; alert(text); </script>

6. 内嵌变量

为了模板更加易用, Thymeleaf 还提供了一系列 Utility 对象(内置于 Context 中),可以通过 # 直接访问: 使用+# dates : java.util.Date** 的功能方法类。 calendars : 类似 #dates ,面向 java.util.Calendar numbers : 格式化数字的功能方法类 strings : 字符串对象的功能类, contains,startWiths,prepending/appending 等等。 objects: 对 objects 的功能类操作。 bools: 对布尔值求值的功能方法。 arrays : 对数组的功能类方法。 lists: 对 lists 功能类方法 sets maps

下面用一段代码来举例一些常用的方法: dates <h5> 内置变量 </h5> <h6 th:text="${#dates.createNow()}"> 获取当前日期 </h6> strings <h5> 内置变量 </h5> <h6 th:text="${#dates.createNow()}"> 获取当前日期 </h6> <h6 th:text="${#strings.substring(text, 6, 9)}"> 截取字符串 </h6> <h6 th:text="${#strings.length(text)}"> 获得长度 </h6> <h6 th:text="${#strings.randomAlphanumeric(6)}"> 随机字符串 </h6> <h6 th:text="${#strings.equals(text, 'hello text....')}"></h6>

7. Mybatis Plus

快速入门 创建工程,引入依赖 <?xml version="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.0</modelVersion> <groupId>com.lxs</groupId> <artifactId>mybatis-plus-demo-quickstart</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <mybatisplus.version>3.3.2</mybatisplus.version> <skipTests>true</skipTests> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatisplus.version}</version> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

使用application.yml不是 application.properties

例如

使用步骤

1 创建实体类User 2 编写mapper(dao),接口实现 BaseMapper<User>{ }

3测试(内置增删改查)

常用注解

MyBatisPlus 提供了一些注解供我们在实体类和表信息出现不对应的时候使用。通过使用注解完成逻辑上匹 配。

mybatis plus注解策略配置 如果 mysql 自增主键注解策略设置如下 @TableId(type = IdType.AUTO) private Long id; 默认主键策略 /** * 采用雪花算法生成全局唯一主键 **/

排除实体类中非表字段 使用 @TableField(exist = false) 注解 主键策略参考源码 IdType

内置增删改查:

@Test public void testInsert() { User user = new User(); user.setName("开课吧"); user.setEmail("lxs@163.com"); user.setAge(3); Assert.assertTrue(mapper.insert(user) > 0); mapper.selectList(null).forEach(System.out :: println); }@Test public void testDelete() { // //主键删除 // mapper.deleteById(3l); // mapper.selectList(null).forEach(System.out :: println); // //批量删除: // mapper.delete(new QueryWrapper<User>().like("name", "J")); mapper.selectList(null).forEach(System.out :: println); } @Test public void testUpdate() { // //基本修改 // mapper.updateById(new User().setId(1l).setName("慧科")); mapper.update(new User().setEmail("huike@163.com"), Wrappers.<User>update().like("name", "J")); mapper.selectList(null).forEach(System.out :: println); } @Test public void testSelect() { // //基本查询 // System.out.println(mapper.selectOne(Wrappers.<User>query().eq("name", "Tom"))); //投影查询 mapper.selectList(new QueryWrapper<User>().select("id", "name")).forEach(user -> { System.out.println(user); }); }

分页:

内置分页 必须把PaginationInterceptor 用bean生成对象放到spring容器中 @Configuration public class MybatisPlusConfig { /** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { // 开启 count 的 join 优化,只针对 left join !!! return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true)); } }

#本来生成的count语句像这样 select count(1) from (select u.id,ua.account from user u left join user_account ua on u.id=ua.uid) 这时候分页查 count 时,其实可以去掉 left join 直查 user ,因为 user 与 user_account 是 1 对 1 关系,如下: 查 count: select count(1) from user u

测试 @Test public void testPage() { System.out.println("------ baseMapper 自带分页 ------"); Page<User> page = new Page<>(1, 5); IPage<User> pageResult = mapper.selectPage(page, new QueryWrapper<User>().eq("age", 20)); System.out.println("总条数 ------> " + pageResult.getTotal()); System.out.println("当前页数 ------> " + pageResult.getCurrent()); System.out.println("当前每页显示数 ------> " + pageResult.getSize()); pageResult.getRecords().forEach(System.out :: println); }

自定义xml分页 1 application.yml配置文件

# 配置 mybatis plus mybatis-plus: type-aliases-package: com.lxs.crud.entity # 别名搜索 mapper-locations: classpath:/mappers/*.xml # 加载映射文件

2 UserMapper接口 public interface UserMapper extends BaseMapper<User> { /** * 如果映射的接口方法有2个参数需要@Param定义参数名,定义参数名后,映射文件中使用p.属性 c.属性,具体访 问 * * @param page * @param conditioin * @return */ public IPage<User> selectUserByPage(@Param("p") IPage<User> page, @Param("c") User conditioin); }

3 UserMapper.xml映射文件 <?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="com.zx.mapper.UserMapper"> <sql id="selectSql"> SELECT * FROM user </sql> <select id="selectUserByPage" resultType="user"> <include refid="selectSql"></include> <where> <if test="c.age !=null"> age = #{c.age} </if> <if test="c.email !=null"> and email like '%${c.email}%' </if> </where> </select> </mapper>

测试 @Test public void testXmlPage() { System.out.println("------ baseMapper 自定义xml分页 ------"); Page<User> page = new Page<>(1, 5); User user = new User(); user.setAge(20); user.setEmail("test"); IPage<User> pr = mapper.selectUserByPage(page, user); System.out.println("总条数 ------> " + pr.getTotal()); System.out.println("当前页数 ------> " + pr.getCurrent()); System.out.println("当前每页显示数 ------> " + pr.getSize()); pr.getRecords().forEach(System.out :: println); }

3 pageHelper分页

引入 pageHelper 依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.11</version> </dependency>

mybatis plus 整合pageHelper的配置类

@Configuration @MapperScan("com.lxs.mybatisplus.samples.crud.mapper") public class MybatisPlusConfig { /** * mp分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { // 开启 count 的 join 优化,只针对 left join !!! return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true)); } /** * 两个分页插件都配置,不会冲突 * pagehelper的分页插件 */ @Bean public PageInterceptor pageInterceptor() { return new PageInterceptor(); }}

映射文件

<select id="selectUserByPage2" resultType="user"> <include refid="selectSql"></include> <where> <if test="age !=null"> age = #{age} </if> <if test="email !=null"> and email like '%${email}%' </if> </where> </select>

测试 @Test public void testPageHelper() { // pagehelper // PageInfo<User> page = PageHelper.startPage(1, 2).doSelectPageInfo(() -> mapper.selectList(Wrappers.<User>query())); PageHelper.startPage(1,2); // PageInfo<User> page = new PageInfo<>(mapper.selectList(Wrappers.<User>query())); User u = new User(); u.setAge(20); PageInfo<User> page = new PageInfo<User>(mapper.selectUserByPage2(u)); List<User> list = page.getList(); System.out.println("总行数=" + page.getTotal()); System.out.println("当前页=" + page.getPageNum()); System.out.println("每页行数=" + page.getPageSize()); System.out.println("总页数=" + page.getPages()); System.out.println("起始行数=" + page.getStartRow()); System.out.println("是第一页=" + page.isIsFirstPage()); System.out.println("是最后页=" + page.isIsLastPage()); System.out.println("还有下一页=" + page.isHasNextPage()); System.out.println("还有上一页=" + page.isHasPreviousPage()); System.out.println("页码列表" + Arrays.toString(page.getNavigatepageNums())); }

最全SpringBoot基础博客 传送门在下面:

https://blog.csdn.net/weixin_45434902/article/details/109577471

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.整合SpringMVC
  • 2.整合jdbc
  • 3.整合mybatis
  • 4 整合通用:mybatis(tk mybatis)
  • 概念
  • 5.Thymeleaf
  • 6 thymeleaf详解
  • 7. Mybatis Plus
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档