首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mybatis学习之CLOB、BLOB处理及多参数方法映射
本文介绍了mybatis中CLOB、BLOB类型数据的处理和多参数方法映射。主要包括了CLOB数据的存储、BLOB数据的存储、多参数方法映射以及通过mybatis进行多参数查询的方法。
用户1141560
2017/12/26
3.8K0
MyBatis-14MyBatis动态SQL之【foreach】
虽然可以使用{ids}方式直接获取值,但{ids}不能防止SQL注入, 想要避免SQL注入就需要用#{}的方式,这时就要配合使用foreach标签来满足需求.
小小工匠
2021/08/17
6480
mybatis学习之高级映射
根据文章内容撰写摘要总结。
用户1141560
2017/12/26
8970
mybatis学习之高级映射
mybatis学习之分页
本文介绍了分页查询的一种常见方式,分为物理分页和逻辑分页。物理分页是先查询所有数据,再根据页码筛选结果;逻辑分页则是直接根据页码查询对应的数据。物理分页通常使用limit关键字进行控制,而逻辑分页则需要使用RowBounds进行控制。同时,本文还提供了一个例子来演示如何实现这两种分页方式。
用户1141560
2017/12/26
6690
MyBatis学习总结(一)——ORM概要与MyBatis快速起步
程序员应该将核心关注点放在业务上,而不应该将时间过多的浪费在CRUD中,多数的ORM框架都把增加、修改与删除做得非常不错了,然后数据库中查询无疑是使用频次最高、复杂度大、与性能密切相关的操作,我们希望得到一种使用方便,查询灵活的ORM框架,MyBatis可以满足这些要求,MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,它也是SSM框架集成中的重要组成部分。
张果
2018/10/09
9650
MyBatis学习总结(一)——ORM概要与MyBatis快速起步
跟我一起学mybatis之注解开发多表操作
实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置
楠羽
2022/11/18
3940
跟我一起学mybatis之注解开发多表操作
MyBatis(2)——MyBatis 深入学习
编写日志输出环境配置文件 在开发过程中,最重要的就是在控制台查看程序输出的日志信息,在这里我们选择使用 log4j 工具来输出: 准备工作: 将【MyBatis】文件夹下【lib】中的 log4j 开头的 jar 包都导入工程并添加依赖。 在【src】下新建一个文件 log4j.properties 资源: # Global logging configuration # 在开发环境下日志级别要设置成 DEBUG ,生产环境设为 INFO 或 ERROR log4j.rootLogger=DEBUG
我没有三颗心脏
2018/04/26
9220
MyBatis(2)——MyBatis 深入学习
掌握Mybatis动态映射,我可是下了功夫的
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
田维常
2020/12/14
4840
Mybatis 注解
  我们可以看到,明明结果已经查询出来了,为什么打印出来却是空的。这个是因为属性名和列名不一致造成的,类似于我们这种 sId ☞ s_id 可以打开驼峰之自动转换。如果二者之间没有任何联系就需要使用 @Results 一一映射。
Demo_Null
2020/09/28
3680
Mybatis 注解
《Mybatis 手撸专栏》第8章:把反射用到出神入化
我们都知道作为一个程序员,如果想学习到更深层次的技术,就需要阅读大量的框架源码,学习这些框架源码中的开发套路和设计思想,从而提升自己的编程能力。
小傅哥
2022/06/13
8040
《Mybatis 手撸专栏》第8章:把反射用到出神入化
Spring Boot + MyBatisPlus,简直完美!
mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。整理了一份272页Mybatis学习笔记
程序员白楠楠
2021/02/01
1.1K0
mybatis学习之入门实例
根据提供的文章内容,这是一篇关于技术社区和Java技术相关的文章。文章介绍了Java技术的发展历程和应用场景,并详细讲解了Java技术在现代软件系统开发中的应用。同时,文章还提供了相关的代码示例和截图,以帮助读者更好地理解Java技术的实现细节。
用户1141560
2017/12/26
8200
mybatis学习之入门实例
Mybatis【入门】
什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为
Java3y
2018/03/15
1.9K0
Mybatis【入门】
springboot集成jpa
spring data jpa简介 spring data jpa是spring基于hibernate及jpa规范封装出来的一套持久层框架。该框架极大的降低了开发者工作量,提升开发效率。提供的关键字可以在不编写sql的情况下满足大部分需求。 1.集成spring data jpa,增加maven依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s
名山丶深处
2018/05/22
9410
spring整合Mybatis-plus[通俗易懂]
今天就随便说说spring整合mybatis-plus,就不再搭建一个web项目了,简单做一个测试类。
全栈程序员站长
2022/09/06
4830
spring整合Mybatis-plus[通俗易懂]
SpringBoot学习笔记(五)——Spring Boot中使用MyBatis进阶
mybatis框架运行时可以调整一些运行参数。比如,开启二级缓存,开启延迟加载等等。全局参数会影响mybatis的运行行为。
张果
2022/05/09
1.8K0
SpringBoot学习笔记(五)——Spring Boot中使用MyBatis进阶
SpringBoot开发案例之整合Spring-data-jpa进阶篇
有人说 从 jdbc->jdbctemplate->hibernation/mybatis 再到 jpa,真当开发人员的学习时间不要钱?我觉得到 h/m 这一级的封装已经有点过了,再往深处走就有病了。
小柒2012
2018/03/30
1.1K1
SpringBoot开发案例之整合Spring-data-jpa进阶篇
MyBatis Plus 真香
mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。
二哥聊运营工具
2021/12/17
5880
MyBatis Plus 真香
flea-db使用之JPA接入
MySQL 的 JDBC 驱动 mysql-connector-java-5.1.25.jar
huazie
2024/08/06
2641
flea-db使用之JPA接入
MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
在上一章中我们学习了《MyBatis学习总结(一)——ORM概要与MyBatis快速起步》,这一章主要是介绍MyBatis核心配置文件、使用接口+XML实现完整数据访问、输入参数映射与输出结果映射等内容。
张果
2018/10/09
1.5K0
MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
相关推荐
mybatis学习之CLOB、BLOB处理及多参数方法映射
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档