mybatis-plus常用注解和方法
初识mybatis-plus
-
简介
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 -
那么它是怎么增强的呢?
其实就是它已经封装好了一些crud方法,我们不需要再写SQL语句了,直接调用这些方法就行(单表操作)。
注意:
- POM文件中将mybatis依赖换成mybatis plus (不能同时存在,避免冲突)。
- DAO层中你要创建的Mapper类必须继承BaseMapper,通过继承BaseMapper接口来实现dao接口功能的增强(也就是说你可以开始使用myabtis-plus提供的封装好的CRUD方法了)
快速开始:
//User类
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private Integer id;
private String name;
private Integer age;
private Date bir;
}
//编写 Mapper 包下的 UserMapper接口
public interface UserMapper extends BaseMapper<User> {
}
现有一张 User 表,我要查找User表中的所有数据
//添加测试类,进行功能测试:
@SpringBootTest
public class SampleTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
//使用mybatis-plus提供的selectList方法测试,null是无查询条件
//通过selectList查出user表中的所有数据
List<User> userList = userMapper.selectList(null);
for (User user : userList) {
System.out.println(user.toString());
}
}
}
但是注意!你并没写任何SQL语句,你也没有指定selectList方法去查询哪个数据表,那么它是如何完成java类和数据表的映射呢?
它其实是默认通过Java类名去对应数据库的表名,找不到对应的表名就会报错。但是这样很不灵活,如果我Java类名和我要查询的表名不一样那我就没法干活了吗?
mybatis-plus的开发者当然也知道这个问题,上面说的只是它的默认映射规则,真正开发时我们会用注解来解决Java类名和对应数据库的表名映射问题。
1. 常用的注解
@TableName
- 描述:表名注解,标识实体类对应的表
- 使用位置:实体类
比如说java类名是User但要查询的数据表是sys_user,我们就用这个注解来联系它们,这样就不会因为找不到对应的表而报错了。
@TableName("sys_user")//也可以写成@TableName(value="sys_user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
@TableId
- 描述:主键注解
- 使用位置:实体类主键字段
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | string | 否 | Java类id名 | 主键字段名 |
type | 枚举类 | 否 | idType.NONE | 指定主键类型 |
@TableName("sys_user")
public class User {
//两个参数不一定非要写,看情况
@TableId(value="uid",type=IdType.AUTO)//表主键为uid,自增
private Long id;
private String name;
private Integer age;
private String email;
}
IdType:
值 | 描述 |
AUTO | 数据库 ID 自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
ASSIGN_ID | 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) |
@TableField
- 描述:字段注解(非主键)
@TableName("sys_user")
public class User {
@TableId(value="uid",type=IdType.AUTO)//表主键为uid,自增
private Long id;
@TableField(value="nickname")
private String name;
private Integer age;
private String email;
@TableField(exist=false)//不映射数据表中的任何字段
private String aaaa;
}
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | string | 否 | Java类id名 | 数据库字段名 |
exist | Boolean | 否 | true | 是否为数据表字段 |
如果我的Java类中有一个要用的属性但是和数据表字段无关,而mybatis-plus会自动匹配,然后报错,这时候exist属性就派上了用场。当exist默认为true,说明对应Java属性是数据表字段,如果不是数据表字段,则设为false,便不会被自动匹配数据表字段名。