<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # EclipseLink 簡介 原文:http://zetcode.com/java/eclipselink/ 在本教程中,我們學習 EclipseLink 的基礎。 在示例中,我們使用 Derby 和 Spring Boot。 這些項目是使用 NetBeans 構建的。 ZetCode 擁有用于 MySQL Java 的完整電子書: [MySQL Java 編程電子書](/ebooks/mysqljava/)。 ## EclipseLink EclipseLink 是來自 Eclipse Foundation 的開源 Eclipse Persistence Services 項目。 該軟件提供了一個可擴展的框架,該框架允許 Java 開發者與各種數據服務進行交互,包括數據庫,Web 服務,對象 XML 映射和企業信息系統。 EclipseLink 基于 TopLink 產品,Oracle 從該產品中貢獻了源代碼來創建 EclipseLink 項目。 EclipseLink 是 Java Persistence API 的參考實現。 Java 持久性 API (JPA) 是 Java 應用編程接口規范,它描述了使用 Java 的應用中關系數據的管理。 Java 持久性查詢語言(JPQL) 是獨立于平臺的面向對象的查詢語言。 它是 JPA 規范的一部分。 JPQL 用于對關系數據庫中存儲的實體進行查詢。 它在很大程度上受到 SQL 的啟發,其查詢在語法上類似于 SQL 查詢,但是針對 JPA 實體對象而不是直接針對數據庫表進行操作。 實體是 Java 類,將與 JPA 保持在一起。 它必須用`javax.persistence.Entity`注解修飾。 此外,它必須具有`@Id`注解和`@GeneratedValue`,注解定義實體的主鍵的唯一 ID,該`@GeneratedValue`定義生成主鍵的策略。 `@Table`注解指定實體映射到的數據庫表。 `persistence.xml`是 JPA 中的標準配置文件。 它必須包含在包含實體 bean 的 JAR 文件內的`META-INF`目錄中。 在此文件中,我們定義了持久性單元,這些持久性單元定義了由應用中的實體管理器實例管理的所有實體類的集合。 `EntityManager`是管理實體的持久狀態的類。 ## EclipseLink 讀取數據 第一個示例是 Java 命令行程序,該程序從`Cars`表中檢索所有行。 我們創建一個新的 NetBeans Java Maven 項目。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>Persistence</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.6.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency> </dependencies> </project> ``` 在`pom.xml`文件中,我們定義了兩個依賴項:`eclipselink`和`derbyclient`。 ![Creating persistence.xml file](https://img.kancloud.cn/49/ef/49ef16a3d566e4dc2e233554fa6eebda_510x377.jpg) 圖:創建`persistence.xml`文件 要創建`persistence.xml`,請在項目文件上單擊鼠標右鍵,選擇“新建—其他”,然后選擇“持久性”類別。 有一個持久性單元選項。 `persistence.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="cars-pu" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/testdb"/> <property name="javax.persistence.jdbc.user" value="app"/> <property name="javax.persistence.jdbc.password" value="app"/> <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> <property name="javax.persistence.sql-load-script-source" value="META-INF/sql/data.sql"/> </properties> </persistence-unit> </persistence> ``` 在`persistence.xml`文件中,我們定義了一個名為`cars-pu`的持久性單元。 我們定義一個持久性供應器,它是一個 Derby 數據庫。 ```java <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> ``` 設置此屬性后,EclipseLink 將刪除并創建數據庫表。 `Cars`表是從提供的元數據創建的。 ```java <property name="javax.persistence.sql-load-script-source" value="META-INF/sql/data.sql"/> ``` 在這里,我們指定 SQL 文件,該文件將數據填充到表中。 ![The persistence.xml file](https://img.kancloud.cn/b5/c6/b5c615baf765909956597a7d3175be7e_234x75.jpg) 圖:`persistence.xml`文件 `persistence.xml`文件位于`META-INF`子目錄中 `data.sql` ```java INSERT INTO CARS(Name, Price) VALUES('Audi', 52642); INSERT INTO CARS(Name, Price) VALUES('Mercedes', 57127); INSERT INTO CARS(Name, Price) VALUES('Skoda', 9000); INSERT INTO CARS(Name, Price) VALUES('Volvo', 29000); INSERT INTO CARS(Name, Price) VALUES('Bentley', 350000); INSERT INTO CARS(Name, Price) VALUES('Citroen', 21000); INSERT INTO CARS(Name, Price) VALUES('Hummer', 41400); INSERT INTO CARS(Name, Price) VALUES('Volkswagen', 21600); ``` 這是用八行填充`Cars`表的 SQL。 `Car.java` ```java package com.zetcode; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="Cars") public class Car implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long Id; private String name; private int price; public Long getId() { return Id; } public void setId(Long Id) { this.Id = Id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } } ``` 這是我們的實體類。 它用`@Entity`注解修飾。 ```java @Table(name="Cars") ``` `@Table`注解引用 Derby 數據庫中的`Cars`表。 `DBClient.java` ```java package com.zetcode; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; public class DBClient { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("cars-pu"); EntityManager eman = emf.createEntityManager(); try { String sql = "SELECT c FROM Car c"; Query query = eman.createQuery(sql); List<Car> cars = query.getResultList(); for (Car car : cars) { System.out.printf("%d ", car.getId()); System.out.printf("%s ", car.getName()); System.out.println(car.getPrice()); } } finally { eman.close(); emf.close(); } } } ``` 這是一個 Java 控制臺應用,它在實體管理器的幫助下從`Cars`表中檢索所有行。 ```java EntityManagerFactory emf = Persistence.createEntityManagerFactory("cars-pu"); ``` 在 JEE 容器之外使用 EclipseLink 之類的 JPA 供應器時,我們必須通過`EntityManagerFactory`創建一個實體管理器。 使用持久性單元名稱作為參數,通過`Persistence.createEntityManagerFactory()`方法創建工廠。 ```java EntityManager eman = emf.createEntityManager(); ``` 從`EntityManagerFactory`中,我們使用`createEntityManager()`方法創建一個`EntityManager`。 創建的`EntityManager`是應用管理的實體管理器。 ```java String sql = "SELECT c FROM Car c"; ``` 看起來像 SQL 代碼,但不是。 它是 Java 持久性查詢語言(JPQL)語句的示例。 它從數據庫表返回所有`Car`實體。 ```java Query query = eman.createQuery(sql); ``` 使用`createQuery()`方法創建`Query`對象。 ```java List<Car> cars = query.getResultList(); ``` 從查詢對象中,我們獲得`Car`對象的列表。 ```java } finally { eman.close(); emf.close(); } ``` 對于由應用管理的實體管理器,我們必須顯式關閉資源。 ```java 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600 ``` 啟動 Derby,構建應用并執行它之后,我們得到此輸出。 ## EclipseLink 保存新行 在第二個示例中,我們將一個新的汽車對象保存到數據庫中。 `pom.xml`,`persistence.xml`和`Car.java`與前面示例中使用的相同。 `DBClient2.java` ```java package com.zetcode; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class DBClient2 { public static void main(String[] args) { EntityManagerFactory efact = Persistence.createEntityManagerFactory("cars-pu"); EntityManager eman = efact.createEntityManager(); try { eman.getTransaction().begin(); Car car = new Car(); car.setName("Toyota"); car.setPrice(26700); eman.persist(car); eman.getTransaction().commit(); } finally { eman.close(); efact.close(); } } } ``` 該示例創建一個新的汽車對象并將其保存在數據庫中。 ```java eman.getTransaction().begin(); ``` JEE 容器外部不提供自動事務管理; 因此,我們必須手動創建一個新事務。 ```java Car car = new Car(); car.setName("Toyota"); car.setPrice(26700); ``` 創建一個新的汽車實體。 該 ID 將由 Derby 生成。 ```java eman.persist(car); ``` `persist()`方法將實體保存到數據庫中。 ```java eman.getTransaction().commit(); ``` 事務已提交。 ## EclipseLink 的 Spring Boot 示例 在此示例中,我們將 EclipseLink 集成到 Spring Boot 應用中。 Spring 是流行的 Java 應用框架。 Spring Boot 是 Spring 的解決方案,用于創建獨立的,生產級的基于 Spring 的應用。 這是一個新的解決方案,可以以最少的工作量創建 Spring 應用。 以下示例的資源也可從作者的 Github [倉庫](https://github.com/janbodnar/Spring-Boot-EclipseLink)中獲得。 ![Spring Boot project](https://img.kancloud.cn/e0/34/e03473e4edfb5809b13a939de84ae019_265x381.jpg) 圖:Spring Boot 項目 這是 NetBeans 中的 Spring Boot 項目。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>SpringBootEclipseLink</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.3.RELEASE</version> <relativePath /> </parent> <dependencies> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.6.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <artifactId>hibernate-entitymanager</artifactId> <groupId>org.hibernate</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId> org.eclipse.persistence.jpa.modelgen.processor </artifactId> <version>2.5.2</version> <scope>provided</scope> </dependency> </dependencies> </project> ``` 這是 Maven 項目文件。 我們具有 EclipseLink,Derby,Hibernate Validator 和 Spring Boot 的依賴項。 `application.properties` ```java # Derby spring.datasource.driverClassName=org.apache.derby.jdbc.ClientDriver spring.datasource.url=jdbc:derby://localhost:1527/testdb spring.datasource.username=app spring.datasource.password=app ``` 在`application.properties`文件中,我們定義了 Derby 的數據源。 `persistence.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="cars-pu" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/testdb"/> <property name="javax.persistence.jdbc.user" value="app"/> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> <property name="javax.persistence.jdbc.password" value="app"/> <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> <property name="javax.persistence.sql-load-script-source" value="META-INF/sql/data.sql"/> </properties> </persistence-unit> </persistence> ``` 在`persistence.xml`文件中,我們創建一個持久性單元。 它稱為`cars-pu`。 我們還讓 EclipseLink 為我們創建一個數據庫表。 `data.sql` ```java INSERT INTO CARS(Name, Price) VALUES('Audi', 52642) INSERT INTO CARS(Name, Price) VALUES('Mercedes', 57127) INSERT INTO CARS(Name, Price) VALUES('Skoda', 9000) INSERT INTO CARS(Name, Price) VALUES('Volvo', 29000) INSERT INTO CARS(Name, Price) VALUES('Bentley', 350000) INSERT INTO CARS(Name, Price) VALUES('Citroen', 21000) INSERT INTO CARS(Name, Price) VALUES('Hummer', 41400) INSERT INTO CARS(Name, Price) VALUES('Volkswagen', 21600) ``` EclipseLink 將使用此 SQL 文件用數據填充自動創建的表。 `AppConf.java` ```java package com.zetcode.conf; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConf { @Bean public EntityManager entityManager(EntityManagerFactory entityManagerFactory) { return entityManagerFactory.createEntityManager(); } @Bean public EntityManagerFactory createEntityManagerFactory() { return Persistence.createEntityManagerFactory("cars-pu"); } } ``` 在`AppConf`中創建了兩個 bean:`EntityManagerFactory`和`EntityManager`。 `EntityManager`將被注入`CarsServiceImpl`中。 `Car.java` ```java package com.zetcode.bean; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; @Entity @Table(name="Cars") @NamedQueries({ @NamedQuery(name = "Car.findAll", query = "SELECT c FROM Car c"), @NamedQuery(name = "Car.findByName", query = "SELECT c FROM Car c WHERE c.name = :name") }) public class Car { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long Id; private String name; private int price; public Long getId() { return Id; } public void setId(Long Id) { this.Id = Id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } } ``` 這是我們的`Entity` bean。 ```java @NamedQueries({ @NamedQuery(name = "Car.findAll", query = "SELECT c FROM Car c"), @NamedQuery(name = "Car.findByName", query = "SELECT c FROM Car c WHERE c.name = :name") }) ``` 該類用命名查詢注解,這是 JPQL 語句,用于檢索所有汽車對象并按名稱查找汽車。 `CarsService.java` ```java package com.zetcode.service; import com.zetcode.bean.Car; import java.util.List; public interface CarsService { public void saveCar(Car car); public Car findCarByName(String name); public List<Car> findAll(); } ``` 在`CarsService`接口中,我們定義了通過實體管理器訪問數據庫的合同方法。 `CarsServiceImpl.java` ```java package com.zetcode.service; import com.zetcode.bean.Car; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import org.springframework.stereotype.Component; @Component public class CarsServiceImpl implements CarsService { @PersistenceContext EntityManager em; @Override public void saveCar(Car car) { em.getTransaction().begin(); em.persist(car); em.getTransaction().commit(); } @Override public Car findCarByName(String name) { Query query = em.createNamedQuery("Car.findByName"); query.setParameter("name", name); Car car = (Car) query.getSingleResult(); return car; } @Override public List<Car> findAll() { Query query = em.createNamedQuery("Car.findAll"); List<Car> cars = query.getResultList(); return cars; } } ``` `CarsServiceImpl`是一個業務服務類,它實現以下方法:保存汽車,按汽車名稱查找汽車,以及從數據庫中檢索所有汽車。 ```java @PersistenceContext EntityManager em; ``` 將`EntityManager`與`@PersistenceContext`注解一起注入到類中。 ```java @Override public void saveCar(Car car) { em.getTransaction().begin(); em.persist(car); em.getTransaction().commit(); } ``` `saveCar()`方法通過`EntityManager`的`persist()`方法將汽車保存到數據庫中。 `persist()`方法放置在手動創建的事務中。 ```java @Override public Car findCarByName(String name) { Query query = em.createNamedQuery("Car.findByName"); query.setParameter("name", name); Car car = (Car) query.getSingleResult(); return car; } ``` `findCarByName()`方法通過其名稱查找汽車。 `createNamedQuery()`創建一個命名查詢; 它引用`Car`實體類中定義的命名查詢。 使用`setParameter()`方法將參數設置為命名查詢。 ```java @Override public List<Car> findAll() { Query query = em.createNamedQuery("Car.findAll"); List<Car> cars = query.getResultList(); return cars; } ``` 創建一個命名查詢`Car.findAll`。 查詢的`getResultList()`返回已檢索汽車的列表。 `MyRunner.java` ```java package com.zetcode.client; import com.zetcode.bean.Car; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Component; import com.zetcode.service.CarsService; @Component public class MyRunner implements CommandLineRunner { @Autowired private CarsService crs; @Override public void run(String... args) throws Exception { try { Car car = crs.findCarByName("Citroen"); System.out.printf("ID: %d%n", car.getId()); System.out.printf("Name: %s%n", car.getName()); System.out.printf("Price: %d%n", car.getPrice()); } catch (EmptyResultDataAccessException e) { System.out.println("Car was not found"); } List<Car> cars = crs.findAll(); for (Car car: cars) { System.out.printf("%d ", car.getId()); System.out.printf("%s ", car.getName()); System.out.println(car.getPrice()); } } } ``` `MyRunner`是 Spring Boot CLI 應用的命令行運行程序。 我們尋找雪鐵龍汽車,并從數據庫中檢索所有汽車。 ```java @Autowired private CarsService crs; ``` `CarsService` bean 被注入到`MyRunner`類中。 ```java Car car = crs.findCarByName("Citroen"); ``` 該服務的`findCarByName()`尋找一輛名為雪鐵龍的汽車。 ```java List<Car> cars = crs.findAll(); ``` 服務的`findAll()`方法從數據庫中檢索所有汽車。 `SpringDBCLIApp.java` ```java package com.zetcode.client; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; @EnableAutoConfiguration @ComponentScan(basePackages="com.zetcode") public class SpringDBCLIApp { public static void main(String[] args) { SpringApplication.run(SpringDBCLIApp.class, args); } } ``` `SpringDBCLIApp`設置 Spring Boot CLI 應用。 在本教程中,我們介紹了 EclipseLink JPA 供應器。 ZetCode 具有以下相關教程: [Spring `JdbcTemplate`教程](/db/jdbctemplate/), [Hibernate Derby 教程](/db/hibernatederby/), [Java 教程](/lang/java/)和 [EJB 簡介](/java/ejb/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看