• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

JpaMapper: 用Jpa hibernate风格写出你的mybatis代码并兼容mybatis写法

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

JpaMapper

开源软件地址:

https://gitee.com/ffch/JpaMapper

开源软件介绍:

LicenseJDK 1.8Maven Central

JpaMapper项目简介

  • 如果你喜欢Jpa hibernate的简洁写法;
  • 或许你不喜欢写sql;
  • 或许你用了Mapper工具之后还是要写sql;

那就用JpaMapper吧!JpaMapper是尽量按照JPA hibernate的书写风格,对mybatis进行封装,是CRUD操作更加简单易用,免于不断写sql。

JpaMapper以动态生成sql替换手动生成sql的过程,并根据注解生成sqlsource的过程去生成sql,并将sql交给mybatis去管理,原理上和自己写sql是一致的,并不会去替换mybatis的底层实现。因为不用担心无法操控,任何可能出现的问题,只需要debug下查看生成的sql和预期的是否一致即可。

主要功能

v1.0.0:

  1. 增加(C): 提供单个实体保存、批量保存功能。
  2. 查询(R): 提供单/多查询,并支持findBy自定义字段名查询。
  3. 更新(U): 提供单个实体更新、批量更新功能。
  4. 删除(D): 提供单/多删除功能,并支持deleteBy自定义字段名删除。
  5. 简单易用,继承CrudMapper即可。
  6. 易于切换,从JPA hibernate替换为mybatis,只需要将CrudRepository替换为CrudMapper,当然,mybatis没办法方法重载,所以CrudRepository相同的方法名会做一定的区分。

v1.1

  1. 部分逻辑调整优化
  2. 增加简单分表功能

v1.2

  1. 部分逻辑调整优化
  2. 增加分页功能、排序功能,因分页写法的不同,暂时只支持mysql和oracle
  3. 支持pageBy分页功能,功能都与jpa hibernate的相似

v1.2.1

  1. 修复了jar引入时的bug

v1.2.2

  1. 修复了inseret操作的字段对应bug

v2.0

  1. groupId更改为cn.pomit,2.0版本以后不再用com.github.ffch。
  2. 新增sortBy功能,可以根据And分割字段名进行排序。

v2.1

  1. 新增一对一、一对多多表查询功能。

使用说明

jar包已经上传到maven中央仓库。https://search.maven.org/search?q=jpa-mapper ,groupId为cn.pomit。详细使用说明可以在项目主页里查看,也可以在个人博客JpaMapper目录下查看

Demo地址

SpringBoot:

Spring:

Maven依赖

使用mybatis 3.4.4进行分页存在类型转换错误,因此JpaMapper需要引入spring-mybatis版本1.3.2以上,或者引入mybatis 3.4.6以上。

springboot启动

<dependency>    <groupId>org.mybatis.spring.boot</groupId>    <artifactId>mybatis-spring-boot-starter</artifactId>    <version>1.3.2</version></dependency><dependency>    <groupId>cn.pomit</groupId>    <artifactId>jpa-mapper-spring-boot-starter</artifactId>    <version>2.1</version></dependency>

Spring启动

<dependency>	<groupId>org.mybatis</groupId>	<artifactId>mybatis</artifactId>	<version>3.4.6</version></dependency><dependency>	<groupId>org.mybatis</groupId>	<artifactId>mybatis-spring</artifactId>	<version>1.3.2</version></dependency><dependency>    <groupId>cn.pomit</groupId>    <artifactId>jpa-mapper-core</artifactId>    <version>2.1</version></dependency>

使用@Configuration配置JpaMapper,@Autowired注入List<SqlSessionFactory> sqlSessionFactoryList。

如果存在bean的生成顺序问题,导致SqlSessionFactory注入后并没有mapper信息,需要使用@DependsOn或者@Order注解调整JpaMapperConfig的生成顺序;

Spring的@Order注解有的时候可能无效,则可以将MapperScanner作为bean,使用@Bean注解配合@Order注解使用来调整bean的生成顺序

使用方法:

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 */@Configurationpublic class JpaMapperConfig {    @Autowired    private List<SqlSessionFactory> 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<Class<?>> 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<T, ID>,Mapper上要加上mybatis的Mapper注解。
  3. CrudMapper中定义的方法可以直接使用。
  4. 查询方法支持findBy + 字段名(And)查询。删除方法支持deleteBy + 字段名(And)删除。

详细使用方法可以在JpaMapper-CrudMapper里查看

主键策略

  1. @GeneratedValue(generator="JDBC"), 使用自增策略,对应mybatis的Jdbc3KeyGenerator
  2. @GeneratedValue除generator="JDBC"外,支持@SelectKey注解(非mybatis的注解,但和mybatis的注解一致,这里是为了将SelectKey注解扩展到字段上)添加到字段上,和mybatis的@SelectKey注解功能一致,可以自定义主键策略。

联表查询

  1. 在需要联表查询的字段上,增加@Many或者@One注解,同时增加@JoinColumns或者@JoinColumn注解。@JoinColumn注解只有name和referencedColumnName字段有效,并且这两个字段对应两个实体中的字段名,而不是表字段名。
	@Many(fetchType=FetchType.EAGER)	@JoinColumns({		@JoinColumn(name="userName",referencedColumnName="userName"),		@JoinColumn(name="mobile",referencedColumnName="phone")	})	private List<UserRole> userRole;

分表功能SimpleShardingMapper

  1. 需要继承SimpleShardingMapper<T, ID>, SimpleShardingMapper中定义的方法可以直接使用,因为mybatis的sql是根据类名+方法名确定唯一,所有SimpleShardingMapper和CrudMapper不能同时使用。
  2. 在实体中分表字段增加注解 @ShardingKey(prefix="_", methodPrecis="getTable", methodRange = "getTables") methodPrecis为了根据字段值精确查找表的后缀。methodRange是为了支持分表字段的between and 操作。其余字段选填。
  3. 在实体中增加静态方法(methodPrecis和methodRange指定的方法名),上所示的方法:
	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<Integer, String> 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<String> mapValueList = new ArrayList<String>(maps.values()); 		String[] arr = new String[mapValueList.size()];		return mapValueList.toArray(arr);	}

示例使用mobile的取余5寻找分表字段。

详细使用方法可以在JpaMapper-SimpleShardingMapper里查看

分页功能PagingAndSortingMapper

  1. 需要继承PagingAndSortingMapper<T, ID>,其中定义的方法可以直接使用,因为继承自CrudMapper,因此CrudMapper的方法也可以使用,同时也支持CrudMapper的findBy等功能。

  2. findAllPageable示例:

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<UserInfo> page =  userInfoSortDao.findAllPageable(pageable);
  1. pageBy分页查询,因为CrudMapper已经定义了findBy,所以这里换个名字。用法如:
Page<UserInfo> pageByPasswd(String passwd, Pageable pageable);

这样就可以以passwd分页查询了。

  1. sortBy排序查询。
List<UserInfo> sortByPasswd(String passwd, Sort sort);

这样就可以以passwd为条件查询,以sort作为排序条件。

详细使用方法可以在JpaMapper-PagingAndSortingMapper里查看

设计原理

https://blog.csdn.net/feiyangtianyao/article/category/8446635

版权声明

JpaMapper使用 Apache License 2.0 协议.

作者信息

作者博客:https://blog.csdn.net/feiyangtianyao

作者邮箱: [email protected]

License

Apache License


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
GreatSQL-Docker: GreatSQL Docker镜像集发布时间:2022-03-24
下一篇:
Orm: 自动读写分离的php-orm发布时间:2022-03-24
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap