Mybatis-Plus学习
阅读原文时间:2023年07月09日阅读:1

mybatis-plus 学习

系统环境

jdk8+mysql5.7+springBoot+mybatis最新版本+系统编码UTF-8

文件配置

application.properties

# 应用名称
spring.application.name=mybatisplusLearn
# 数据库驱动:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 数据源名称
spring.datasource.name=defaultDataSource
# 数据库连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/demoMybatisPlus?serverTimezone=UTC&characterEncoding=UTF-8
# 数据库用户名&密码:
spring.datasource.username=root
spring.datasource.password=root
# 应用服务 WEB 访问端口
server.port=8086
#mybatis的日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

pom.xml

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </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.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.4</version>
    </dependency>
</dependencies>

springBootTest类文件

package com.albert.test;

import com.albert.dao.UserDao;
import com.albert.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author by ALBERT
 */
@SpringBootTest
public class UserTest {

    // 如果使用 Autowired 不成功,可使用Resource代替
    @Resource
    private UserDao userDao;
    @Test
    public void findAll(){
        List<User> users = userDao.selectList(null);
        users.forEach(item-> System.out.println("user:"+item));
    }
}

如何使用updatewrapper

    @Test
    public void updateTest(){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// 这里使用的简单的方式进行条件查询
        updateWrapper.eq("id",1).set("email",null);
        // 使用lambda 函数式接口 然后就可以使用 【User::getId】形式
        updateWrapper.lambda().eq(User::getId,2).set(User::getEmail,null);
        User user = new User();
//        user.setAge(800);
//        user.setEmail("7887111187@qq.com");
        user.setAge(null);
        int update = userDao.update(user, updateWrapper);
        System.out.println("修改之后的内容:-->"+update);
    }


运行的sql
==>  Preparing: UPDATE user SET email=? WHERE (id = ?)
==> Parameters: null, 1(Integer)
<==    Updates: 1

注意到:

1.user.setAge(null); mp会自动忽略null,设置null不起作用
2.updateWrapper.eq("id",1).set("email",null); 想要设置null可以在查询条件中添加set
3. updateWrapper 相当于查询条件也就是 where 后面的语句

Autowired与Resource的区别

参考链接1

参考链接2

相同点:

1.作用都一样,都是在做bean的注入,在使用过程中
2.一个业务接口只对应一个业务实现类的场景下两个注解可以替换使用

不同点

区别

Autowired

Resource

1

Spring的注解

Java自身的注解

2

只根据type进行注入,不会去匹配name.但是如果只根据type无法辨别注入对象时,就需要配合使用@Qualifier注解或者@Primary注解使用.

有两个重要的属性,分别是name和type,如果name属性有值,则使用byName的自动注入策略,将值作为需要注入bean的名字,如果type有值,则使用byType自动注入策略,将值作为需要注入bean的类型.如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。即@Resource注解默认按照名称进行匹配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找,当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配

使用要点:

Autowired 配合Qualifier;qualifier(“serviceImpl上的@service中指定的名称”)

直接使用Resource时;配合名称使用;

最佳实践:

参考链接3

lombock

Spring 建议我们在Bean中使用构造注入

Spring常用的注入方式有: 简单类型注入, 集合类型注入, 域属性自动注入, 自动注入的类别, 空值注入, 构造注入

可以简化为: 属性注入, 构造方法注入, set 方法注入

推荐使用构造方法注入

@RestController
public class TestController {

    final TestService testService;

    public TestController(TestService testService) {
        this.testService = testService;
    }
}

问题是要写很多代码

这个时候,你可能想到了Lombok的AllArgsConstructor注解。但它是针对于全部的属性的,如果类中有一些非Bean的属性,Spring就会晕菜。这个时候,就可以使用RequiredArgsConstructor了。

把需要注入的属性,修改成final类型的(或者使用@NotNull注解,不推荐),这些属性将构成默认的构造器。Java要求final类型的属性必须要初始化,如果没有构造方法代码就会变红。

 // 使用lambda 函数式接口 然后就可以使用 【User::getId】形式
 updateWrapper.lambda().eq(User::getId,2).set(User::getEmail,null);

函数式接口

函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式转换为 lambda 表达式。如定义了一个函数式接口如下:

@FunctionalInterface
interface GreetingService
{
    void sayMessage(String message);
}

那么就可以使用Lambda表达式来表示该接口的一个实现 (注:JAVA 8 之前一般是用匿名类实现的):

GreetingService greetService1 = message -> System.out.println("Hello " + message);



@FunctionalInterface
@FunctionalInterface 仅对抽象方法检查。

    1、该注解只能标记在"有且仅有一个抽象方法"的接口上。
    2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
    3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么 也不算抽象方法。
注:该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
原文链接:https://blog.csdn.net/qq_37595946/article/details/93166029