您好,登錄后才能下訂單哦!
今天小編給大家分享一下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是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; } }
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使用方法怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。