最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Hibernate使用方法及整合查詢

 更新時間:2023年04月06日 09:11:30   作者:右眸Remnant  
這篇文章主要介紹了Java使用與整合Hibernate,在正式進入Hibernate的高級應(yīng)用之前,需要了解聲明是數(shù)據(jù)模型與領(lǐng)域模型,這兩個概念將會幫助我們更好的理解實體對象的關(guān)聯(lián)關(guān)系映射

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

Jpa是滿足JavaEE開發(fā)的標(biāo)準(zhǔn)之一,應(yīng)用于持久化框架,如Hibernate等,這些框架符合Jpa標(biāo)準(zhǔn),因此實現(xiàn)了相同的接口;能通過XML或者注解的方式實現(xiàn)ORM(對象關(guān)系映射),采用面向?qū)ο蟮亩敲嫦驍?shù)據(jù)庫的開發(fā)方式。例如在使用Hibernate的時候,相比于Mybatis它是偏于自動化生成,可以通過注解javax.persistence.Entity的方式便可以實現(xiàn)數(shù)據(jù)庫實體類的聲明,完成表的創(chuàng)建;通過注解的方式將SQL語句置于代碼當(dāng)中,描述實體的映射關(guān)系。與MyBatis使用相比,代碼中沒有了Mapper映射文件。

JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關(guān)系數(shù)據(jù)庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。

Hibernate的使用

Hibernate是Jpa的一種落實,首先引入相關(guān)的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>

默認(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"/>
			<!--在控制臺輸出sql語句-->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <!--首先采用創(chuàng)建的類型, 如果不存在表首先創(chuàng)建一個;會覆蓋原來的數(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,在其他操作之前首先判斷是否存在實體類所屬表,如果沒有則先進行創(chuàng)建;但是不要使用create進行更新操作,因為后續(xù)的操作都是在原來的基礎(chǔ)上進行覆蓋

如果需要進行更新(add,update,delete)將value改為update

創(chuàng)建實體類 Customer,省略了get,set方法,可以使用lombok插件

@Entity//聲明這是一個實體類
@Table(name = "cst_customer")  // 表名,如果為create狀態(tài)且表不存在,自動創(chuàng)建
@ToString
public class Customer implements Serializable {
    // 表示cust_id為表的主鍵
    @Id
    // 主鍵生成策略,這里為自增主鍵
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    // 表名列,數(shù)據(jù)庫列明與Java對象的對應(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;
}

測試方法,使用Junit

@Test
    public void test01() {
        // 創(chuàng)建一個管理的工廠,這里構(gòu)造器的名字與persistence.xml的配置持久化單元名字相同
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpa");
        // 創(chuàng)建實體管理
        EntityManager entityManager = emf.createEntityManager();
        // 獲取事務(wù)對象
        EntityTransaction transaction = entityManager.getTransaction();
        // 開啟事務(wù)
        transaction.begin();
        Customer user = new Customer();
        user.setCustName("righteye_db");
        // 持久化對象
        entityManager.persist(user);
        // 提交事務(wù)
        transaction.commit();
        // 釋放資源
        entityManager.close();
        emf.close();
    }

Hibernate的基礎(chǔ)使用結(jié)束

最后的持久化對象的創(chuàng)建流程相同,可以將創(chuàng)建實體工廠的流程抽象成工具類,簡單的樣例:

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ù)庫連接池-->
    <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&amp;useUnicode=true&amp;characterEncoding=utf8&amp;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è)置是否自動創(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:通過custName和custID查詢Customer

CustomerDao接口的聲明, 繼承兩個父類接口:

public interface CustomerDao extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {
   // ...
}

在繼承的兩個接口中已經(jīng)實現(xiàn)了若干簡單的方法,支持簡單的單表操作;如果需要自定義查詢,如下:

CustomerDao接口中聲明方法:

@Query("from Customer where custName = ?1 and custId = ?2")
Customer findCustomerByCondition(String custName, Long custId);

@Query注解中寫入JPQL,這里的表名,字段可以直接用Java中的變量表示,使用占位符代替?zhèn)魅氲淖兞浚?1,?2

程序中正常調(diào)用:

@Test
public void testMutliCondition() {
   Customer customer = customerDao.findCustomerByCondition("update", 1L);
   System.out.println(customer);
}

多表關(guān)系實現(xiàn)

這里使用Customer(顧客)和LinkMan(聯(lián)系人)實現(xiàn)表之間的一對多關(guān)系;這里設(shè)定顧客和聯(lián)系人是一對多

在使用Hibernate的時候,主要使用@OneToMany注解;在一對多的關(guān)系中,存在著外鍵的概念;一般的設(shè)計是多表加外鍵,因此代碼如下:

// 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;
	// 使用列表存儲多的一方的數(shù)據(jù),使用@OneToMany,參數(shù)表示目標(biāo)關(guān)聯(lián)表
	// JoinColumn 進行關(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<>();
}

外鍵所在的表,使用的注解實際基本相似

// 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是多對一的關(guān)系
    @ManyToOne(targetEntity = Customer.class)
    // 多的表加外鍵,并且指定外鍵關(guān)聯(lián)的列名
    @JoinColumn(name = "lmk_cust_id", referencedColumnName = "cust_id")
    private Customer customer;
}

測試代碼,如果設(shè)置了auto為create,代碼執(zhí)行完可以自動創(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的Map接口實現(xiàn)類HashMap和LinkedHashMap詳解

    Java中的Map接口實現(xiàn)類HashMap和LinkedHashMap詳解

    這篇文章主要介紹了Java中的Map接口實現(xiàn)類HashMap和LinkedHashMap詳解,我們常會看到這樣的一種集合,IP地址與主機名,等,這種一一對應(yīng)的關(guān)系,就叫做映射,Java提供了專門的集合類用來存放這種對象關(guān)系的對象,需要的朋友可以參考下
    2024-01-01
  • SpringBoot整合PowerJob實現(xiàn)定時任務(wù)調(diào)度

    SpringBoot整合PowerJob實現(xiàn)定時任務(wù)調(diào)度

    最近項目需要使用定時任務(wù),而使用了PowerJob做任務(wù)調(diào)度模塊,感覺這個框架真香,今天我們就來深入了解一下新一代的定時任務(wù)框架——PowerJob,需要的朋友可以參考下
    2024-03-03
  • spring Boot打包部署到遠程服務(wù)器的tomcat中

    spring Boot打包部署到遠程服務(wù)器的tomcat中

    這篇文章主要給大家介紹了關(guān)于spring Boot打包部署到遠程服務(wù)器的tomcat中的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 一文學(xué)習(xí)Java NIO的ByteBuffer工作原理

    一文學(xué)習(xí)Java NIO的ByteBuffer工作原理

    很多網(wǎng)友說JDK又在寫B(tài)ug!下面通過通過本文學(xué)習(xí)下為何Java NIO的ByteBuffer這么垃圾,涉及到ByteBuf API 的優(yōu)點及工作原理解析,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 利用java反射機制調(diào)用類的私有方法(推薦)

    利用java反射機制調(diào)用類的私有方法(推薦)

    下面小編就為大家?guī)硪黄胘ava反射機制調(diào)用類的私有方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • MybatisPlus使用@TableId主鍵id自增長無效的解決

    MybatisPlus使用@TableId主鍵id自增長無效的解決

    本文主要介紹了MybatisPlus使用@TableId主鍵id自增長無效的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 基于javaweb+jsp的游泳館會員管理系統(tǒng)(附源碼)

    基于javaweb+jsp的游泳館會員管理系統(tǒng)(附源碼)

    這篇文章主要介紹了基于javaweb+jsp的游泳館會員管理系統(tǒng),開發(fā)工具eclipse/idea/myeclipse/sts等均可配置運行,此源代碼社和課程設(shè)計,大作業(yè)及畢業(yè)設(shè)計項目,需要的朋友可以參考下
    2022-04-04
  • 基于slf4j日志MDC輸出格式的問題

    基于slf4j日志MDC輸出格式的問題

    這篇文章主要介紹了基于slf4j日志MDC輸出格式的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 使用Java實現(xiàn)HTTP和HTTPS代理服務(wù)詳解

    使用Java實現(xiàn)HTTP和HTTPS代理服務(wù)詳解

    這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)HTTP和HTTPS代理服務(wù),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Spring?EnableAsync注解異步執(zhí)行源碼解析

    Spring?EnableAsync注解異步執(zhí)行源碼解析

    這篇文章主要為大家介紹了Spring?EnableAsync注解源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論

广西| 通河县| 宝丰县| 光泽县| 唐海县| 九台市| 屏南县| 康乐县| 高台县| 孟连| 堆龙德庆县| 民县| 桐城市| 高密市| 武汉市| 昌乐县| 信阳市| 安远县| 丽水市| 佳木斯市| 余江县| 张家口市| 定西市| 韶关市| 河南省| 津南区| 乌鲁木齐县| 新建县| 高尔夫| 洪雅县| 临朐县| 徐水县| 秭归县| 迁西县| 万载县| 娱乐| 龙里县| 达拉特旗| 开江县| 甘肃省| 姜堰市|