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教程 | 11分钟前 | java 反射
- Java菜鸟进阶宝典:Reflection反射机制及5大核心API详解
- 491浏览 收藏
-
- 文章 · java教程 | 34分钟前 | java 函数式接口
- Java函数式接口全解:手把手教你搞定Lambda表达式目标类型
- 459浏览 收藏
-
- 文章 · java教程 | 1小时前 | java 网络爬虫
- 手把手教学!Java爬虫实现网页抓取就这么简单
- 338浏览 收藏
-
- 文章 · java教程 | 1小时前 | java
- JavaRuntime.exec教程:手把手教你用它执行外部命令
- 408浏览 收藏
-
- 文章 · java教程 | 1小时前 | 原子类 CAS机制
- Java原子类怎么实现?CAS机制原来是这样工作的
- 330浏览 收藏
-
- 文章 · java教程 | 1小时前 | Java线程池 线程池场景
- Java线程池这样用才叫高效!四大线程池场景实战全解析
- 494浏览 收藏
-
- 文章 · java教程 | 2小时前 | Java集合
- JavaCollection到底是什么?集合框架四大接口超详细解读
- 238浏览 收藏
-
- 文章 · java教程 | 3小时前 | java 定时任务 quartz ScheduledExecutorService Timer
- Java实现定时任务?手把手教你三种定时调度方法
- 220浏览 收藏
-
- 文章 · java教程 | 4小时前 | 性能 HashMap 线程安全 concurrenthashmap Hashtable
- JavaHashMap和Hashtable傻傻分不清?这篇帮你搞定
- 179浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 91次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 99次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 101次使用
-
- 稿定PPT
- 告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
- 97次使用
-
- Suno苏诺中文版
- 探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
- 95次使用
-
- 提升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浏览