一、快速入门
1.1 入门案例
入门案例制作步骤:
(1)新建模块并导入mybatis-plus起步依赖
<!-- mybatis-plus起步依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> <!-- lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!-- druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.10</version> </dependency>
(2)编写application.yml文件
server: port: 8080 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/mybatis-plus?useSSL=false username: root password: 123456 # mybatis-plus日志 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
(3)根据数据库表字段新建实体类
@Data @AllArgsConstructor @NoArgsConstructor public class User { private Long id; private String name; private String password; private Integer age; private String tel; }
(4)编写mapper接口并测试查看运行结果
@Mapper public interface UserMapper extends BaseMapper<User> { // 没有写任何接口方法 }
@SpringBootTest class Demo1ApplicationTests { @Autowired private UserMapper mapper; @Test public void contextLoads() { // 测试查询全部 List<User> users = mapper.selectByMap(null); System.out.println(users); } }
1.2 简介
Mybatis-Plus(简称MP)是基于Mybatis框架基础上开发的增强型工具,旨在简化开发,提高效率。mybatis-plus官网或mybatis-plus
MybatisPlus特性 |
无侵入:只做增强不做改变 |
强大的CRUD操作:内置通用Mapper,少量配置即可实现单表CRUD操作 |
支持Lambda:编写查询条件无需担心字段写错 |
内置分页查询 |
支持主键自动生成 |
二、标准CRUD制作
2.1 CRUD操作
@SpringBootTest class MybatisPlus1ApplicationTests { @Autowired private UserMapper mapper; @Test public void testUserMapper() { // 查询所有 List<User> users = mapper.selectByMap(null); System.out.println(users); } /** * 测试添加操作 * 对于自增的字段:如果没有设置,则自动生成一个值; * 对于非自增字段:如果可以为空,不生成;如果不可以为空,报错。 */ @Test public void insert() { User user = new User(); user.setId(3L); user.setName("sesssok"); user.setPassword("1333"); user.setAge(3); int i = mapper.insert(user); System.out.println(i); } /** * 测试删除操作 */ @Test public void delete() { // 批量删除-- // (Collection接口下有set、list、queue三个接口)根据id删除 List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); mapper.deleteBatchIds(list); // 根据map对象删除-根据某个字段删除 Map map = new HashMap(); map.put("age", 23); mapper.deleteByMap(map); } /** * 测试修改操作 */ @Test public void update() { User user = new User(); user.setId(3L); user.setAge(19); // 修改所有 // mapper.update(); // 根据id修改 int i = mapper.updateById(user); System.out.println(i); } }
下面是核心接口,附上源码和注释:
public interface BaseMapper<T> extends Mapper<T> { // 插入一条记录 int insert(T entity); // 根据id删除 int deleteById(Serializable id); // 将map中的元素设置为删除的条件,多个条件之间是AND关系 int deleteByMap(@Param("cm") Map<String, Object> columnMap); // 将实体对象进行封装,包装为删除条件(类似上面) int delete(@Param("ew") Wrapper<T> queryWrapper); // 根据id集合批量删除 int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList); // 根据id更新 int updateById(@Param("et") T entity); // 根据条件更新,Wrapper是条件 int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper); // 根据id查询 T selectById(Serializable id); // 根据id(ids)批量查询 List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList); // 根据键值查询 List<T> selectByMap(@Param("cm") Map<String, Object> columnMap); // 根据实体条件查询一个,如果查到多个,就会报错 T selectOne(@Param("ew") Wrapper<T> queryWrapper); // 条件查询总记录数 Integer selectCount(@Param("ew") Wrapper<T> queryWrapper); // 条件查询集合 List<T> selectList(@Param("ew") Wrapper<T> queryWrapper); // 条件查询map集合 List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper); List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper); // 分页查询 <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper); <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper); }
2.2 分页查询
配置分页插件:
@Configuration public class MpConfig { /** * 设置Mybatis-Plus可以使用分页功能的插件 * @return */ @Bean public MybatisPlusInterceptor interceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }
调用分页方法并查看测试结果:
/** * 测试分页 */ @Test public void testPage() { IPage page = new Page(); page.setCurrent(1); // 设置当前页码 page.setSize(5); // 设置每页显示数 mapper.selectPage(page, null); System.out.println("当前页码-->" + page.getCurrent() + ",每页显示数-->" + page.getSize()); System.out.println("总页数-->" + page.getPages() + ",总记录数-->" + page.getTotal() + ",数据-->" + page.getRecords()); }
三、DQL
3.1 3种查询条件格式
查询条件格式 | 使用QueryWrappe泛型类 | 使用QueryWrapper泛型类+lambda | 使用LambdaQueryWrapper泛型类 |
(1)新建一个模块
(2)导入MyBatis-Plus相关依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.10</version> </dependency>
(3)使用方法
@SpringBootTest class Demo1ApplicationTests { @Autowired private UserMapper mapper; @Test public void testSelectCon1() { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.lt("age",20); // 查询age<20的记录 System.out.println(mapper.selectList(wrapper)); } @Test public void testSelectCon2() { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.lambda().lt(User::getAge,20); System.out.println(mapper.selectList(wrapper)); } @Test public void testSelectCon() { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.lt(User::getAge,20); System.out.println(mapper.selectList(wrapper)); } }
并列关系 | 或者关系 |
默认(.and()) | .or() |
@Test public void testSelectCon4() { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.lt(User::getAge, 18).or(); wrapper.gt(User::getAge, 20); // age<18 || age>20 // 链式写法1--or wrapper.lt(User::getAge, 18).or() .gt(User::getAge, 20); // age<18 || age>20 // 链式写法2--and wrapper.gt(User::getAge, 10).lt(User::getAge, 18); // age>18 && age<18 System.out.println(mapper.selectList(wrapper)); }
(4)在yml配置文件设置关闭mybati-plus和SpringBoot的banner图案
# spring--banner: off main: banner-mode: off # mybatis-plus--banner: false mybatis-plus: global-config: banner: false
(5)新建logback.xml文件清除日志
# 标准日志输出 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
上面的输出不利于我们调试代码,因此在yml文件中添加如上代码,使控制台输出相关日志。