欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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.数据库表结构

springboot整合MybatisPlus基本使用

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基本使用

上一篇:

下一篇: