首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MyBatis JPA Extra对MyBatis扩展JPA功能

MyBatis JPA Extra对MyBatis扩展JPA功能

原创
作者头像
MaxKey单点登录开源官方
发布于 2023-03-13 03:19:43
发布于 2023-03-13 03:19:43
84300
代码可运行
举报
运行总次数:0
代码可运行

MyBatis JPA Extra对MyBatis扩展JPA功能

1.JPA 2.1注释简化CUID操作;

2.Interceptor实现数据库SELECT分页查询;

3.链式Query查询条件构造器;

4.提供starter,简化SpringBoot集成;

1、JPA 2.1注释

1.1、注释

仅支持6个注释

  • @Entity
  • @Table
  • @Column
  • @Id
  • @GeneratedValue
  • @Transient

1.2、主键策略

支持3种主键策略

序号

策略

支持

1

AUTO

4种主键自动填充策略snowflakeid(雪花ID-推荐)uuid(UUID)uuid.hex(UUID十六进制)serial(JPA Extra序列)

2

SEQUENCE

数据库序列生成,generator值为数据库序列名

3

IDENTITY

数据库表自增主键

1.3、Java Bean 注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@Table(name = "STUDENTS")  
public class Students extends JpaBaseEntity implements Serializable{
	
	@Id
	@Column
	@GeneratedValue(strategy=GenerationType.AUTO,generator="snowflakeid")
	//@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_MYBATIS_STUD")
	//@GeneratedValue(strategy=GenerationType.IDENTITY)
	private String id;
	
	@Column
	private String stdNo;
	
	@Column
	private String stdName;
	
	@Column
	private String stdGender;
	
	@Column
	private int stdAge;
	
	@Column
	private String stdMajor;
	
	@Column
	private String stdClass;
	
	@Column
	private byte[] images;
	
	public Students() {}

	//public get(){};public void set(){};
}

2、基本操作

2.1、CURD

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//新增数据
	@Test
	public void insert() throws Exception{
		_logger.info("insert...");
		Students student=new Students();
		student.setStdNo("10024");
		student.setStdGender("M");
		student.setStdName("司马昭");
		student.setStdAge(20);
		student.setStdMajor("政治");
		student.setStdClass("4");
		service.insert(student);
		
		Thread.sleep(1000);
		_logger.info("insert id " + student.getId());
	}
	
	//查询数据实体并更新
	@Test
	public void update() throws Exception{
		_logger.info("get...");
		Students student=service.get("317d5eda-927c-4871-a916-472a8062df23");
		System.out.println("Students "+student);
		 _logger.info("Students "+student);
		 _logger.info("update...");
		 student.setImages(null);
		 service.update(student);
		 _logger.info("updateed.");
		 
		 student.setImages("ssss".getBytes());
		 service.update(student);
		 _logger.info("updateed2.");
	}
	
	//根据实体查询并更新
	@Test
	public void merge() throws Exception{
		_logger.info("merge...");
		Students student=new Students();
		//student.setId("10024");
		student.setStdNo("10024");
		student.setStdGender("M");
		student.setStdName("司马昭");
		student.setStdAge(20);
		student.setStdMajor("政治");
		student.setStdClass("4");
		service.merge(student);
		
		Thread.sleep(1000);
		_logger.info("merge id " + student.getId());
	}

	//根据ID查询
	@Test
	public void get() throws Exception{
		_logger.info("get...");
		Students student=service.get("317d5eda-927c-4871-a916-472a8062df23");
		System.out.println("Students "+student);
		 _logger.info("Students "+student);
	}
	
	//根据实体查询
	@Test
	public void query() throws Exception{
		_logger.info("query...");
		Students student=new Students();
		student.setStdGender("M");
		List<Students> listStudents =service.query(student);
		//...
	}

	//查询所有记录
	@Test
	public void findAll() throws Exception{
		_logger.info("findAll...");
		List<Students> listStudents =service.findAll();
		//...
	}

	//根据ID删除
	@Test
	public void remove() throws Exception{
		_logger.info("remove...");
		service.remove("921d3377-937a-4578-b1e2-92fb23b5e512");
	}
	
	//根据ID集合批量删除
	@Test
	public void batchDelete() throws Exception{
		_logger.info("batchDelete...");
		List<String> idList=new ArrayList<String>();
		idList.add("8584804d-b5ac-45d2-9f91-4dd8e7a090a7");
		idList.add("ab7422e9-a91a-4840-9e59-9d911257c918");
		idList.add("12b6ceb8-573b-4f01-ad85-cfb24cfa007c");
		idList.add("dafd5ba4-d2e3-4656-bd42-178841e610fe");
		service.deleteBatch(idList);
	}
	
	//根据ID批量逻辑删除
	@Test
	public void logicDelete() throws Exception{
		_logger.info("logicDelete...");
		List<String> idList=new ArrayList<String>();
		idList.add("8584804d-b5ac-45d2-9f91-4dd8e7a090a7");
		idList.add("ab7422e9-a91a-4840-9e59-9d911257c918");
		idList.add("12b6ceb8-573b-4f01-ad85-cfb24cfa007c");
		idList.add("dafd5ba4-d2e3-4656-bd42-178841e610fe");
		service.logicDelete(idList);
	}

	//根据ID批量删除
	@Test
	public void batchDeleteByIds() throws Exception{
		_logger.info("batchDeleteByIds...");
		service.deleteBatch("2");
		service.deleteBatch("2,639178432667713536");
	}

2.2、Find查询和Qruey构造器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//springJDBC 的查询方式
	@Test
	public void find() throws Exception{
		_logger.info("find by filter StdNo = '10024' or StdNo = '10004'");
		List<Students> listStudents = service.find(" StdNo = ? or StdNo = ?  ",
							new Object[]{"10024","10004"},
							new int[]{Types.VARCHAR,Types.INTEGER}
						);
		//...
	}

	//根据链式条件构造器查询
	//WHERE (stdMajor = '政治' and STDAGE > 30 and stdMajor in ( '政治' , '化学' )  or  ( stdname = '周瑜' or stdname = '吕蒙' ) )
	@Test
	public void filterByQuery() throws Exception{
		_logger.info("filterByQuery...");
		List<Students> listStudents = service.query(
				new Query().eq("stdMajor", "政治").and().gt("STDAGE", 30).and().in("stdMajor", new Object[]{"政治","化学"})
				.or(new Query().eq("stdname", "周瑜").or().eq("stdname", "吕蒙")));
		//...
	}

2.3、分页查询并count数据量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//根据实体分页查询
	@Test
	public void queryPageResults() throws Exception{
		_logger.info("queryPageResults...");
		 Students student=new Students();
		 //student.setStdGender("M");
		 //student.setStdMajor(政治");
		 student.setPageSize(10);
		 //student.setPageNumber(2);
		 student.calculate(21);
		 JpaPageResults<Students>  results = service.queryPageResults(student);
		 List<Students> rowsStudents = results.getRows();
		 long records =results.getRecords();//当前页记录数量
		 long totalPage =results.getTotalPage();//总页数
		 long total =results.getTotal();//总数据量
		 long page =results.getPage();//当前页
		//...
	}

	//mapper id分页查询
	@Test
	public void queryPageResultsByMapperId() throws Exception{
		_logger.info("queryPageResults by mapperId...");
		 Students student=new Students();
		 student.setStdGender("M");
		 //student.setStdMajor(政治");
		 student.setPageSize(10);
		 student.setPageNumber(2);
		 JpaPageResults<Students>  results =
				 service.queryPageResults("queryPageResults1",student);
		//...
	}

3、mapper配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<mapper namespace="org.apache.mybatis.jpa.test.dao.persistence.StudentsMapper" >
	<sql id="sql_condition">
		WHERE	1	=	1
    	<if test="id != null">
			AND	ID	=	'${id}'
		</if>
		<if test="stdName != null  and stdName != '' ">
			AND STDNAME like '%${stdName}%'
		</if>
		<if test="stdGender != null  and stdGender != '' ">
			AND	STDGENDER	=	#{stdGender}
		</if>
		<if test="stdMajor != null">
			<![CDATA[AND	STDMAJOR	= #{stdMajor}]]>
		</if>
	</sql>
	
    <select id="queryPageResults" parameterType="Students" resultType="Students">
    	SELECT 
    		ID		   ,
			STDNO      ,
			STDNAME    ,
			STDGENDER  ,
			STDAGE     ,
			STDMAJOR   ,
			STDCLASS 
    	FROM STUDENTS 
    	<include refid="sql_condition"/>
    </select>
 
     <select id="queryPageResults1" parameterType="Students" resultType="Students">
    	SELECT 
    		ID		   ,
			STDNO      ,
			STDNAME    ,
			STDGENDER  ,
			STDAGE     ,
			STDMAJOR   ,
			STDCLASS 
    	FROM STUDENTS 
    	<include refid="sql_condition"/>
    </select>
       
     <select id="queryBy" parameterType="Students" resultType="Students">
    	SELECT 
    		ID		   ,
			STDNO      ,
			STDNAME    ,
			STDGENDER  ,
			STDAGE     ,
			STDMAJOR   ,
			STDCLASS 
    	FROM ROLES 
    	<include refid="sql_condition"/>
    </select>
  
    <delete id="delete" parameterType="Students" >
    	DELETE FROM STUDENTS WHERE ID=#{id}
    </delete>

4、SpringBoot配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#
spring.datasource.username=root
spring.datasource.password=maxkey
spring.datasource.url=jdbc:mysql://localhost/test?autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

mybatis.dialect=mysql
mybatis.type-aliases-package=org.apache.mybatis.jpa.test.entity
mybatis.mapper-locations=classpath*:/org/apache/mybatis/jpa/test/dao/persistence/xml/${mybatis.dialect}/*.xml
mybatis.table-column-escape=true
mybatis.table-column-snowflake-datacenter-id=1
mybatis.table-column-snowflake-machine-id=1
#mybatis.table-column-escape-char=`

5、相关资源

MyBatis网站

MyBatis GitHub源码

MaxKey单点登录认证系统 GitHub源码

MaxKey单点登录认证系统 Gitee源码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Coravel : .NET 轻量级任务调度与后台任务处理
Coravel 是一个专为 .NET 应用设计的轻量级后台任务框架,无需复杂配置即可实现任务调度、队列处理、缓存管理、事件广播等功能。
郑子铭
2025/08/06
910
Coravel : .NET 轻量级任务调度与后台任务处理
.NET之Hangfire快速入门和使用
  定时任务调度问题,是一个老生常谈的问题。网上有许多定时任务调度的解决方案,对于我而言很早以前主要是使用Window计划和Window服务来做任务定时执行,然后就开始使用定时任务调度框架Quartz.Net。但是却一直没有上手过Hangfire这个自带后台任务调度面板,可以在后台手动执行任务的神奇的任务调度框架。前段时间终于开始对他下手了,通过在网上查阅了一些资料和查看了Hangfire在Github中的demo,终于在我自己的项目中用上了Hangfire。在该篇文章中主要简单介绍一下什么是Hangfire,Hangfire的基本特征与优点和分别使用MySQL,MS SQL Server作为存储使用。
追逐时光者
2019/09/30
2.3K0
.NET之Hangfire快速入门和使用
Hangfire .NET任务调度框架实例
Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台(后台任务调度面板),可以直观明了的查看作业调度情况。
GoodTime
2023/10/31
6760
NET任务调度框架Hangfire使用指南
Hangfire 是一个开源的 .NET 任务调度框架,它允许开发人员轻松地将长时间运行的任务、定时任务和其他后台处理从主线程中分离出来,以提高应用程序的响应速度和性能
Net分享
2024/12/10
6120
NET任务调度框架Hangfire使用指南
手机号定位最简单的几种方法
手机生成的定位数据可以显示设备在一段时间内的位置。通过手机号码追踪某人的位置历史记录,对于寻找丢失的手机或监视儿童非常有用。不过,只有使用正确的工具才有可能做到这一点。本文将探讨跟踪手机号码位置历史记录的方法,帮助您确定最佳匹配对象。
知识与交流
2024/06/17
5K0
手机号定位最简单的几种方法
NetCore 中 后台任务利器之Hangfire 的使用
Hangfire 是一个开源的.NET任务调度框架,目前1.6+版本已支持.NET Core。它最大特点在于内置提供集成化的控制台,方便后台查看及监控:
明志德道
2023/10/21
3.7K0
NetCore 中 后台任务利器之Hangfire 的使用
dotnet 控制台 Hangfire 后台定时任务
本文告诉大家如何在 dotnet core 的控制台通过 Hangfire 开启后台定时任务
林德熙
2019/03/20
1.7K0
ABP入门系列(20)——使用后台作业和工作者
源码路径:Github-LearningMpaAbp 1.引言 说到后台作业,你可能条件反射的想到BackgroundWorker,但后台作业并非是后台任务,后台作业用一种队列且持久稳固的方式安排一些待执行后台任务。 为执行长时间运行的任务而用户无需等待,以提高用户体验。 为创建可重试且持久稳固的任务来保证一个代码将会被成功运行,以提高系统的稳定性。 那什么又是后台工作者呢? 后台工作者则是简单运行在应用程序后台的独立线程,它用于定期执行一些任务。 一个后台工作者可以定期清除临时表、重建索引。 一个后台
圣杰
2018/01/11
3.7K0
ABP入门系列(20)——使用后台作业和工作者
.NET Core/.NET5/.NET6 开源项目任务调度组件汇总
SQL Server 与 Redis 持久化支持。Hangfire使用持久性存储来存储作业、队列和统计信息,并让它们在应用程序重启后继续存在。存储子系统的抽象程度足以支持经典的SQL Server和快速的Redis。
郑子铭
2025/01/13
4940
.NET Core/.NET5/.NET6 开源项目任务调度组件汇总
ASP.NET Core开源任务调度框架Hangfire实战演练
第一步:配置连接字符串,目前就是持久化我们的作业Job任务,这里我们采用MS SQLSERVER,持久化方式有很多种数据库支持,具体大家看一下官网。
跟着阿笨一起玩NET
2021/02/02
2.7K0
基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
在之前的文章《推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler》和《简单、轻量、功能非常强大的C#/ASP.NET定时调度任务执行管理组件–FluentScheduler之实例篇》中,我们认识和了解了FluentScheduler这款轻量的定时任务调度执行组件。今天再给大家介绍一款关于定时任务调度执行的组件–Quartz.Net,Quartz.Net是Java版Quartz的.NET实现。 相对FluentScheduler实现定时调度任务的使用简
Rector
2018/02/01
4K0
基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...
原文由Rector首发于 码友网 之 《C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire》
Rector
2020/06/19
4.2K0
开源的.NET定时任务组件Hangfire解析
彭泽0902
2018/01/04
2.6K0
开源的.NET定时任务组件Hangfire解析
在 ASP.NET Core 中构建自定义后台任务队列,无需 hangfire
在 ASP.NET Core 中构建可扩展的 Web 应用程序时,通常需要执行耗时的任务,例如发送电子邮件、数据处理或调用外部 API,而不会阻止主要的请求-响应流。在后台运行这些操作可以显著提高应用程序性能。
郑子铭
2024/12/05
7610
在 ASP.NET Core 中构建自定义后台任务队列,无需 hangfire
SignalR+Hangfire 实现后台任务队列和实时通讯
Hangfire是一个.NET的开源后台任务框架提供统一的编程模型,以可靠的方式处理后台任务
郑子铭
2023/08/30
4420
SignalR+Hangfire 实现后台任务队列和实时通讯
如何在一天内建立物联网应用程序
物联网(IoT)的建立是为了解决现实世界中麻烦的问题,而将物联网技术整合到更广泛的信息生态系统中的过程几乎是同等麻烦的。这就是为什么物联网不是您可以在商店(或其他任何地方)购买,整齐打包并可以随时带走的东西。您需要使用大量的时间、耐心和TLC构建您的物联网解决方案,或者将您的设备连接到一个应用程序支持平台,这个平台以前解决过类似的问题——可能会将您的物联网应用程序从18个月缩短到一天内。本文向您展示实现物联网的两种方法。
用户9527
2018/04/16
2.5K0
如何在一天内建立物联网应用程序
.NET Core/.NET5/.NET6 开源项目汇总2:任务调度组件
开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激、尊重。请严格遵守每个项目的开源协议后再使用。尊重知识产权,共建和谐开源社区。
张传宁IT讲堂
2021/06/22
2.6K0
.NET Core/.NET5/.NET6 开源项目汇总2:任务调度组件
python使用Flask,Redis和Celery的异步任务
随着Web应用程序的发展和使用的增加,用例也变得多样化。我们现在正在建设和使用网站来执行比以往任何时候都更复杂的任务。其中一些任务可以进行处理,并将反馈立即转发给用户,而其他任务则需要稍后进行进一步处理和结果转发。越来越多地采用Internet访问和支持Internet的设备导致最终用户流量增加。
拓端
2020/09/26
2.3K0
教程|Cloudera数据科学工作台CDSW之旅
Cloudera数据科学工作台CDSW是一个安全的企业数据科学平台,它使的数据科学家能够通过为其提供自己的分析管道来加快从勘探到生产的工作流程。CDSW使数据科学家能够利用现有的技能和工具(例如Python、R和Scala)在Hadoop集群中运行计算。
大数据杂货铺
2021/03/11
2.3K0
使用 Elastic 的 OpenAI 集成追踪使用情况和管理成本
在这个AI驱动的应用程序变得无处不在的时代,理解和管理语言模型的使用情况至关重要。OpenAI 一直处于开发高级语言模型的前沿,这些模型驱动着从聊天机器人到代码生成的众多应用程序。然而,随着应用程序的复杂性和规模的增长,观察确保最佳性能和成本效益的关键指标变得至关重要。特别是在性能和可靠性监控以及成本管理方面的需求,对于最大化语言模型的潜力至关重要。
点火三周
2025/03/17
1590
使用 Elastic 的 OpenAI 集成追踪使用情况和管理成本
推荐阅读
相关推荐
Coravel : .NET 轻量级任务调度与后台任务处理
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验