MyBatis-Plus环境搭建与基础注解说明
环境要求
1.数据库中建立表结构
CREATE TABLE `mp` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`activity_id` bigint(20) DEFAULT NULL COMMENT '活动id',
`activity_name` varchar(30) DEFAULT NULL COMMENT '活动名称',
`activity_type` int(11) DEFAULT NULL COMMENT '活动类型',
`count` int(11) DEFAULT NULL COMMENT '活动报名人数',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_group_act` (`create_time`,`count`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意,我们这里建立的表名是mp,这是我特意写的,目的是待会在实体类中让大家体会一下MP的注解的使用。
2.构建一个SpringBoot工程
这里不会展示怎么构建SpringBoot工程,非常的简单,不会的大家可以去百度一下。使用IDEA基本上是下一步点下去就完事了。
- 启动类
package com.example.mp;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author 95152
*/
@SpringBootApplication
// 这里填写你的mapper路径,或者你可以通过@Mapper这个注解来声明这是一个Bean
@MapperScan("com.example.mp.mapper")
public class MpApplication {
public static void main(String[] args) {
SpringApplication.run(MpApplication.class, args);
}
}
- yml文件配置
spring:
datasource:
## 这里说明一下,sakila是我的数据库名称,你们根据你们的来
url: jdbc:mysql://127.0.0.1:3306/sakila?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
logging:
level:
root: warn
## 这里写你自己的包路径
com.example.mp.mapper: trace
pattern:
console: '%p%m%n'
server:
port: 8080
tomcat:
uri-encoding: UTF-8
mybatis-plus:
configuration:
##驼峰下划线之间的转换
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- pom文件
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
Java实体类
package com.example.mp.model;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* @author 95152
*/
@Data
@TableName("mp")
public class ActivityEntity {
/**
* 主键
*/
private Long id;
/**
* 活动id
*/
private Long activityId;
/**
* 活动名称
*/
private String activityName;
/**
* 活动类型
*/
private Integer activityType;
/**
* 活动报名人数
*/
private Integer count;
/**
* 创建时间
*/
private Date createTime;
public static ActivityEntity getInstance(Long activityId, String activityName, Integer activityType, Integer count, Date createTime) {
ActivityEntity activityEntity = new ActivityEntity();
activityEntity.activityId = activityId;
activityEntity.activityName = activityName;
activityEntity.activityType = activityType;
activityEntity.count = count;
activityEntity.createTime = createTime;
return activityEntity;
}
}
-
ServiceImpl
这里注意要继承官方的ServiceImpl<M extends BaseMapper<T>, T>
接口,第一个参数是你的Mapper,第二个是你的实体类.
public class ActivityServiceImpl extends ServiceImpl<ActivityMapper,ActivityEntity> implements ActivityService
- Mapper
public interface ActivityMapper extends BaseMapper<ActivityEntity>
OK,完成上面的步骤,我们就搞好了一个环境去进行demo了.下面让我们开始MP的学习
基础注解
下面我们来说说MP中一些重要的概念.
- 表名映射
一条简单的SQL是如何映射成正确的SQL语句,那我们知道SQL的查询是
select fields from table where conditions
这样的形式去构造的,这里面就涉及到表名,在MP中要将你的实体类与数据库中的表映射起来,那么你需要使用@TableName
这个注解,声明你的真实数据库名是什么.
示例:
@TableName("mp")
public class ActivityEntity
- 主键策略
这里只讲默认的策略,MP是根据雪花算法自动生成ID的,如果你有其他需求,可以查看官网的主键策略。一般在实体类中id为Long类型,MP就可以帮你找到你的主键自动生成了。这也就意味着通常请情况下,我们不需要去操作id主键列.
此外,如果你的主键名不是id,你可以通过@TableId
告诉MP你的主键是什么
示例: 假设你的数据库主键列叫user_id
/**
* 主键
*/
@TableId
private Long userId;
官网:https://baomidou.com/guide/annotation.html#tableid
- Field映射
@TableField
解决实体类中的属性名与数据库不一致的注解
示例: 如果你的数据库字段叫user_name_a
@TableField("user_name_a")
private String userName;
- 不参与SQL的Field
企业中其实更提倡对Entity进行一层封装,即实体类就是与数据库中的表结构一一对应,如果你需要特殊的结果集,你可以自建一个DTO进行映射。
但是如果你确实需要在Entity中去做一些非DB字段的保留,那么你可以使用MP给你提供的一些策略去做到这件事情。
- static
给该字段设置成静态变量,这样MP就会自动忽略它.
- @TableField
@TableField(exist=false)
private String remark;