目录
1.新建项目
2.实体类开发:
2.1在pom.xml中增加Lombok坐标:
2.2添加Book实体类
3.数据层开发:
3.1 配置MyBatisPlus与Druid
3.2创建数据层接口
3.3写测试类
3.4点击运行:
4.数据层快速开发:
4.1配置MyBatisPlus与Druid
4.2创建数据层接口:
4.3写测试类:
4.4点击运行:
4.5 测试Dao其他功能
5.开始MV运行日志:
5.1 使用配置方式开启日志,设置日志输出方式为标准输出
5.2 去掉System.out.println(),点击运行
6.分页
6.1使用IPage封装分页数据
6.2 IPage对象中封装了分页操作中的所有数据
6.3 分页操作依赖MyBatisPlus分页拦截器实现功能
6.4借助MyBatisPlus日志查阅执行SQL语句
7.条件查询功能
7.1使用QueryWrapper对象封装查询条件
7.2推荐使用LambdaQueryWrapper对象
7.3 所有查询操作封装成方法调用
7.4查询条件支持动态条件拼装
7.5 LambdaQueryWrapper其他查询条件示例:
7.5.1 添加查询条件
7.5.2 链式调用
7.5.3 使用 OR 和 AND 条件
7.5.4 模糊查询
7.5.5 排序
7.5.6 选择特定字段
7.5.7 组合查询
7.5.8 使用 LambdaQueryWrapper 进行查询
1.新建项目
点击下一步,勾选Web下的Spring web 和 SQL下面的MySQL Driver,点击创建。
打开pomxml,添加mybatis以及druid依赖到pomxml
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version> </dependency> <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.20</version> </dependency>
修改运行程序名称SpringBootJdk8SsmApplication为Application
修改application.properties配置文件的格式为 yml格式
2.实体类开发:
2.1在pom.xml中增加Lombok坐标:
Lombok,一个]ava类库,提供了一组注解,简化POJO实体类开发
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId> </dependency>
2.2添加Book实体类
代码如下:
package com.summer.domain;import lombok.Data;//lombok
@Data
public class Book {private Integer id;private String type;private String name;private String description;
}
3.数据层开发:
3.1 配置MyBatisPlus与Druid
在1. 新建项目的时候,已经在pom.xml中导入MyBatisPlus与Druid对应的starter坐标,这时只需要在application.yml配置中 增加相应的配置就可以了
#端口配置 server:port: 8081#数据库 用户名 密码 配置 spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTCusername: rootpassword: root#数据库前缀配置 mybatis-plus:global-config:db-config:table-prefix: tbl_
3.2创建数据层接口
代码如下所示:
package com.summer.dao;import com.summer.domain.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface BookDao {@Select("select * from tbl_book where id = #{id}")Book getById(Integer id);}
3.3写测试类
在test下写一个book的测试类
代码如下所示:
package com.summer.dao;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class BookDaoTestCase {@Autowiredprivate BookDao bookDao;@Testvoid testGetById() {System.out.println(bookDao.getById(1));}}
3.4点击运行:
4.数据层快速开发:
4.1配置MyBatisPlus与Druid
同 3.1
4.2创建数据层接口:
只要数据层接口集成 BaseMapper<T> 就可以了
代码如下所示:
package com.summer.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.summer.domain.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface BookDao extends BaseMapper<Book> {
// @Select("select * from tbl_book where id = #{id}")
// Book getById(Integer id);}
4.3写测试类:
同3.3一样创建测试类,测试类内容如下:
package com.summer.dao;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class BookDaoTestCase {@Autowiredprivate BookDao bookDao;@Testvoid testGetById() {System.out.println(bookDao.selectById(1));}}
4.4点击运行:
4.5 测试Dao其他功能
具体代码如下:
package com.summer.dao;import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class BookDaoTestCase {@Autowiredprivate BookDao bookDao;@Testvoid testGetById() {System.out.println(bookDao.selectById(1));}@Testvoid testSave() {Book book = new Book();book.setType("历史");book.setName("历史的温度");book.setDescription("通过讲述历史人物的故事,展现了历史的温情和人性的光辉");System.out.println(bookDao.insert(book));}@Testvoid testGetAll(){System.out.println(bookDao.selectList(null));}@Testvoid testUpdate(){Book book = new Book();book.setId(7);book.setType("历史");book.setName("历史的温度1");book.setDescription("通过讲述历史人物的故事,展现了历史的温情和人性的光辉");System.out.println(bookDao.updateById(book));}@Testvoid testDelete(){bookDao.deleteById(6);}}
在测试保存数据功能时,要在application.yml内加一行id-type: auto ,不然系统会默认assign_id,运行会报错
5.开始MV运行日志:
5.1 使用配置方式开启日志,设置日志输出方式为标准输出
代码如下:
#端口配置 server:port: 8081#数据库 用户名 密码 配置 spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTCusername: rootpassword: root#数据库前缀配置 mybatis-plus:global-config:db-config:table-prefix: tbl_id-type: autoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
5.2 去掉System.out.println(),点击运行
去掉1处的System.out.println(), 执行步骤 2.点击运行,出现如下图3所示,具体的日志信息
6.分页
6.1使用IPage封装分页数据
分页操作需要设定分页对象IPage,代码如下所示:
package com.summer.dao;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class BookDaoTestCase {@Autowiredprivate BookDao bookDao;@Testvoid testGetPage() {//分页操作需要设定分页对象IPageIPage page = new Page(1,5);bookDao.selectPage(page,null);}}
6.2 IPage对象中封装了分页操作中的所有数据
- 数据
- 当前页码值
- 每页数据总量
- 最大页码值
- 数据总量
6.3 分页操作依赖MyBatisPlus分页拦截器实现功能
分页操作是在MyBatisP1us的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现。
创建拦截器MPConfig,如下图所示:
代码如下所示:
package com.summer.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MPConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
6.4借助MyBatisPlus日志查阅执行SQL语句
运行testGetPage方法,打开日志,如下图所示:
7.条件查询功能
7.1使用QueryWrapper对象封装查询条件
package com.summer.dao;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class BookDaoTestCase {@Autowiredprivate BookDao bookDao;@Testvoid testGetBy(){QueryWrapper<Book> qw = new QueryWrapper();qw.like("name","Spring");bookDao.selectList(qw);}}
点击运行,如下图所示:
7.2推荐使用LambdaQueryWrapper对象
在下面testGetBy2测试方法中
if(name != null){
lqw.like( Book::getName,name);
}
和
lqw.like(name != null, Book::getName,name);
表达的意思是一样的, lqw.like(name != null, Book::getName,name); 表达的意思就是 当name 不等于 null的时候 sql执行like功能
package com.summer.dao;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class BookDaoTestCase {@Autowiredprivate BookDao bookDao;@Testvoid testGetBy2(){String name = null;LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();// if(name != null){
// lqw.like( Book::getName,name);
// }lqw.like(name != null, Book::getName,name);bookDao.selectList(lqw);}}
针对testGetBy2测试方法,点击运行,如下图所示,没有执行like条件语句:
如果testGetBy2测试方法里面的name变量赋上值,点击运行,如下图所示,执行了like语句:
7.3 所有查询操作封装成方法调用
分页查询Page所支持的函数如下所示
package com.summer.dao;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.apache.logging.log4j.util.Strings;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class BookDaoTestCase {@Autowiredprivate BookDao bookDao;@Testvoid testGetByCondition(){IPage page = new Page(1,2);String name = "历史";LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();lqw.like(name != null, Book::getName,name);bookDao.selectPage(page,lqw);System.out.println( page.getCurrent());//当前页System.out.println(page.getPages());//页数System.out.println(page.getSize());//每页显示数据条数System.out.println(page.getTotal());//总计数据条数System.out.println(page.getRecords());//当前页的所有记录}}
点击运行,如下图所示:
7.4查询条件支持动态条件拼装
package com.summer.dao;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class BookDaoTestCase {@Autowiredprivate BookDao bookDao;@Testvoid testGetByCondition(){IPage page = new Page(1,5);String name = "历史";LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();lqw.like(name != null, Book::getName,name);bookDao.selectPage(page,lqw);}}
7.5 LambdaQueryWrapper其他查询条件示例:
7.5.1 添加查询条件
- 使用 Lambda 表达式添加条件,例如,添加一个条件来查询用户的年龄大于 18:
queryWrapper.gt(User::getAge, 18); // gt 表示 greater than
7.5.2 链式调用
LambdaQueryWrapper
支持链式调用,可以连续添加多个条件:
queryWrapper
.eq(User::getName, "张三") // eq 表示 equal
.lt(User::getAge, 30); // lt 表示 less than
7.5.3 使用 OR 和 AND 条件
- 可以添加 OR 或 AND 条件组:
queryWrapper
.eq(User::getName, "张三")
.and(w -> w.lt(User::getAge, 30))
.or(w -> w.gt(User::getSalary, 5000));
7.5.4 模糊查询
进行模糊查询,例如,查询用户名包含 "user" 的用户:
queryWrapper.like(User::getName, "user");
7.5.5 排序
对查询结果进行排序:
queryWrapper.orderByAsc(User::getAge); // 升序 queryWrapper.orderByDesc(User::getSalary); // 降序
7.5.6 选择特定字段
选择查询结果中的特定字段:
queryWrapper.select(User::getId, User::getName); // 只选择 id 和 name 字段
7.5.7 组合查询
可以组合多个条件,例如,组合 IN 和 LIKE:
queryWrapper
.in(User::getId, Arrays.asList(1, 2, 3))
.like(User::getName, "user");
7.5.8 使用 LambdaQueryWrapper 进行查询
最后,你可以使用 LambdaQueryWrapper
与 MyBatis-Plus 的 Mapper 接口一起使用,执行查询:
List<User> users = userMapper.selectList(queryWrapper);