对数据库的基本操作(上)

116 阅读5分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

我们的MbBatiesPlus对我们的SQl语句进行了封装,给我们提供一些基本对数据库操作的方法,本篇文章就对这些方法进行一系列的展示。

不过,上一篇文章的准备是不够的,我们还是要对我们的代码进行完善,并学习几个新的注解。

对数据库操作吗!我们还是要先有一张表才能去操作,我就把我的sql脚本放出来,大家可以直接导入。

-- 创建库
CREATE DATABASE mp;
-- 使用库
USE mp;
-- 创建表
CREATE TABLE tbl_employee(
 id INT(11) PRIMARY KEY AUTO_INCREMENT,
 last_name VARCHAR(50),
 email VARCHAR(50),
 gender CHAR(1),
 age int
);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Tom','tom@ll.com',1,22);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Jerry','jerry@ll.com',0,25);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Black','black@ll.com',1,30);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('White','white@ll.com',0,35);

对应这张表,我们再去创建他的实体类

@TableName(value = "tbl_employee")
public class Employee {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    private String name;
    private String email;
    private Integer gender;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name=" + name +
                ", email='" + email + '\'' +
                ", gender=" + gender +
                ", age=" + age +
                '}';
    }
}

基于 Mybatis

需要编写 EmployeeMapper 接口,并手动编写 CRUD 方法

提供 EmployeeMapper.xml 映射文件,并手动编写每个方法对应的 SQL 语句.

基于 MP

只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口.这就是使用 MP

需要完成的所有操作,甚至不需要创建 SQL 映射文件。(就是大家想的那样,我们连sql语句都不用去编写,我们就可以完成对数据库的操作)

下面是我的Mapper

public interface EmployeeMapper extends BaseMapper<Employee > {
}

这些准备好了之后我们去编写一个插入的测试代码(这一次的测试代码我们列出了全部,下一次我们只列出@Test部分的代码,请注意)

public class testmp {
    private ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
    private EmployeeMapper employeeMapper=ioc.getBean("employeeMapper",EmployeeMapper.class);

    @Test
    //插入
    public  void demo1(){
        Employee employee=new Employee();
        employee.setName("MP");
        employee.setEmail("ll@ll");
        employee.setGender(1);
        employee.setAge(22);
        //插入到数据库
        Integer result = employeeMapper.insert(employee);
        System.out.println(result);
    }
}

启动测试代码,我们的数据将插入到表中,但是为什么呢?我们也没有指定是哪一张表,什么都没做就插入成功?

@TableId

这是我们主键的注解,他具体有两个参数,我们在上面代码也进行添加了

属性

类型

必须指定

默认值

描述

value

String

""

主键字段名

type

Enum

IdType.NONE

主键类型

描述

AUTO

数据库ID自增

NONE

无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)

INPUT

insert前自行set主键值

ASSIGN_ID

分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)

ASSIGN_UUID

分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法)

我们上面表的ID设置的就是自增,我们根据描述填写

@TableName

这个注解用来指定表名的,我们的实体类名和我们的表明并不一致,我们需要使用注解去指定

属性

类型

必须指定

默认值

描述

value

String

""

表名

schema

String

""

schema

keepGlobalPrefix

boolean

false

是否保持使用全局的 tablePrefix 的值(如果设置了全局 tablePrefix 且自行设置了 value 的值)

resultMap

String

""

xml 中 resultMap 的 id

autoResultMap

boolean

false

是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建并注入)

excludeProperty

String[]

{}

需要排除的属性名(@since 3.3.1)

全局策略配置

如果我们每写一个表就要添加一个注释的话,还是比较麻烦的,所以我们可以在applicationContext.xml中进行配置。

 <!--全局策略配置-->
    <bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
        <!--全局主键策略 value是枚举-->
        <property name="idType" value="0"></property>
        <!--全局的表前缀配置-->
        <property name="tablePrefix" value="tbl_"></property>

    </bean>

我们配置完成之后不要忘记在Bean中进行注入

 <!--注入全区策略配置-->
        <property name="globalConfig" ref="globalConfiguration"></property>

插入操作

insert函数

刚刚我们测试的时候就使用过insert函数,这个函数对插入操作是有值就进行插入,无值则按照原表的数值

	@Test
    public  void demo1(){
        Employee employee=new Employee();
        employee.setName("测试1");
        employee.setEmail("测试1邮箱");
        //employee.setGender(1);
       // employee.setAge(22);
        //插入到数据库
        Integer result = employeeMapper.insert(employee);
        System.out.println(result);
    }

他会对每一值做一个非空判断,如果非空则进行插入,没有值则不进行操作

在这里我们需要注意,有很多人看到的日志可能还是有全部的值,那是因为在定义实体类的时候使用的是int定义并非Integer,而这两个关键字在使用的时候虽然没有太多区别,但是int定义变量,会给变量赋予一个默认值:0;而Integer并不会

insertAllColumn函数

这个和insert大体相同,但是他不会判断我们的值是否为空,他会进行全部插入,代码重复度过高,我们就不在写了

修改操作

updateById函数

这个函数和我们的插入函数操作几乎相同,我们就不再做出过多解释

@Test
    public void demo2(){
        Employee employee=new Employee();
        employee.setId(5);
        employee.setName("测试3");
        employee.setEmail("测试3邮箱");
        employee.setGender(3);
        employee.setAge(33);
        Integer result = employeeMapper.updateById(employee);
        System.out.println(result);
    }

updateAllColumnById函数

写到这大家应该也都看明白了,他会将我们这一条数据都进行更新,如果我们没有赋予值,那会清空原有的值