MybatisPlus综合详细教程,学不会来砍我

 前言:

        之前我们已经把SringBoot介绍完毕,忘记的同学可以查看博客主页秀琴的秘密花园。这篇文章介绍MybatisPlus,对代码进行深度优化训练。祝大家学有所成。

         有志者,事竟成。——约翰生

    

目录

Mybatis概括

整体结构

详细介绍

 通用CRUD

1.插入方法

 更新操作

删除操作

查询操作


MP概括

概念:MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高 效率而生。

特性:MybatisPlus综合详细教程,学不会来砍我_第1张图片

 架构:MybatisPlus综合详细教程,学不会来砍我_第2张图片

 接下来我们把今天的内容及之前介绍的Mybatis,SpringBoot结合运用。

整体结构

MybatisPlus综合详细教程,学不会来砍我_第3张图片

数据库:

MybatisPlus综合详细教程,学不会来砍我_第4张图片

详细介绍:

1.导入依赖

pom.xml:



4.0.0

org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE

cn.itcast.mp
itcast-mp-springboot
1.0-SNAPSHOT


org.springframework.boot
spring-boot-starter


org.springframework.boot
spring-boot-starter-logging




org.springframework.boot
spring-boot-starter-test
test



org.projectlombok
lombok
true



com.baomidou
mybatis-plus-boot-starter
3.1.1



mysql
mysql-connector-java
5.1.47


org.slf4j
slf4j-log4j12





org.springframework.boot
spring-boot-maven-plugin



log4j.properties:

log4j.rootLogger=DEBUG,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n

2.编写application.properties

spring.application.name = itcast-mp-springboot
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mp?
useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL
=false
spring.datasource.username=root
spring.datasource.password=root

3.编写pojo

package cn.itcast.mp.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User {
private Long id;
private String userName;
private String password;
private String name;
private Integer age;
private String email;
}

补充说明:

@Data——成getter,setter等函数

@NoArgsConstructor——生成全参数构造函数

@AllArgsConstructor——生成无参构造函数

它们都是lombok下的注解,这里不详细介绍

4.编写mapper

package cn.itcast.mp.mapper;
import cn.itcast.mp.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper {
}

补充说明:mapper继承的BaseMapper中可获取到各种各样的单表操作

MybatisPlus综合详细教程,学不会来砍我_第5张图片

5.编写启动类

package cn.itcast.mp;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@MapperScan("cn.itcast.mp.mapper") //设置mapper接口的扫描包
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}

6.编写测试用例

package cn.itcast.mp;
import cn.itcast.mp.mapper.UserMapper;
import cn.itcast.mp.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
List userList = userMapper.selectList(null);
for (User user : userList) {
System.out.println(user);
}
}
}

测试结果:MybatisPlus综合详细教程,学不会来砍我_第6张图片

 通用CRUD

1.插入方法

定义:

int insert(T entity);

 测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert(){
User user = new User();
user.setAge(20);
user.setEmail("[email protected]");
user.setName("曹操");
user.setUserName("caocao");
user.setPassword("123456");
int result = this.userMapper.insert(user); //返回的result是受影响的行数,并不是自增
后的id
System.out.println("result = " + result);
System.out.println(user.getId()); //自增后的id会回填到对象中
}
}

测试结果:MybatisPlus综合详细教程,学不会来砍我_第7张图片

 补充说明:

@TableId——id问题

数据已经写入数据库,但是id值不正确,我们需要数据库自增长,实际是MP生成了id的值写入到了数据库,我们只需要User类中加入@Tabled注解即可完成自增长。

 @TableFied——非驼峰、属性不存在等问题

MybatisPlus综合详细教程,学不会来砍我_第8张图片MybatisPlus综合详细教程,学不会来砍我_第9张图片

 更新操作

1.根据id更新

定义:

int updateById(@Param(Constants.ENTITY) T entity);

 测试:

@Test
public void testUpdateById() {
User user = new User();
user.setId(6L); //主键
user.setAge(21); //更新的字段
//根据id更新,更新不为null的字段
this.userMapper.updateById(user);
}

结果:

MybatisPlus综合详细教程,学不会来砍我_第10张图片

2.根据条件更新

定义:

/**
* 根据 whereEntity 条件,更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper
updateWrapper)

测试:

@Test
public void testUpdate() {
User user = new User();
user.setAge(22); //更新的字段
//更新的条件
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("id", 6);
//执行更新操作
int result = this.userMapper.update(user, wrapper);
System.out.println("result = " + result);
}

或通过UpdateWrapper

@Test
public void testUpdate() {
//更新的条件以及字段
UpdateWrapper wrapper = new UpdateWrapper<>();
wrapper.eq("id", 6).set("age", 23);
//执行更新操作
int result = this.userMapper.update(null, wrapper);
System.out.println("result = " + result);
}

测试结果:MybatisPlus综合详细教程,学不会来砍我_第11张图片

删除操作

1.根据id删除

定义:

int deleteById(Serializable id)

测试:

@Test
public void testDeleteById() {
//执行删除操作
int result = this.userMapper.deleteById(6L);
System.out.println("result = " + result);
}

结果:

2.根据条件删除

定义:

int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap);

测试:

@Test
public void testDeleteByMap() {
Map columnMap = new HashMap<>();
columnMap.put("age",20);
columnMap.put("name","张三");
//将columnMap中的元素设置为删除的条件,多个之间为and关系
int result = this.userMapper.deleteByMap(columnMap);
System.out.println("result = " + result);
}

结果:

MybatisPlus综合详细教程,学不会来砍我_第12张图片

3.封装对象删除

定义:

* 根据 entity 条件,删除记录
*
* @param wrapper 实体对象封装操作类(可以为 null)
*/
int delete(@Param(Constants.WRAPPER) Wrapper wrapper);

测试:

@Test
public void testDeleteByMap() {
User user = new User();
user.setAge(20);
user.setName("张三");
//将实体对象进行包装,包装为操作条件
QueryWrapper wrapper = new QueryWrapper<>(user);
int result = this.userMapper.delete(wrapper);
System.out.println("result = " + result);
}

结果:

4.批量删除

方法:

/**
* 删除(根据ID 批量删除)
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection
idList);

测试:

@Test
public void testDeleteByMap() {
//根据id集合批量删除
int result = this.userMapper.deleteBatchIds(Arrays.asList(1L,10L,20L));
System.out.println("result = " + result);
}

 结果:

MybatisPlus综合详细教程,学不会来砍我_第13张图片

查询操作

1.根据id查询

定义:

/**
* 根据 ID 查询
*
* @param id 主键ID
*/
T selectById(Serializable id);

测试:

@Test
public void testSelectById() {
//根据id查询数据
User user = this.userMapper.selectById(2L);
System.out.println("result = " + user);
}

结果: 

MybatisPlus综合详细教程,学不会来砍我_第14张图片

2.批量查询

定义:

/**
* 查询(根据ID 批量查询)
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
List selectBatchIds(@Param(Constants.COLLECTION) Collection
idList);

测试:

@Test
public void testSelectBatchIds() {
//根据id集合批量查询
List users = this.userMapper.selectBatchIds(Arrays.asList(2L, 3L, 10L));
for (User user : users) {
System.out.println(user);
}
}

结果:MybatisPlus综合详细教程,学不会来砍我_第15张图片

3.查询一个

定义:

/**
* 根据 entity 条件,查询一条记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);

测试:

@Test
public void testSelectOne() {
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("name", "李四");
//根据条件查询一条数据,如果结果超过一条会报错
User user = this.userMapper.selectOne(wrapper);

结果:

MybatisPlus综合详细教程,学不会来砍我_第16张图片

4.查询总记录

定义:

/**
* 根据 Wrapper 条件,查询总记录数
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);

测试:

@Test
public void testSelectCount() {
QueryWrapper wrapper = new QueryWrapper();
wrapper.gt("age", 23); //年龄大于23岁
//根据条件查询数据条数
Integer count = this.userMapper.selectCount(wrapper);
System.out.println("count = " + count);
}

结果:MybatisPlus综合详细教程,学不会来砍我_第17张图片

5.查询全部记录

定义:

*
* 根据 entity 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);

测试:

@Test
public void testSelectCount() {
QueryWrapper wrapper = new QueryWrapper();
wrapper.gt("age", 23); //年龄大于23岁
//根据条件查询数据条数
Integer count = this.userMapper.selectCount(wrapper);
System.out.println("count = " + count);
}

结果:MybatisPlus综合详细教程,学不会来砍我_第18张图片

6.查询全部页数

配置分页插件:

@Configuration
@MapperScan("cn.itcast.mp.mapper") //设置mapper接口的扫描包
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}

定义:

/**
* 根据 entity 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

测试:

@Test
public void testSelectPage() {
QueryWrapper wrapper = new QueryWrapper();
wrapper.gt("age", 20); //年龄大于20岁
Page page = new Page<>(1,1);
//根据条件查询数据
IPage iPage = this.userMapper.selectPage(page, wrapper);
System.out.println("数据总条数:" + iPage.getTotal());
System.out.println("总页数:" + iPage.getPages());
List users = iPage.getRecords();
for (User user : users) {
System.out.println("user = " + user);
}
}

结果:MybatisPlus综合详细教程,学不会来砍我_第19张图片

你可能感兴趣的:(后端框架的学习,Mybatis_Plus,java,后端)