springboot整合MybatisPlus基本使用
程序员文章站
2023-12-24 22:09:33
...
1.创建springboot项目并导入依赖
这里主要是导入mybatisPlus和数据库驱动,这是整合的关键。集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突。mybatisPlus的依赖已经包含了。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.hzu</groupId>
<artifactId>springboot_mp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_mp</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--mybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.application.yml
#DataSourcespring:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?userSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT
username: root
password: 123456
3.配置日志
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<logger name="cn.hzu" level="TRACE"/>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
4.编写实体类
package cn.hzu.springboot_mp.bean;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* <p>
* 用户实体对应表 user(默认表名对应)
* </p>
* 实体类常用的注解
* @TableName(value="表名") 贴在实体类上,当实体名与表明不同时,使用@TableName(value="表名")为实体类指定表
* @TableId 贴在实体属性上
* value:指定表中的主键类的列名,若实体属性名与列名一致,则可以不指定
* type:指定主键生成策略,一般指定自增
* @TableField 贴在实体属性上
* value:指定表的列名
* exist: 指定实体属性是否有对应的表的列,默认为true
*/
@Data
@ToString(exclude="abc")
@NoArgsConstructor
@TableName(value ="u_user" )
public class User {
@TableId(value="u_id" , type = IdType.AUTO)
private Long id;
@TableField(value = "u_name")
private String name;
@TableField(value = "u_age")
private Integer age;
@TableField(value = "u_email")
private String email;
@TableField(exist = false)
private Integer abc;
}
5.mapper接口
继承BaseMapper接口才可以使用MybatisPlus的强大的通用CRUD,接口的泛型是你要操作的类
package cn.hzu.springboot_mp.mapper;
import cn.hzu.springboot_mp.bean.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;
/**
* <p>
* MP 支持不需要 UserMapper.xml,复杂的操作还是依旧可以使用xml文件,跟mybatis一样
* </p>
*
*/
public interface UserMapper extends BaseMapper<User> {
}
5.编写配置类
扫描mapper接口,也可以在主程序类扫描。这个配置类可以配置其他mybatis的东西
package cn.hzu.springboot_mp.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("cn.hzu.springboot_mp.mapper")
public class MybatisPlusConfig {
}
5.数据库表结构
6.集成完成,编写测试类
这里只使用了基本的CRUD,强大的条件构造器没写例子。
package cn.hzu.springboot_mp;
import cn.hzu.springboot_mp.bean.User;
import cn.hzu.springboot_mp.mapper.UserMapper;
import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootTest
class SpringbootMpApplicationTests {
@Autowired
UserMapper userMapper;
@Autowired
ApplicationContext applicationContext;
@Test
void contextLoads() {
/**
* 通用插入操作方法
* 这两个方法都会返回自动生成的主键,不需要指定
* 1.insert 在插入时会根据实体的每个属性进行判断,只有非空属性对应的字段才会插入
* sql语句:INSERT INTO u_user ( u_name, u_age ) VALUES ( ?, ? )
* 2.insertAllColumn方法在插入时, 不管属性是否非空, 属性所对应的字段都会出现到SQL语句中.
* sql语句:INSERT INTO u_user ( u_name, u_age,u_email ) VALUES ( ?, ? ,?)
* Mybatis-plus从2.x 升级到 3.x 后的变化还是比较大的,其中就删除了UpdateAllColumnById方法还有insertAllColumn方法
* User user=new User();
* user.setAge(18);
* user.setName("xiaoming");
* userMapper.insert(user);
*/
// User user=new User();
// user.setAge(18);
// user.setEmail("xxx");
// user.setName("xiaoming");
// userMapper.insert(user);
// System.out.println(user.getId());
/*
* 通用的更新从操作
* 跟前面的insert操作类似
* 1.updateById 在更新时只对非空属性进行更新,这里我没有设置email的值,所以不更新,email还是保留原来的值
* sql;UPDATE u_user SET u_name=?, u_age=? WHERE u_id=?
* 2.updateAllColumnById 在更新时更新全部字段
* sql:UPDATE u_user SET u_name=?, u_age=? ,u_email=? WHERE u_id=?
* User user=new User();
user.setId(1L);
user.setAge(17);
user.setName("xiaoming");
userMapper.updateById(user);
* */
// User user=new User();
// user.setId(1L);
// user.setAge(17);
// user.setName("xiaoming");
// userMapper.updateById(user);
/*
* 通用的删除操作
* 1.deleteById 根据id删除
* sql:DELETE FROM u_user WHERE u_id=?
* userMapper.deleteById(2L);
* 2.deleteByMap 根据条件删除
* sql:DELETE FROM u_user WHERE u_name = ? AND u_email = ?
* Map<String,Object> columnMap = new HashMap<>();
//这里的条件的key应该写表的列名而不是实体属性名
// 这里的条件只能是AND连接,若要使用or,like,between等条件,请期待后面的条件构造器
columnMap.put("u_name", "hhh");
columnMap.put("u_email", "12");
Integer result = userMapper.deleteByMap(columnMap);
* 3.deleteBatchIds 根据id批量删除
* sql:DELETE FROM u_user WHERE u_id IN ( ? , ? , ? )
* List<Integer> idList = new ArrayList<>();
idList.add(3);
idList.add(4);
idList.add(5);
Integer result = userMapper.deleteBatchIds(idList);
System.out.println("result: " + result );
* */
/*
* 通用的查询操作
* 1.selectById 根据id查询
* sql:SELECT u_id AS id,u_name AS name,u_age AS age,u_email AS email FROM u_user WHERE u_id
* 2.selectOne 指定多个列查询,将要查询的条件封装成一个实体对象传入(条件是用AND的连接),新版已经删掉这个方法了,将其改造成条件构造器查询,请期待下面的内容
* 3.selectBatchIds 通过多个id进行查询 返回一个List集合
* sql:SELECT u_id AS id,u_name AS name,u_age AS age,u_email AS email FROM u_user WHERE u_id IN ( ? , ? )
* List<Integer> idList = new ArrayList<>();
idList.add(1);
idList.add(2);
List<User> users = userMapper.selectBatchIds(idList);
System.out.println(users);
* 4.selectByMap 通过Map封装条件查询(同样是用AND连接条件),跟上面的删除用法一样 返回一个List集合
* sql:SELECT u_id AS id,u_name AS name,u_age AS age,u_email AS email FROM u_user WHERE u_name = ? AND u_age = ?
* Map<String,Object> columnMap = new HashMap<>();
columnMap.put("u_name", "小明");
columnMap.put("u_age", 1);
List<User> users = userMapper.selectByMap(columnMap);
System.out.println(users);
* 5.selectPage 分页查询 这个方法在新版也已经改了
* 老版的参数selectPage(new Page<>(3, 2), null) 不带条件的分页查询,条件设置为null,传入当前页和每页的大小
* 新版的两个分页方法已经把分页插件集成进来了,删除了之前的两个分页方法
*
*
* 之前分页插件的用法,导包,配置
*
* @Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
*
* 测试
* @Test
public void selectPage() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ge("age",26);
Page<User> page = new Page<>(1, 2);
IPage<User> userIPage = userMapper.selectPage(page, wrapper);
System.out.println("总条数"+userIPage.getTotal());
System.out.println("总页数"+userIPage.getPages());
}
@Test
public void selectPage() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ge("age",26);
Page<User> page = new Page<>(1, 2);
IPage<Map<String,Object>> userIPage = userMapper.selectMapsPage(page, wrapper);
System.out.println("总条数"+userIPage.getTotal());
System.out.println("总页数"+userIPage.getPages());
}
*
* */
}
//==============================条件构造器=====================================================
/*
* 妈的。mybatisPlus2.x版本跟3.x版本差别太大了,除了前面的几个通用crud改变外,字要命的是实体构造器基本都变了,基本重写了
* 2.x版本的实体构造体使用EntityWrapper 以及condition 这两个,3.x之后集成关系更加复杂了,功能也更加强大了,常用的是
* QueryWrapper UpdateWrapper 太多实体构造器了,版本更新太快了
*
*
* */
@Test
public void testWrapper(){
/**
* 条件构造器 删除操作
* 源码的方法 int delete(@Param("ew") Wrapper<T> wrapper);
* 参数:条件构造器
*/
}
}
7.项目结构
推荐阅读
-
springboot整合MybatisPlus基本使用
-
activemq整合springboot使用方法(个人微信小程序用)
-
SpringBoot + Spring Security 基本使用及个性化登录配置详解
-
SpringBoot + Spring Security 基本使用及个性化登录配置详解
-
浅谈Springboot整合RocketMQ使用心得
-
SpringBoot整合MybatisPlus的简单教程实现(简单整合)
-
详解mall整合SpringBoot+MyBatis搭建基本骨架
-
SpringBoot整合MyBatisPlus配置动态数据源的方法
-
SpringBoot整合Netty并使用Protobuf进行数据传输(附工程)
-
每天学点SpringCloud(一):使用SpringBoot2.0.3整合SpringCloud