Mybatis-Plus 学习笔记Day-02

一、测试自定义动能

Mybatis-Plus 工具只是在 Mybatis 基础上只做增强不做改变,我们可以使用Mybatis-plus 提供的 baseMapper 做基础的增删改查,也可以使用自定义功能。

1.1 编写业务接口

@Repository
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据id查询用户信息为map集合
     * @param id
     * @return
     */
    Map<String, Object> selectMapById(@Param("id")Long id);

}

1.2 rescoure目录下创建mapper包

在该包下创建 UserMapper.xml 文件

<?xml version="1.0" encoding="UTF-8" ?>
<!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">

    <!--Map<String, Object> selectMapById(Long id);-->
    <select id="selectMapById" resultType="map">
        select id,name,age,email from t_user where id = #{id}
    </select>
    
</mapper>

1.3 单元测试

@Test
public void testSelect(){
   Map<String, Object> map = userMapper.selectMapById(1L);
   System.out.println(map);
}

测试结果
在这里插入图片描述

二、通用Service

2.1 说明

通用 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

2.2 IService

MyBatis-Plus 中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑。详情查看源码 IService 和 ServiceImp
在这里插入图片描述
在这里插入图片描述

2.3 最佳实践

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> {
}

2.4 单元测试

@Autowired
private UserService userService;

@Test
public void testGetCount(){
    //查询总记录数
    //SELECT COUNT( * ) FROM user
    long count = userService.count();
    System.out.println("总记录数:"+count);
}

测试结果
在这里插入图片描述

2.5 批量添加

@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);
}

测试结果
在这里插入图片描述

三、常用注解

3.1 @TableName

经过以上的测试,在使用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

3.2 @TableId

经过以上的测试,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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值