什么?Mybaits扩展 JPA功能,有趣!

151 阅读2分钟

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

一直很关注dromara社区的项目,最近浏览器项目时,发现一个mybatis-jpa-extra项目,里面针对JPA扩展,可以使用Lambda表达式,于是好奇的点进去了解了一下,分享给大家。

02 简介

MyBatis JPA ExtraMyBatis扩展JPA功能,Jakarta JPA 注释简化CRUD操作,增强了SELECT分页查询,增加链式Query查询条件构造器;支持Lambda 形式调用,方便编写各类查询条件,使用@Encrypted注解轻松实现字段数据加密和解密以及字段数据自动填充功能等。

GitHub地址:github.com/dromara/myb…

Gitee地址:gitee.com/dromara/myb…

03 简单使用

3.1 依赖

Maven

<dependency>
    <groupId>org.dromara.mybatis-jpa-extra</groupId>
    <artifactId>mybatis-jpa-extra-spring-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

mybatis.type-aliases-package=com.simonking.boot.jpa.pojo

3.2 实体定义

@Data
@Entity(name = "users")
public class Users extends JpaEntity {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column
    private String username;
    @Column
    private String password;
    @Column(name = "password_salt")
    private String passwordSalt;
    @Column(name = "del_flag")
    private Boolean delFlag;
}

需要注意的是这里的@Column一定要加,否则使用Lambda调用的时候会出现sql异常。

3.3 接口以及实现

/**
 * 接口
 */
public interface UsersService extends IJpaService<Users, Integer> {

}

/**
 * 实现
 */
@Service
public class UsersServiceImpl extends JpaServiceImpl<UsersMapper, Users, Integer> implements UsersService  {

}

官方说明里面继承的是AbstractJpaRepository,使用起来有点小问题,会导致getMapper为空的异常。使用时需要继承JpaServiceImpl

3.4 Mapper

@Mapper
public interface UsersMapper extends IJpaMapper<Users, Integer> {
}

这里的Mapper可以使用@Mapper注解,也可以使用@MapperScan("com.simonking.boot.jpa.mapper")放在启动类上。

3.5 测试

 @Autowired
private UsersService usersService;

/**
 * JPA 测试
 */
@Test
void test03() {
    Users byId = usersService.findById(1);
    System.out.println(byId);
}

/**
 * Lambda 测试
 */
@Test
void test02() {
    usersService.query(new LambdaQuery<Users>()
                    .eq(Users::getUsername, "test")
            ).forEach(System.out::println);
}

/**
 * Mybatis 注解测试
 */
@Test
void test03() {
     Users users = usersService.getByUsername("lisi");
     System.out.println(users);
}

结果

04 小结

作者是基于Mybaits扩展的JPA。类似框架Mybaits-PlusMybaits-Flex,本身是对Mybatis的增强,没有引入其他的框架。mybatis-jpa-extra何尝不是一种新的选择。

框架可能还不成熟,测试下来总会碰到一些小问题。

  • xxxServiceImpl需要继承JpaServiceImpl,而不是AbstractJpaRepository,否则getMapper is null
  • 使用SpringBoot 3.x启动异常,使用SpringBoot4.0.1正常启动测试
  • insert方法没有返回主键

使用下来感觉没有MPMF丝滑,就没有深入去了解了。有懂的朋友一起唠唠!