Java Hibernate使用方法怎么使用
小伙伴们对文章编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Java Hibernate使用方法怎么使用》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!
Jpa是满足JavaEE开发的标准之一,应用于持久化框架,如Hibernate等,这些框架符合Jpa标准,因此实现了相同的接口;能通过XML或者注解的方式实现ORM(对象关系映射),采用面向对象的而非面向数据库的开发方式。例如在使用Hibernate的时候,相比于Mybatis它是偏于自动化生成,可以通过注解javax.persistence.Entity的方式便可以实现数据库实体类的声明,完成表的创建;通过注解的方式将SQL语句置于代码当中,描述实体的映射关系。与MyBatis使用相比,代码中没有了Mapper映射文件。
JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
Hibernate的使用
Hibernate是Jpa的一种落实,首先引入相关的jar包,使用maven进行管理:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.hibernate.version>5.5.3.Final</project.hibernate.version> </properties> <dependencies> <!-- hibernate对jpa的支持包 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${project.hibernate.version}</version> </dependency> </dependencies>
默认扫描META-INF下的配置文件,因此在resources目录下创建META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <!-- 配置持久化单元 name:名称 事务类型 --> <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL"> <!-- 配置JPA规范的服务提供者,这里使用hibernate--> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/db5"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="123456"/> <!--在控制台输出sql语句--> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <!--首先采用创建的类型, 如果不存在表首先创建一个;会覆盖原来的数据--> <!--<property name="hibernate.hbm2ddl.auto" value="create"/>--> <!--更新数据--> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>
这里的配置中,hibernate.hbm2ddl.auto 能够确定sql的状态,如果为create,在其他操作之前首先判断是否存在实体类所属表,如果没有则先进行创建;但是不要使用create进行更新操作,因为后续的操作都是在原来的基础上进行覆盖
如果需要进行更新(add,update,delete)将value改为update
创建实体类 Customer,省略了get,set方法,可以使用lombok插件
@Entity//声明这是一个实体类 @Table(name = "cst_customer") // 表名,如果为create状态且表不存在,自动创建 @ToString public class Customer implements Serializable { // 表示cust_id为表的主键 @Id // 主键生成策略,这里为自增主键 @GeneratedValue(strategy = GenerationType.IDENTITY) // 表名列,数据库列明与Java对象的对应关系 @Column(name = "cust_id") private Long custId; @Column(name = "cust_name") private String custName; @Column(name = "cust_source") private String custSource; @Column(name = "cust_industry") private String custIndustry; @Column(name = "cust_level") private String custLevel; @Column(name = "cust_address") private String custAddress; @Column(name = "cust_phone") private String custPhone; }
测试方法,使用Junit
@Test public void test01() { // 创建一个管理的工厂,这里构造器的名字与persistence.xml的配置持久化单元名字相同 EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpa"); // 创建实体管理 EntityManager entityManager = emf.createEntityManager(); // 获取事务对象 EntityTransaction transaction = entityManager.getTransaction(); // 开启事务 transaction.begin(); Customer user = new Customer(); user.setCustName("righteye_db"); // 持久化对象 entityManager.persist(user); // 提交事务 transaction.commit(); // 释放资源 entityManager.close(); emf.close(); }
Hibernate的基础使用结束
最后的持久化对象的创建流程相同,可以将创建实体工厂的流程抽象成工具类,简单的样例:
public final class JPAUtils { public static EntityManager entityManager = null; static { EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpa"); entityManager = emf.createEntityManager(); } public static EntityManager getEntityManager() { return entityManager; } }
Spring整合Hibernate
application.xml spring的配置文件如下:
<!-- 1.dataSource 配置数据库连接池--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db5?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai" /> <property name="user" value="root" /> <property name="password" value="123456" /> </bean> <!-- 2.配置entityManagerFactory --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan" value="com.righteye.entity" /> <property name="persistenceProvider"> <bean class="org.hibernate.jpa.HibernatePersistenceProvider" /> </property> <!--JPA的供应商适配器--> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="generateDdl" value="false" /> <property name="database" value="MYSQL" /> <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /> <property name="showSql" value="true" /> </bean> </property> <property name="jpaProperties"> <props> <!--可以设置是否自动创建表--> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <property name="jpaDialect"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> </property> </bean> <!-- 3.事务管理器--> <!-- JPA事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!-- 整合spring data jpa--> <jpa:repositories base-package="com.righteye.dao" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"></jpa:repositories> <context:component-scan base-package="com.righteye"></context:component-scan> <!--组装其它 配置文件--> </beans>
自定义查询
ep:通过custName和custID查询Customer
CustomerDao接口的声明, 继承两个父类接口:
public interface CustomerDao extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> { // ... }
在继承的两个接口中已经实现了若干简单的方法,支持简单的单表操作;如果需要自定义查询,如下:
CustomerDao接口中声明方法:
@Query("from Customer where custName = ?1 and custId = ?2") Customer findCustomerByCondition(String custName, Long custId);
@Query注解中写入JPQL,这里的表名
,字段
可以直接用Java中的变量表示,使用占位符代替传入的变量,如?1,?2
程序中正常调用:
@Test public void testMutliCondition() { Customer customer = customerDao.findCustomerByCondition("update", 1L); System.out.println(customer); }
多表关系实现
这里使用Customer(顾客)和LinkMan(联系人)实现表之间的一对多关系;这里设定顾客和联系人是一对多
在使用Hibernate的时候,主要使用@OneToMany注解;在一对多的关系中,存在着外键的概念;一般的设计是多表加外键,因此代码如下:
// Customer类 @Entity//声明这是一个实体类 @Table(name = "cst_customer") @ToString public class Customer implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "cust_id") private Long custId; @Column(name = "cust_name") private String custName; @Column(name = "cust_source") private String custSource; @Column(name = "cust_industry") private String custIndustry; @Column(name = "cust_level") private String custLevel; @Column(name = "cust_address") private String custAddress; @Column(name = "cust_phone") private String custPhone; // 使用列表存储多的一方的数据,使用@OneToMany,参数表示目标关联表 // JoinColumn 进行关联,reference(被参照的列) 主表列名:cust_id, 外键:lkm_cust_id @OneToMany(targetEntity = LinkMan.class) @JoinColumn(name = "lkm_cust_id",referencedColumnName = "cust_id") private List<LinkMan> lList = new ArrayList<>(); }
外键所在的表,使用的注解实际基本相似
// LinkMan类 @Entity @Table(name = "db_linkman") public class LinkMan implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "lkm_id") private Long lkmId; @Column(name = "lkm_name") private String lkmName; @Column(name="lkm_gender") private String lkmGender; @Column(name="lkm_phone") private String lkmPhone; @Column(name="lkm_mobile") private String lkmMobile; @Column(name="lkm_email") private String lkmEmail; @Column(name="lkm_position") private String lkmPosition; @Column(name="lkm_memo") private String lkmMemo; // LinkMan和Customer是多对一的关系 @ManyToOne(targetEntity = Customer.class) // 多的表加外键,并且指定外键关联的列名 @JoinColumn(name = "lmk_cust_id", referencedColumnName = "cust_id") private Customer customer; }
测试代码,如果设置了auto为create,代码执行完可以自动创建表
@Test public void test03() { LinkMan lm = new LinkMan(); lm.setLkmName("linkman"); Customer customer = new Customer(); customer.setCustName("customer"); customerDao.save(customer); linkManDao.save(lm); }
终于介绍完啦!小伙伴们,这篇关于《Java Hibernate使用方法怎么使用》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

- 上一篇
- win10关机命令是什么_win10怎么设置自动关机命令

- 下一篇
- win8电脑关闭错误报告操作方法介绍
-
- 文章 · java教程 | 2分钟前 |
- SpringRetry指数退避配置全解析
- 490浏览 收藏
-
- 文章 · java教程 | 19分钟前 |
- Java WebSocket消息重发机制实现方案
- 330浏览 收藏
-
- 文章 · java教程 | 22分钟前 |
- Java并发编程常见问题及解决方法
- 279浏览 收藏
-
- 文章 · java教程 | 38分钟前 | 字符串格式化 stringbuilder 不可变性 equals() JavaString类
- Java字符串操作技巧全解析
- 287浏览 收藏
-
- 文章 · java教程 | 44分钟前 |
- SpringBoot整合Micrometer监控MongoDB
- 101浏览 收藏
-
- 文章 · java教程 | 48分钟前 |
- Java加密算法全解析与数据安全防护
- 263浏览 收藏
-
- 文章 · java教程 | 49分钟前 |
- SpringBoot集成阿里云OSS上传教程
- 381浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- UITableView选中单元格获取日期值方法
- 319浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java多线程编程技巧与实战方法
- 318浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- JPA多租户架构:动态数据源切换实现多租户
- 384浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- SpringBoot整合RabbitMQ教程详解
- 190浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 163次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 155次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 166次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 166次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 174次使用
-
- 提升Java功能开发效率的有力工具:微服务架构
- 2023-10-06 501浏览
-
- 掌握Java海康SDK二次开发的必备技巧
- 2023-10-01 501浏览
-
- 如何使用java实现桶排序算法
- 2023-10-03 501浏览
-
- Java开发实战经验:如何优化开发逻辑
- 2023-10-31 501浏览
-
- 如何使用Java中的Math.max()方法比较两个数的大小?
- 2023-11-18 501浏览