Mybatis-Plus 工具只是在 Mybatis 基础上只做增强不做改变,我们可以使用Mybatis-plus 提供的 baseMapper 做基础的增删改查,也可以使用自定义功能。
@Repository
public interface UserMapper extends BaseMapper<User> {
/**
* 根据id查询用户信息为map集合
* @param id
* @return
*/
Map<String, Object> selectMapById(@Param("id")Long id);
}
在该包下创建 UserMapper.xml 文件
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mybatisplus.mapper.UserMapper">
<select id="selectMapById" resultType="map">
select id,name,age,email from t_user where id = #{id}
select>
mapper>
@Test
public void testSelect(){
Map<String, Object> map = userMapper.selectMapById(1L);
System.out.println(map);
}
通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删 除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆。泛型 T 为任意实体对象,建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承Mybatis-Plus 提供的基类。
官网地址: https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%A3
MyBatis-Plus 中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑。详情查看源码 IService 和 ServiceImp
Mybatis-Plus 工具提供的通用的 Service 和 IService 有时候不能满足业务需求,开发者可以根据自己业务需求,编写 service 去继承 ServiceImpl 类实现 UserService 接口。
创建 service 包,编写 service 接口,在该包下创建包 impl 编写接口实现类
UserServiceImpl 实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
UserService 接口
public interface UserService extends IService<User> {
}
@Autowired
private UserService userService;
@Test
public void testGetCount(){
//查询总记录数
//SELECT COUNT( * ) FROM user
long count = userService.count();
System.out.println("总记录数:"+count);
}
@Test
public void testInsertMore(){
//批量添加
//INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )
List<User> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
User user = new User();
user.setName("ybc"+i);
user.setAge(20+i);
list.add(user);
}
boolean b = userService.saveBatch(list);
System.out.println(b);
}
经过以上的测试,在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表。由此得出结论,MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和实体类型的类名一致。
若实体类类型的类名和要操作的表的表名不一致,会出现什么问题?
我们将表user更名为t_user,测试查询功能程序抛出异常,Table ‘mybatis_plus.user’ doesn’t exist,因为现在的表名为t_user,而默认操作
的表名和实体类型的类名一致,即user表。
1.通过@TableName解决问题
在实体类类型上添加@TableName(“t_user”),标识实体类对应的表,即可成功执行SQL语句。
@Data
//设置实体类所对应的表名
@TableName("t_user")
public class User {
//将属性所对应的字段指定为主键
//@TableId注解的value属性用于指定主键的字段
//@TableId注解的type属性设置主键生成策略
@TableId(value = "id", type = IdType.AUTO)
private Long id;
//指定属性所对应的字段名
// @TableField("user_name")
private String name;
private Integer age;
private String email;
}
2.通过全局配置解决问题
在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如t_或tbl_。此时,可以使用MyBatis-Plus提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过@TableName标识实体类对应的表。
mybatis-plus:
# 设置MyBatis-Plus的全局配置
global-config:
db-config:
# 设置实体类所对应的表的统一前缀
table-prefix: t_
# 设置统一的主键生成策略
id-type: auto
经过以上的测试,MyBatis-Plus在实现CRUD时,会默认将id作为主键列,并在插入数据时,默认基于雪花算法的策略生成id。
1.问题
若实体类和表中表示主键的不是id,而是其他字段,例如uid,MyBatis-Plus会自动识别uid为主键列吗?
我们实体类中的属性id改为uid,将表中的字段id也改为uid,测试添加功能程序抛出异常,Field ‘uid’ doesn’t have a default value,说明MyBatis-Plus没有将uid作为主键赋值。
2.通过@TableId解决问题
在实体类中uid属性上通过@TableId将其标识为主键,即可成功执行SQL语句。
@Data
//设置实体类所对应的表名
@TableName("t_user")
public class User {
@TableId
private Long uid;
private String name;
private Integer age;
private String email;
}
3.@TableId的value属性
若实体类中主键对应的属性为id,而表中表示主键的字段为uid,此时若只在属性id上添加注解@TableId,则抛出异常Unknown column ‘id’ in ‘field list’,即MyBatis-Plus仍然会将id作为表的主键操作,而表中表示主键的是字段uid。此时需要通过@TableId注解的value属性,指定表中的主键字段,@TableId(“uid”)或@TableId(value=“uid”)。
@Data
//设置实体类所对应的表名
@TableName("t_user")
public class User {
@TableId("uid")
private Long id;
private String name;
private Integer age;
private String email;
}
4.@TableId的type属性
type属性用来定义主键策略,常用的主键策略:
@Data
//设置实体类所对应的表名
@TableName("t_user")
public class User {
//将属性所对应的字段指定为主键
//@TableId注解的value属性用于指定主键的字段
//@TableId注解的type属性设置主键生成策略
// @TableId(value = "id", type = IdType.AUTO)
@TableId("uid")
private Long uid;
private String name;
private Integer age;
private String email;
}
配置全局主键策略:
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 设置MyBatis-Plus的全局配置
global-config:
db-config:
# 设置实体类所对应的表的统一前缀
table-prefix: t_
# 设置统一的主键生成策略
id-type: auto