mybatisplus入门案例

title: mybatisplus入门案例
date: 2023-03-10 22:56:09
tags:

sql文件

/*
SQLyog Ultimate v11.25 (64 bit)
MySQL - 5.7.34-log : Database - mybatis_plus
*********************************************************************
*/

CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;

USE `mybatis_plus`;

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

/*Data for the table `user` */

insert  into `user`(`id`,`name`,`age`,`email`) values (1,'Jone',18,'test1@baomidou.com'),(2,'Jack',20,'test2@baomidou.com'),(3,'Tom',28,'test3@baomidou.com'),(4,'Sandy',21,'test4@baomidou.com'),(5,'Billie',24,'test5@baomidou.com');

pom文件

<?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.6.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.atguigu</groupId>
    <artifactId>mybatisplus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatisplus</name>
    <description>mybatisplus</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--        下面自己加的-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

a>配置application.yml

spring:
  # 配置数据源信息
  datasource:
    # 配置数据源类型
    type: com.zaxxer.hikari.HikariDataSource
    # 配置连接数据库的各个信息
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&userSSL=false
    username: root
    password: 123456
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

b>启动类

在Spring Boot启动类中添加@MapperScan注解,扫描mapper包
package com.atguigu.mybatisplus;

import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.atguigu.mybatisplus.mapper")
public class MybatisplusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisplusApplication.class, args);
    }

}

c>添加实体

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

d>添加mapper

BaseMapper是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的实体类型
@Repository//或者@Mapper也行
public interface UserMapper extends BaseMapper<User> {
}

e>测试

@SpringBootTest
class MybatisplusApplicationTests {


    @Autowired()
    private UserMapper userMapper;
    @Test
    public void setUserMapper(){
        userMapper.selectList(null).forEach(System.out::println);
    }
}

运行结果

2023-03-10 23:05:29.364 INFO 6208 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...2023-03-10 23:05:29.669 INFO 6208 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@1492276401 wrapping com.mysql.cj.jdbc.ConnectionImpl@46b2dcc5] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user==> Parameters: <== Columns: id, name, age, email<== Row: 1, Jone, 18, test1@baomidou.com<== Row: 2, Jack, 20, test2@baomidou.com<== Row: 3, Tom, 28, test3@baomidou.com<== Row: 4, Sandy, 21, test4@baomidou.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 5

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32ec9c90]

User(id=1, name=Jone, age=18, email=test1@baomidou.com)

User(id=2, name=Jack, age=20, email=test2@baomidou.com)

User(id=3, name=Tom, age=28, email=test3@baomidou.com)

User(id=4, name=Sandy, age=21, email=test4@baomidou.com)

User(id=5, name=Billie, age=24, email=test5@baomidou.com)

2023-03-10 23:05:29.750 INFO 6208 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...

2023-03-10 23:05:29.753 INFO 6208 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.

Process finished with exit code 0


基本CRUD

插入

    @Test
    public void testInsert(){
        User user = new User();
        user.setName("狂神");
        user.setAge(23);
        user.setEmail("kuangshen@atguigu.com");
        int result = userMapper.insert(user);
        System.out.println("受影响行数:"+result);
        //1475754982694199298
        System.out.println("id自动获取:"+user.getId()); }
}

JDBC Connection [HikariProxyConnection@1656143941 wrapping com.mysql.cj.jdbc.ConnectionImpl@58f254b1] will not be managed by Spring==> Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )==> Parameters: 1634411039222972418(Long), 狂神(String), 23(Integer), kuangshen@atguigu.com(String)<== Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12c0c0b3]受影响行数:1id自动获取:1634411039222972418

最终执行的结果,所获取的id为1475754982694199298

这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id

删除

a>通过id删除记录

    @Test
    public void testDeleteById(){
        //通过id删除用户信息
        // DELETE FROM user WHERE id=?
        int result=userMapper.deleteById(1634411039222972418L);
        System.out.println("受影响行数:"+result);
    }

JDBC Connection [HikariProxyConnection@1153180745 wrapping com.mysql.cj.jdbc.ConnectionImpl@3c28e5b6] will not be managed by Spring==> Preparing: DELETE FROM user WHERE id=?==> Parameters: 1634411039222972418(Long)<== Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@9c73fff]受影响行数:1

b>通过id批量删除记录

java.util.Arrays.asList() 的一般用法

  List 是一种很有用的数据结构,如果需要将一个数组转换为 List 以便进行更丰富的操作的话,可以这么实现:

    @Test
    public void testDeleteBatchIds(){
        //通过多个id批量删除
        // DELETE FROM user WHERE id IN ( ? , ? , ? )
        List<Long> idList = Arrays.asList(1L,2L,3L);
        int result = userMapper.deleteBatchIds(idList);
        System.out.println("受影响行数:"+result);
    }

JDBC Connection [HikariProxyConnection@1257058590 wrapping com.mysql.cj.jdbc.ConnectionImpl@4c38cd16] will not be managed by Spring==> Preparing: DELETE FROM user WHERE id IN ( ? , ? , ? )==> Parameters: 1(Long), 2(Long), 3(Long)<== Updates: 3Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a97b17c]受影响行数:3

c>通过map条件删除记录

    @Test
    public void testDeleteByMap() {
        //根据map集合中所设置的条件删除记录 
        // DELETE FROM user WHERE name = ? AND age = ?
        Map<String, Object> map = new HashMap<>();
        map.put("age",23);
        map.put("name","张三");
        int result = userMapper.deleteByMap(map);
        System.out.println("受影响行数:"+result);
    }

JDBC Connection [HikariProxyConnection@1097397209 wrapping com.mysql.cj.jdbc.ConnectionImpl@353e6389] will not be managed by Spring==> Preparing: DELETE FROM user WHERE name = ? AND age = ?==> Parameters: 张三(String), 23(Integer)<== Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@343e225a]受影响行数:1

修改

    @Test
    public void testUpdateById(){
        User user = new User();
        user.setId(4L);
        user.setName("李四");
        user.setEmail("lisi@atguigu.com");
        int result = userMapper.updateById(user);
        System.out.printf("result"+result);
    }

JDBC Connection [HikariProxyConnection@988876043 wrapping com.mysql.cj.jdbc.ConnectionImpl@6806468e] will not be managed by Spring==> Preparing: UPDATE user SET name=?, email=? WHERE id=?==> Parameters: 李四(String), lisi@atguigu.com(String), 4(Long)<== Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@60aec68a]

查询

a>根据id查询用户信息

@Test
    public void testSelectById(){
        //根据id查询用户信息
        // SELECT id,name,age,email FROM user WHERE id=?
        User user = userMapper.selectById(4L);
        System.out.println(user);
    }

JDBC Connection [HikariProxyConnection@1819552644 wrapping com.mysql.cj.jdbc.ConnectionImpl@5db3d57c] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user WHERE id=?==> Parameters: 4(Long)<== Columns: id, name, age, email<== Row: 4, 李四, 21, lisi@atguigu.com<== Total: 1

b>根据多个id查询多个用户信息

    @Test
    public void testSelectBatchIds(){
        //根据多个id查询多个用户信息 
        // SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
        List<Long> idList = Arrays.asList(4L, 5L);
        List<User> list = userMapper.selectBatchIds(idList);
        list.forEach(System.out::println);
    }

JDBC Connection [HikariProxyConnection@833272193 wrapping com.mysql.cj.jdbc.ConnectionImpl@26be9a6] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )==> Parameters: 4(Long), 5(Long)<== Columns: id, name, age, email<== Row: 4, 李四, 21, lisi@atguigu.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 2

c>通过map条件查询用户信息

    @Test
    public void testSelectByMap(){
        //通过map条件查询用户信息
        // SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
        Map<String, Object> map = new HashMap<>();
        map.put("age",21);
        map.put("name","李四");
        List<User> list = userMapper.selectByMap(map);
        list.forEach(System.out::println);
    }

JDBC Connection [HikariProxyConnection@1745241742 wrapping com.mysql.cj.jdbc.ConnectionImpl@3c7b137a] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user WHERE name = ? AND age = ?==> Parameters: 李四(String), 21(Integer)<== Columns: id, name, age, email<== Row: 4, 李四, 21, lisi@atguigu.com<== Total: 1

d>查询所有数据

    @Test
    public void testSelectList(){
        //查询所有用户信息
        // SELECT id,name,age,email FROM user
        List<User> list = userMapper.selectList(null);
        list.forEach(System.out::println);
    }

JDBC Connection [HikariProxyConnection@1015139714 wrapping com.mysql.cj.jdbc.ConnectionImpl@111c229c] will not be managed by Spring==> Preparing: SELECT id,name,age,email FROM user==> Parameters: <== Columns: id, name, age, email<== Row: 4, 李四, 21, lisi@atguigu.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 2

通过观察BaseMapper中的方法,大多方法中都有Wrapper类型的形参,此为条件构造器,可针

对于SQL语句设置不同的条件,若没有条件,则可以为该形参赋值null,即查询(删除/修改)所有数据

通用Service

说明:

通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删

除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,

泛型 T 为任意实体对象

建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承

Mybatis-Plus 提供的基类

a>IService

MyBatis-Plus中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑

详情查看源码IService和ServiceImpl

b>创建Service接口和实现类

package com.atguigu.mybatisplus.service;

import com.atguigu.mybatisplus.pojo.User;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * UserService继承IService模板提供的基础功能
 */
public interface UserService extends IService<User> {
}
package com.atguigu.mybatisplus.service.impl;

import com.atguigu.mybatisplus.mapper.UserMapper;
import com.atguigu.mybatisplus.pojo.User;
import com.atguigu.mybatisplus.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/***
 * ServiceImpl实现了IService,提供了IService中基础功能的实现
 * * 若ServiceImpl无法满足业务需求,则可以使用自定的UserService定义方法,并在实现类中实现
 * */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

c>测试查询记录数

    @Autowired
    private UserService userService;
    @Test
    public void testGetCount(){
        long count = userService.count();
        System.out.println("总记录数:" + count);
    }

JDBC Connection [HikariProxyConnection@1684368286 wrapping com.mysql.cj.jdbc.ConnectionImpl@6870cfac] will not be managed by Spring==> Preparing: SELECT COUNT( * ) FROM user==> Parameters: <== Columns: COUNT( * )<== Row: 2<== Total: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@297c9a9b]总记录数:2

d>测试批量插入

    @Test
    public void testSaveBatch(){
        // SQL长度有限制,海量数据插入单条SQL无法实行,
        // 因此MP将批量插入放在了通用Service中实现,而不是通用Mapper
        ArrayList<User> users = new ArrayList<>();
        for (int i=0;i<5;i++){
            User user = new User();
            user.setName("xcw"+i);
            user.setAge(8+i);
            users.add(user);
        }
        //SQL:INSERT INTO t_user ( username, age ) VALUES ( ?, ? )
        userService.saveBatch(users)
    }

JDBC Connection [HikariProxyConnection@929066990 wrapping com.mysql.cj.jdbc.ConnectionImpl@33d28f0a] will be managed by Spring==> Preparing: INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )==> Parameters: 1634861531262742529(Long), xcw0(String), 8(Integer)==> Parameters: 1634861531417931777(Long), xcw1(String), 9(Integer)==> Parameters: 1634861531417931778(Long), xcw2(String), 10(Integer)==> Parameters: 1634861531417931779(Long), xcw3(String), 11(Integer)==> Parameters: 1634861531417931780(Long), xcw4(String), 12(Integer)

关注尚硅谷谢谢喵

【尚硅谷】MyBatisPlus教程(一套玩转mybatis-plus)_哔哩哔哩_bilibili

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值