常用注解
@TableName
MyBatis-Plus根据BaseMapper中指定的泛型(实体类型名)确定数据库中操作的表,如果根据实体类型名找不到数据库中对应的表则会报表不存在异常
java
//向表中插入一条数据
@Test
public void testInsert(){
User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
//INSERT INTO user (id, name, age, email) VALUES ( ?, ?, ?, ? )
int result = userMapper.insert(user);
System.out.println("受影响行数:"+result);
//获取插入数据的主键id为1475754982694199298
//MyBatis-Plus在实现插入数据时,如果我们没有指定id,他默认基于雪花算法的策略生成一个id插入到表中
System.out.println("id自动获取:"+user.getId());
}
局部配置: 在实体类类型上添加@TableName("t_user")
用来设置实体类对应的表名
java
@Data
@TableName("t_user")
public class User{
private Long id;
private String name;
private Integer age;
private String email;
public User() {}
}
全局配置: 实际开发中实体类所对应的表都有固定的前缀(例如t_ 或tbl_),可以使用MyBatis-Plus提供的全局配置属性为所有实体类所对应的表名设置默认的前缀
yml
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 设置MyBatis-Plus的全局配置
global-config:
db-config:
# 设置实体类所对应的表的统一前缀
table-prefix: t_
@TableId的value和type属性
MyBatis-Plus在实现CRUD时只会将实体类id属性对应的id
字段作为主键,也就是说在插入数据时基于雪花算法的策略生成的值只会赋值给表中的id
字段
测试将实体类中的id属性改为uid
以及表中的id字段也改为uid
(此时uid属性对应的uid字段对于MyBatis-Plus来说就是一个普通字段)
java
//向表中插入一条数据
@Test
public void testInsert(){
User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
// INSERT INTO user (name, age, email) VALUES ( ?, ?, ?)
// uid字段对于MyBatis-Plus来说就是一个普通字段,如果我们没有指定值默认就向数据表插入的就为null
// MyBatis-Plus不会基于雪花算法为uid字段赋值
int result = userMapper.insert(user);
System.out.println("受影响行数:"+result);
System.out.println("id自动获取:"+user.getId());
}
在实体类的属性上添加@TableId注解将该属性对应的字段作为主键字段(根据属性名和字段名的映射关系确定对应的字段名)
- 如果实体类的属性名和数据库中的主键字段名称不同,可以使用@TableId注解的value属性指定作为主键的字段
java
@Data
public class User {
@TableId// 将uid属性对应的uid字段作为主键字段
private Long uid;
@TableId("uid")//将id属性对应的uid字段作为主键
private Long id;
private String name;
private Integer age;
private String email;
}
//向表中插入一条数据
@Test
public void testInsert(){
User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
//INSERT INTO user (uid,name, age, email) VALUES ( ?, ?, ?,?)
int result = userMapper.insert(user);
System.out.println("受影响行数:"+result);
System.out.println("id自动获取:"+user.getId());
}
@TableId的type属性是IdType枚举类型用来设置主键的生成策略
- 注意主键的生成策略只是辅助,如果我们自己手动给实体类的主键属性设置了值那么主键生成策略就会不起作用
值 | 描述 |
---|---|
IdType.ASSIGN_ID(默认值) | 先基于雪花算法的策略生成数据然后为实体类的id属性赋值 此时再向表中插入数据时主键id字段已经有了值,所以即使数据库的id字段设置了自增也不起作用 |
IdType.AUTO | 使用数据库主键字段的自增策略即不用给主键字段赋值 不再基于雪花算法为实体类的id属性赋值,此时向数据库中插入数据时id字段没有值所以要求数据库的主键字段必须设置自增属性 |
局部配置: 在实体类的属性上添加@TableId注解指定type属性设置主键的生成策略
java
@Data
public class User {
@TableId(value="uid",type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
//向表中插入一条数据
@Test
public void testInsert(){
User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
//INSERT INTO user (name, age, email) VALUES ( ?, ?, ?,?)
//采用主键自动递增策略后MyBatis-Plus就不会再通过雪花算法为实体类的id属性赋值然后插入数据库中
int result = userMapper.insert(user);
System.out.println("受影响行数:"+result);
System.out.println("id自动获取:"+user.getId());
}
全局配置: 使用MyBatis-Plus提供的全局配置设置统一的主键生成策略
yml
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 设置MyBatis-Plus的全局配置
global-config:
db-config:
# 设置实体类所对应的表的统一前缀
table-prefix: t_
# 设置统一的主键生成策略
id-type: auto
@TableField
在实体类属性上使用@TableField,表示当前属性对应的字段为一个普通字段(默认属性名就是表中的字段名)
- 如果实体类的属性名和表中的字段名不一致,可以使用@TableField的value属性指定属性对应的普通字段名
- 若实体类中的属性使用的是驼峰命名风格而表中的字段使用的是下划线命名风格, 此时MyBatis-Plus会自动将下划线命名风格转化为驼峰命名风格
java
@Data
public class User {
private Long id;
//userName对应的SQL语句INSERT INTO user (id, user_name, age, email ) VALUES ( ?, ?, ?, ? )
//name对应的SQL语句INSERT INTO user (id, name, age, email ) VALUES ( ?, ?, ?, ? )
@TableField("user_name")
private String userName;
private Integer age;
private String email;
}
//向表中插入一条数据
@Test
public void testInsert(){
User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
//
int result = userMapper.insert(user);
System.out.println("受影响行数:"+result);
System.out.println("id自动获取:"+user.getId());
}
@TableLogic
数据库表中的删除分为物理删除和逻辑删除两种
- 物理删除(真删): 将对应数据从数据库中删除,之后在数据库中查询不到此条被删除的数据
- 逻辑删除(假删): 将对应数据中代表是否被删除字段的状态修改为"被删除状态",之后在数据库中仍旧能看到此条数据记录(可以进行数据恢复)
第一步: 在数据库中创建逻辑删除字段is_deleted
并设置默认值为0(0表示该记录处于未删除状态,1表示已删除状态)
第二步: 在实体类中添加逻辑删除属性
java
@Data
public class User {
@TableId("uid")
private Long id;
@TableFiled("user_name")
private String name;
private Integer age;
private String email;
@TableLogic
private Integer isDeleted;
}
第三步测试逻辑删除: 逻辑删除数据后底层真正执行的是修改,查询数据时被逻辑删除的数据默认也不会被查询到
java
//通过多个id批量删除
@Test
public void testDeleteBatchIds(){
List<Long> idList = Arrays.asList(1L, 2L, 3L);
//物理删除执行的SQL: DELETE FROM user WHERE uid IN ( ? , ? , ? )
//逻辑删除真正执行的是修改: UPDATE t_user SET is_deleted=1 WHERE uid=? AND is_deleted=0
int result = userMapper.deleteBatchIds(idList);
System.out.println("受影响行数:"+result);
}
//查询所有数据,返回一个list集合
@Test
public void testSelectList(){
//直接查询:SELECT uid As id,user_name As name,age,email FROM user
//查询数据被逻辑删除的数据默认不会被查询:SELECT uid As id,user_name As name,age,email ,is_deleted FROM t_user WHERE is_deleted=0
List<User> list = userMapper.selectList(null);
list.forEach(System.out::println);
}