这是我参与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函数
写到这大家应该也都看明白了,他会将我们这一条数据都进行更新,如果我们没有赋予值,那会清空原有的值