# JpaMapper
**Repository Path**: ffch/JpaMapper
## Basic Information
- **Project Name**: JpaMapper
- **Description**: 用Jpa hibernate风格写出你的mybatis代码并兼容mybatis写法
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 9
- **Forks**: 2
- **Created**: 2018-11-15
- **Last Updated**: 2025-01-18
## Categories & Tags
**Categories**: database-dev
**Tags**: None
## README
[](http://www.apache.org/licenses/LICENSE-2.0.html)
[]()
[](https://search.maven.org/search?q=g:%22cn.pomit%22%20AND%20a:%22jpa-mapper-core%22)
## [JpaMapper](https://www.pomit.cn/jpa-mapper)项目简介
- 如果你喜欢Jpa hibernate的简洁写法;
- 或许你不喜欢写sql;
- 或许你用了Mapper工具之后还是要写sql;
那就用[JpaMapper](https://www.pomit.cn/jpa-mapper)吧!JpaMapper是尽量按照JPA hibernate的书写风格,对mybatis进行封装,是CRUD操作更加简单易用,免于不断写sql。
[JpaMapper](https://www.pomit.cn/jpa-mapper)以动态生成sql替换手动生成sql的过程,并根据注解生成sqlsource的过程去生成sql,并将sql交给mybatis去管理,原理上和自己写sql是一致的,并不会去替换mybatis的底层实现。因为不用担心无法操控,任何可能出现的问题,只需要debug下查看生成的sql和预期的是否一致即可。
- [Gitee](https://gitee.com/ffch/JpaMapper)
- [Github](https://github.com/ffch/jpa-mapper)
- [Get Started](https://www.pomit.cn/jpa-mapper/#/)
- 官方地址: [https://www.pomit.cn/jpa-mapper](https://www.pomit.cn/jpa-mapper)
## 主要功能
v2.1.2
1. pageBy改造,支持动态SQL
2. 增加@TransientForAllAndPage注解,字段在ALL和PAGE查询时可忽略。
3. xxBy条件增加包含、左匹配、右匹配、大于小于等支持。
v2.1
1. 新增一对一、一对多多表查询功能。
v2.0
1. groupId更改为cn.pomit,2.0版本以后不再用com.github.ffch。
2. 新增sortBy功能,可以根据And分割字段名进行排序。
3.
v1.2
1. 部分逻辑调整优化
2. 增加分页功能、排序功能,因分页写法的不同,暂时只支持mysql和oracle
3. 支持pageBy分页功能,功能都与jpa hibernate的相似
4.
v1.1
1. 部分逻辑调整优化
2. 增加简单分表功能
v1.0.0:
1. 增加(C): 提供单个实体保存、批量保存功能。
2. 查询(R): 提供单/多查询,并支持findBy自定义字段名查询。
3. 更新(U): 提供单个实体更新、批量更新功能。
4. 删除(D): 提供单/多删除功能,并支持deleteBy自定义字段名删除。
5. 简单易用,继承CrudMapper即可。
6. 易于切换,从JPA hibernate替换为mybatis,只需要将CrudRepository替换为CrudMapper,当然,mybatis没办法方法重载,所以CrudRepository相同的方法名会做一定的区分。
## 使用说明
jar包已经上传到maven中央仓库。
https://search.maven.org/search?q=jpa-mapper ,groupId为cn.pomit。
详细使用说明可以在[项目主页](https://www.pomit.cn/jpa-mapper/#/)里查看,也可以在[个人博客JpaMapper目录](https://blog.csdn.net/feiyangtianyao/article/category/8446635)下查看
### Demo地址
**SpringBoot:**
- Gitee: [https://gitee.com/ffch/JpaMapperSpringBoot](https://gitee.com/ffch/JpaMapperSpringBoot)
- Github: [https://github.com/ffch/JpaMapperSpringBoot](https://github.com/ffch/JpaMapperSpringBoot)
**Spring:**
- Gitee: [https://gitee.com/ffch/JpaMapperSpring](https://gitee.com/ffch/JpaMapperSpring)
- Github: [https://github.com/ffch/JpaMapperSpring](https://github.com/ffch/JpaMapperSpring)
### Maven依赖
**使用mybatis 3.4.4进行分页存在类型转换错误,因此JpaMapper需要引入spring-mybatis版本1.3.2以上,或者引入mybatis 3.4.6以上。**
#### springboot启动
```xml
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
cn.pomit
jpa-mapper-spring-boot-starter
2.1.2
```
#### Spring启动
```xml
org.mybatis
mybatis
3.4.6
org.mybatis
mybatis-spring
1.3.2
cn.pomit
jpa-mapper-core
2.1.2
```
使用@Configuration配置JpaMapper,@Autowired注入List sqlSessionFactoryList。
如果存在bean的生成顺序问题,导致SqlSessionFactory注入后并没有mapper信息,需要使用@DependsOn或者@Order注解调整JpaMapperConfig的生成顺序;
Spring的@Order注解有的时候可能无效,则可以将MapperScanner作为bean,使用@Bean注解配合@Order注解使用来调整bean的生成顺序
使用方法:
```java
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.apache.ibatis.binding.MapperRegistry;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import cn.pomit.jpamapper.core.MapperScanner;
import cn.pomit.jpamapper.core.mapper.register.MappedStatementRegister;
/**
* Mapper 配置
*
* @author cff
*/
@Configuration
public class JpaMapperConfig {
@Autowired
private List sqlSessionFactoryList;
@PostConstruct
public void addPageInterceptor() {
try{
MapperScanner mapperScanner = new MapperScanner();
for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) {
org.apache.ibatis.session.Configuration configuration = sqlSessionFactory.getConfiguration();
MapperRegistry mapperRegistry = configuration.getMapperRegistry();
List> mappers = new ArrayList<>(mapperRegistry.getMappers());
MappedStatementRegister mappedStatementRegister = new MappedStatementRegister(configuration);
mappedStatementRegister.addMappers(mappers);
mapperScanner.addMappedStatementRegister(mappedStatementRegister);
}
mapperScanner.scanAndRegisterJpaMethod();
}catch(Exception e){
e.printStackTrace();
}
}
}
```
### Mapper种类
1. CrudMapper简单的增删改查Mapper,继承CrudMapper可以实现简单的CRUD。
2. SimpleShardingMapper分表Mapper,继承SimpleShardingMapper可以实现分表功能
3. PagingAndSortingMapper分页Mapper,继承PagingAndSortingMapper可以实现分页功能。
Mapper的泛型要指明实体类和主键
### 增删改查CrudMapper
1. 新建实体,实体字段必须加上@Column注解,Id字段加上@Id可以不加@Column。类注解@Table必须要指定表名。
2. 新建Mapper,继承CrudMapper,Mapper上要加上mybatis的Mapper注解。
3. CrudMapper中定义的方法可以直接使用。
4. 查询方法支持findBy + 字段名(And)查询。删除方法支持deleteBy + 字段名(And)删除。
详细使用方法可以在[JpaMapper-CrudMapper](https://www.pomit.cn/jpa-mapper/#/?id=_31-crud)里查看
### 主键策略
1. @GeneratedValue(generator="JDBC"), 使用自增策略,对应mybatis的Jdbc3KeyGenerator
2. @GeneratedValue除generator="JDBC"外,支持@SelectKey注解(非mybatis的注解,但和mybatis的注解一致,这里是为了将SelectKey注解扩展到字段上)添加到**字段**上,和mybatis的@SelectKey注解功能一致,可以自定义主键策略。
### 联表查询
1. 在需要联表查询的字段上,增加@Many或者@One注解,同时增加@JoinColumns或者@JoinColumn注解。@JoinColumn注解只有name和referencedColumnName字段有效,并且这两个字段对应两个实体中的字段名,而不是表字段名。
```java
@Many(fetchType=FetchType.EAGER)
@JoinColumns({
@JoinColumn(name="userName",referencedColumnName="userName"),
@JoinColumn(name="mobile",referencedColumnName="phone")
})
private List userRole;
```
### 分表功能SimpleShardingMapper
1. 需要继承SimpleShardingMapper, SimpleShardingMapper中定义的方法可以直接使用,因为mybatis的sql是根据类名+方法名确定唯一,所有SimpleShardingMapper和CrudMapper不能同时使用。
2. 在实体中分表字段增加注解 @ShardingKey(prefix="_", methodPrecis="getTable", methodRange = "getTables") methodPrecis为了根据字段值精确查找表的后缀。methodRange是为了支持分表字段的between and 操作。其余字段选填。
3. 在实体中增加静态方法(methodPrecis和methodRange指定的方法名),上所示的方法:
```java
public static String getTable(Object mobile) {
int index = Integer.parseInt(mobile.toString()) % 5;
return String.valueOf(index);
}
public static String[] getTables(Object start, Object end) {
Map maps = new HashMap<>();
int index = 0;
for(int i = Integer.parseInt(start.toString()); i < Integer.parseInt(end.toString()); i++){
if(index >= 5)break;
maps.put(index, String.valueOf(i % 5));
index++;
}
List mapValueList = new ArrayList(maps.values());
String[] arr = new String[mapValueList.size()];
return mapValueList.toArray(arr);
}
```
示例使用mobile的取余5寻找分表字段。
详细使用方法可以在[JpaMapper-SimpleShardingMapper](https://www.pomit.cn/jpa-mapper/#/?id=_32-%E5%88%86%E8%A1%A8)里查看
### 分页功能PagingAndSortingMapper
1. 需要继承PagingAndSortingMapper,其中定义的方法可以直接使用,因为继承自CrudMapper,因此CrudMapper的方法也可以使用,同时也支持CrudMapper的findBy等功能。
2. findAllPageable示例:
```java
Pageable pageable = new Pageable();
pageable.setPage(1);
pageable.setSize(5);
Order order = new Order(Direction.ASC, "mobile");
Order order1 = new Order(Direction.ASC, "userName");
Sort sort = new Sort(order, order1);
pageable.setSort(sort);
Page page = userInfoSortDao.findAllPageable(pageable);
```
3. pageBy分页查询,因为CrudMapper已经定义了findBy,所以这里换个名字。用法如:
```java
Page pageByPasswd(String passwd, Pageable pageable);
```
这样就可以以passwd分页查询了。
**new:** pageBy在2.1.2中已支持动态SQL。
4. sortBy排序查询。
```java
List sortByPasswd(String passwd, Sort sort);
```
这样就可以以passwd为条件查询,以sort作为排序条件。
详细使用方法可以在[JpaMapper-PagingAndSortingMapper](https://www.pomit.cn/jpa-mapper/#/?id=_33-%E5%88%86%E9%A1%B5%E6%8E%92%E5%BA%8F)里查看
## 设计原理
https://blog.csdn.net/feiyangtianyao/article/category/8446635
## 版权声明
JpaMapper使用 Apache License 2.0 协议.
## 作者信息
作者博客:https://blog.csdn.net/feiyangtianyao
作者邮箱: fufeixiaoyu@163.com
## License
Apache License