1、创建数据库,创建表,添加数据
CREATE TABLE `user`
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
INSERT INTO user (id,name,age,email) VALUES
(1,'Jone',18,'test1@qq.com'),
(2,'Jack',120,'test2@qq.com'),
(3,'Tom',28,'test3@qq.com'),
(4,'Sandy',21,'test4@qq.com'),
(5,'Billie',24,'test5@qq.com')
首先看一下表的结构:
再看一下表的数据:
2、使用快速方法创建一个SpringBoot项目:
3、引入相关依赖
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok用来简化实体类,只需要写属性,不用写get、set方法和有参无参构造,lombok能够自动生成-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
4、在IDEA中安装lombok插件, lombok依赖才会生效
5、创建application.properties文件,添加MySQL数据库的相关配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123
#mybatis日志(能够清楚的看到SQL语句、参数、返回数据、数据条数等信息)
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
6、创建实体类和mapper接口
在实体类中添加数据库表中相应的字段
package cn.henu.domain;
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
在mapper接口中继承BaseMapper接口,泛型传入相应的实体类
package cn.henu.mapper;
import cn.henu.domain.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
/*
* 在测试类中注入mapper的实现类时会报错(不管它也能正常运行),加上下面的注解就能不报错,把这个对象声明一下,交给Spring进行管理
* 加上@Component或者@Service或者@Repository都可以
* */
//@Component
//@Service
@Repository
/*
* 所有的mapper中的接口都继承BaseMapper接口,泛型传入相应的实体类,就不用写这个接口的实现类了(注意是baomidou中的BaseMapper)
* */
public interface UserMapper extends BaseMapper<User> {
}
7、在测试类中写CRUD方法
7.1、查询User表中所有数据
7.2、添加数据(不需要设置id值,因为mp会根据主键生成策略自动生成一个19位随机的唯一的id值)
主键生成策略:
在实体类中id属性的上面加上注解实现自动生成主键(不加默认就是@TableId(type = IdType.ID_WORKER))
package cn.henu.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
@Data
public class User {
// @TableId(type = IdType.AUTO)//主键自动增长
@TableId(type = IdType.ID_WORKER)//mp自带策略,生成19位的ID值,数字类型使用这种策略,比如long
// @TableId(type = IdType.ID_WORKER_STR)//mp自带策略,生成19位的ID值,字符串类型使用这种策略,比如string
// @TableId(type = IdType.INPUT)//ID值不会帮我们生成,需要自己手动输入ID
// @TableId(type = IdType.NONE)//不用任何策略,也是需要自己手动输入ID
// @TableId(type = IdType.UUID)//每次帮我们生成一个随机的唯一的ID值
private Long id;
private String name;
private Integer age;
private String email;
}
7.3、修改数据
自动填充:
不需要原始的手动添加 set 方法实现数据的填充,而是使用 MybatisPlus 的自动填充功能实现数据的添加
一、原始方式(手动添加):
1、在表中添加两个字段:create_time(创建时间) 和 update_time (修改时间)
添加之后的表结构:
添加之后的表数据:
2、在实体类中添加这两个属性
package cn.henu.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.util.Date;
@Data
public class User {
// @TableId(type = IdType.AUTO)//主键自动增长
@TableId(type = IdType.ID_WORKER)//mp自带策略,生成19位的ID值,数字类型使用这种策略,比如long
// @TableId(type = IdType.ID_WORKER_STR)//mp自带策略,生成19位的ID值,字符串类型使用这种策略,比如string
// @TableId(type = IdType.INPUT)//ID值不会帮我们生成,需要自己手动输入ID
// @TableId(type = IdType.NONE)//不用任何策略,也是需要自己手动输入ID
// @TableId(type = IdType.UUID)//每次帮我们生成一个随机的唯一的ID值
private Long id;
private String name;
private Integer age;
private String email;
//create_time
private Date createTime;
//update_time
private Date updateTime;
}
注意字段属性的命名规则:
在数据库中字段名为 create_time 和 update_time ,在实体类中就要把中间的下划线去掉,第二个单词的首字母大写,变成 createTime 和 updateTime 。(使用驼峰规则)
3、添加数据实验一下
//插入数据
@Test
void addUser(){
User user = new User();
user.setName("zhangsan");
user.setAge(23);
user.setEmail("zhangsan@qq.com");
int insert = userMapper.insert(user);
System.out.println("insert:"+insert);
}
看一下数据库中的数据,发现 create_time 和 update_time 两个字段并不会填充
要想在添加操作时填充 create_time 和 update_time 两个字段,就需要添加 user.setCreateTime(new Date()); 和 user.setUpdateTime(new Date());
//插入数据(手动添加数据)(添加了create_time和update_time两个字段之后)
@Test
void addUser1(){
User user = new User();
user.setName("lisi");
user.setAge(33);
user.setEmail("lisi@qq.com");
//要想填充create_time和update_time两个字段,需要手动加上下面两行代码(原始方式)
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
int insert = userMapper.insert(user);
System.out.println("insert:"+insert);
}
运行之后看数据库中新添加的数据:
二、MybatisPlus 自动填充的具体实现过程:
1、在实体类中需要自动填充的属性上面添加注解
//create_time
@TableField(fill = FieldFill.INSERT)//INSERT的含义就是添加,也就是说在做添加操作时,下面一行中的createTime会有值
private Date createTime;
//update_time
@TableField(fill = FieldFill.INSERT_UPDATE)//INSERT_UPDATE的含义就是在做添加和修改时下面一行中的updateTime都会有值,因为是第一次添加,还没有做修改(一般都使用这个)
private Date updateTime;
2、创建一个类,实现 MetaObjectHandler 接口,并且实现接口中的方法
package cn.henu.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component//注意在这个类上加@Component注解,或者@Service或者@Repository表示将这个类交给Spring进行管理
public class MyMetaObjectHandler implements MetaObjectHandler {
//使用mp实现添加的操作,这个方法就会执行
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//使用mp实现修改的操作,这个方法就会执行
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
3、写一个测试方法,不需要添加 user.setCreateTime(new Date()); 和 user.setUpdateTime(new Date());
//插入数据(mp自动填充)添加了create_time和update_time两个字段之后)
@Test
void addUser2(){
User user = new User();
user.setName("wangwu");
user.setAge(18);
user.setEmail("wangwu@qq.com");
int insert = userMapper.insert(user);
System.out.println("insert:"+insert);
}
运行之后看数据库中新添加的数据:
测试一下修改操作:
//修改操作
@Test
void updateUser1(){
User user = new User();
user.setId(1347375418848399362L);//上面使用mp自动填充功能添加的数据的ID值
user.setAge(120);
int row = userMapper.updateById(user);
System.out.println(row);
}
运行之后看数据库中新添加的数据:
可见创建时间不变,修改时间已经变了
一些简单的mp方法:
1、根据id查询数据
2、多个id的批量查询
3、mp实现复杂查询操作
//mp实现复杂查询操作
@Test
void testQueryWrapper(){
//创建QueryWrapper对象
QueryWrapper<User> wrapper = new QueryWrapper<>();
//通过QueryWrapper设置条件
//ge(大于等于)、gt(大于)、le(小于等于)、lt(小于)、isNull(为空)、isNotNull(不为空)
//查询age>=30的记录
//第一个参数:字段名称,第二个参数:要设置的值
// wrapper.ge("age",30);
//eq(等于)、ne(不等于)
//查询name为zhangsan的记录
// wrapper.eq("name","zhangsan");
//查询name不等于zhangsan的记录
// wrapper.ne("name","zhangsan");
//between(在...之间)、notBetween(不在...之间)(包含大小边界)
// wrapper.between("age",20,30);
//like、notLike、likeLeft、likeRight
// wrapper.like("name","w");
//orderBy、orderByDesc(降序)、orderByAsc(升序)
// wrapper.orderByDesc("id");
//last(直接拼接到sql的最后)
// wrapper.last("limit 1");
//查询指定的列
wrapper.select("name","age");
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}