Java Hibernate使用方法及整合查詢
提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
Jpa是滿足JavaEE開(kāi)發(fā)的標(biāo)準(zhǔn)之一,應(yīng)用于持久化框架,如Hibernate等,這些框架符合Jpa標(biāo)準(zhǔn),因此實(shí)現(xiàn)了相同的接口;能通過(guò)XML或者注解的方式實(shí)現(xiàn)ORM(對(duì)象關(guān)系映射),采用面向?qū)ο蟮亩敲嫦驍?shù)據(jù)庫(kù)的開(kāi)發(fā)方式。例如在使用Hibernate的時(shí)候,相比于Mybatis它是偏于自動(dòng)化生成,可以通過(guò)注解javax.persistence.Entity的方式便可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)實(shí)體類的聲明,完成表的創(chuàng)建;通過(guò)注解的方式將SQL語(yǔ)句置于代碼當(dāng)中,描述實(shí)體的映射關(guān)系。與MyBatis使用相比,代碼中沒(méi)有了Mapper映射文件。
JPA定義了獨(dú)特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴(kuò)展,它是針對(duì)實(shí)體的一種查詢語(yǔ)言,操作對(duì)象是實(shí)體,而不是關(guān)系數(shù)據(jù)庫(kù)的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級(jí)查詢特性,甚至還能夠支持子查詢。
Hibernate的使用
Hibernate是Jpa的一種落實(shí),首先引入相關(guān)的jar包,使用maven進(jìn)行管理:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.hibernate.version>5.5.3.Final</project.hibernate.version>
</properties>
<dependencies>
<!-- hibernate對(duì)jpa的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${project.hibernate.version}</version>
</dependency>
</dependencies>
默認(rèn)掃描META-INF下的配置文件,因此在resources目錄下創(chuàng)建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:名稱
事務(wù)類型
-->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
<!-- 配置JPA規(guī)范的服務(wù)提供者,這里使用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"/>
<!--在控制臺(tái)輸出sql語(yǔ)句-->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<!--首先采用創(chuàng)建的類型, 如果不存在表首先創(chuàng)建一個(gè);會(huì)覆蓋原來(lái)的數(shù)據(jù)-->
<!--<property name="hibernate.hbm2ddl.auto" value="create"/>-->
<!--更新數(shù)據(jù)-->
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
這里的配置中,hibernate.hbm2ddl.auto 能夠確定sql的狀態(tài),如果為create,在其他操作之前首先判斷是否存在實(shí)體類所屬表,如果沒(méi)有則先進(jìn)行創(chuàng)建;但是不要使用create進(jìn)行更新操作,因?yàn)楹罄m(xù)的操作都是在原來(lái)的基礎(chǔ)上進(jìn)行覆蓋
如果需要進(jìn)行更新(add,update,delete)將value改為update
創(chuàng)建實(shí)體類 Customer,省略了get,set方法,可以使用lombok插件
@Entity//聲明這是一個(gè)實(shí)體類
@Table(name = "cst_customer") // 表名,如果為create狀態(tài)且表不存在,自動(dòng)創(chuàng)建
@ToString
public class Customer implements Serializable {
// 表示cust_id為表的主鍵
@Id
// 主鍵生成策略,這里為自增主鍵
@GeneratedValue(strategy = GenerationType.IDENTITY)
// 表名列,數(shù)據(jù)庫(kù)列明與Java對(duì)象的對(duì)應(yīng)關(guān)系
@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;
}
測(cè)試方法,使用Junit
@Test
public void test01() {
// 創(chuàng)建一個(gè)管理的工廠,這里構(gòu)造器的名字與persistence.xml的配置持久化單元名字相同
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpa");
// 創(chuàng)建實(shí)體管理
EntityManager entityManager = emf.createEntityManager();
// 獲取事務(wù)對(duì)象
EntityTransaction transaction = entityManager.getTransaction();
// 開(kāi)啟事務(wù)
transaction.begin();
Customer user = new Customer();
user.setCustName("righteye_db");
// 持久化對(duì)象
entityManager.persist(user);
// 提交事務(wù)
transaction.commit();
// 釋放資源
entityManager.close();
emf.close();
}
Hibernate的基礎(chǔ)使用結(jié)束
最后的持久化對(duì)象的創(chuàng)建流程相同,可以將創(chuàng)建實(shí)體工廠的流程抽象成工具類,簡(jiǎn)單的樣例:
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 配置數(shù)據(jù)庫(kù)連接池-->
<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的供應(yīng)商適配器-->
<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>
<!--可以設(shè)置是否自動(dòng)創(chuàng)建表-->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
</bean>
<!-- 3.事務(wù)管理器-->
<!-- JPA事務(wù)管理器 -->
<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:通過(guò)custName和custID查詢Customer
CustomerDao接口的聲明, 繼承兩個(gè)父類接口:
public interface CustomerDao extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {
// ...
}
在繼承的兩個(gè)接口中已經(jīng)實(shí)現(xiàn)了若干簡(jiǎn)單的方法,支持簡(jiǎn)單的單表操作;如果需要自定義查詢,如下:
CustomerDao接口中聲明方法:
@Query("from Customer where custName = ?1 and custId = ?2")
Customer findCustomerByCondition(String custName, Long custId);
@Query注解中寫(xiě)入JPQL,這里的表名,字段可以直接用Java中的變量表示,使用占位符代替?zhèn)魅氲淖兞?,?1,?2
程序中正常調(diào)用:
@Test
public void testMutliCondition() {
Customer customer = customerDao.findCustomerByCondition("update", 1L);
System.out.println(customer);
}
多表關(guān)系實(shí)現(xiàn)
這里使用Customer(顧客)和LinkMan(聯(lián)系人)實(shí)現(xiàn)表之間的一對(duì)多關(guān)系;這里設(shè)定顧客和聯(lián)系人是一對(duì)多
在使用Hibernate的時(shí)候,主要使用@OneToMany注解;在一對(duì)多的關(guān)系中,存在著外鍵的概念;一般的設(shè)計(jì)是多表加外鍵,因此代碼如下:
// Customer類
@Entity//聲明這是一個(gè)實(shí)體類
@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;
// 使用列表存儲(chǔ)多的一方的數(shù)據(jù),使用@OneToMany,參數(shù)表示目標(biāo)關(guān)聯(lián)表
// JoinColumn 進(jìn)行關(guān)聯(lián),reference(被參照的列) 主表列名:cust_id, 外鍵:lkm_cust_id
@OneToMany(targetEntity = LinkMan.class)
@JoinColumn(name = "lkm_cust_id",referencedColumnName = "cust_id")
private List<LinkMan> lList = new ArrayList<>();
}
外鍵所在的表,使用的注解實(shí)際基本相似
// 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是多對(duì)一的關(guān)系
@ManyToOne(targetEntity = Customer.class)
// 多的表加外鍵,并且指定外鍵關(guān)聯(lián)的列名
@JoinColumn(name = "lmk_cust_id", referencedColumnName = "cust_id")
private Customer customer;
}
測(cè)試代碼,如果設(shè)置了auto為create,代碼執(zhí)行完可以自動(dòng)創(chuàng)建表
@Test
public void test03() {
LinkMan lm = new LinkMan();
lm.setLkmName("linkman");
Customer customer = new Customer();
customer.setCustName("customer");
customerDao.save(customer);
linkManDao.save(lm);
}
到此這篇關(guān)于Java Hibernate使用方法及整合查詢的文章就介紹到這了,更多相關(guān)Java Hibernate內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的Map接口實(shí)現(xiàn)類HashMap和LinkedHashMap詳解
這篇文章主要介紹了Java中的Map接口實(shí)現(xiàn)類HashMap和LinkedHashMap詳解,我們常會(huì)看到這樣的一種集合,IP地址與主機(jī)名,等,這種一一對(duì)應(yīng)的關(guān)系,就叫做映射,Java提供了專門(mén)的集合類用來(lái)存放這種對(duì)象關(guān)系的對(duì)象,需要的朋友可以參考下2024-01-01
SpringBoot整合PowerJob實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度
最近項(xiàng)目需要使用定時(shí)任務(wù),而使用了PowerJob做任務(wù)調(diào)度模塊,感覺(jué)這個(gè)框架真香,今天我們就來(lái)深入了解一下新一代的定時(shí)任務(wù)框架——PowerJob,需要的朋友可以參考下2024-03-03
spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中
這篇文章主要給大家介紹了關(guān)于spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
一文學(xué)習(xí)Java NIO的ByteBuffer工作原理
很多網(wǎng)友說(shuō)JDK又在寫(xiě)B(tài)ug!下面通過(guò)通過(guò)本文學(xué)習(xí)下為何Java NIO的ByteBuffer這么垃圾,涉及到ByteBuf API 的優(yōu)點(diǎn)及工作原理解析,感興趣的朋友跟隨小編一起看看吧2021-05-05
利用java反射機(jī)制調(diào)用類的私有方法(推薦)
下面小編就為大家?guī)?lái)一篇利用java反射機(jī)制調(diào)用類的私有方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
MybatisPlus使用@TableId主鍵id自增長(zhǎng)無(wú)效的解決
本文主要介紹了MybatisPlus使用@TableId主鍵id自增長(zhǎng)無(wú)效的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
基于javaweb+jsp的游泳館會(huì)員管理系統(tǒng)(附源碼)
這篇文章主要介紹了基于javaweb+jsp的游泳館會(huì)員管理系統(tǒng),開(kāi)發(fā)工具eclipse/idea/myeclipse/sts等均可配置運(yùn)行,此源代碼社和課程設(shè)計(jì),大作業(yè)及畢業(yè)設(shè)計(jì)項(xiàng)目,需要的朋友可以參考下2022-04-04
使用Java實(shí)現(xiàn)HTTP和HTTPS代理服務(wù)詳解
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)HTTP和HTTPS代理服務(wù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
Spring?EnableAsync注解異步執(zhí)行源碼解析
這篇文章主要為大家介紹了Spring?EnableAsync注解源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

