天天看點

使用JPA進行資料操作使用JPA進行資料操作

使用JPA進行資料操作

  • 使用JPA進行資料操作
    • Preface
    • 環境工具
    • JPA基本過程說明
    • 将原dynamic web service 添加JPA facet
    • 建立entity class
    • 修改persistencexml
    • 建立JpaHandle類對資料進行操作
    • 對應修改WebServicejava

Preface

  • 本smaple 使用java persistnece api 進行資料操作
  • 在之前jerseyRestfulservice&Client的基礎上需要進行細微的修改
  • 參考tutorialspoint
  • 本文原創,允許轉載但務必貼出本文連結

環境&工具

  • Jersey JAX-RS 2.0 RI bundle 解壓後将所有.jar檔案放在WebContent>WEB-INF>lib下面
  • json.jar 注:因為eclipse有特殊的喜好,在web servicejar 工程中,jar包的引用根據web容器而有所不同,對于tomcat,所有引用.jar必須放在web-info/lib/下
  • mysql-connector-java-5.1.35.tar.gz注:需要向oracle出賣自己的email他才會讓你下這個東西,之和後json.jar一樣需要放在web-info/lib/下
  • JPA eclipselink 同上,需要将其中所有的jar包放入web-info/lib/下
  • java version “1.8.0_40”
  • tomcat 8.0
  • eclipse Luna
  • mysql 5.6.19

JPA基本過程說明

  • Form Oracle: The Java Persistence API provides a POJO persistence model for object-relational mapping. The Java Persistence API was developed by the EJB 3.0 software expert group as part of JSR 220, but its use is not limited to EJB software components. It can also be used directly by web applications and application clients, and even outside the Java EE platform, for example, in Java SE applications.
  • 我的了解是:
    • run on server 之後加載jdbc和jpa函數庫
    • 入口是persistence.xml,進入後會根據配置通過jdbc資料源池連結到mysql
    • 查找之前編入相關annotation的實體(entity),将實體類map到資料庫
    • 在記憶體中copy實體媒體上的資料庫
    • 當有對資料庫的操作發生時,會首先通過類似sql的jpql在記憶體中的資料庫中進行操作,檢驗指令是否正确,成功後對應操作實體媒體上的資料庫
    • 當實體媒體上的資料庫完成了修改,會傳回修改記憶體中的資料庫
  • 從tutorialspoint中卡的圖:
    使用JPA進行資料操作使用JPA進行資料操作
    使用JPA進行資料操作使用JPA進行資料操作

将原dynamic web service 添加JPA facet

  • 如果原來的項目中沒有JPA facet需要從project->property中添加

建立entity class

package entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String title;
    private String description;

    public Book(int inputId, String inputTitle, String inputDescription) {
        super();
        this.id = inputId;
        this.title = inputTitle;
        this.description = inputDescription;
    }

    public Book() {
        super();
    }

    public int getId() {
        return this.id;
    }

    public String getTitle() {
        return this.title;
    }

    public String getDescription() {
        return this.description;
    }

    public int setId(int inputId) {
        this.id = inputId;
        return this.id;
    }

    public String setTitle(String inputTitle) {
        this.title = inputTitle;
        return this.title;
    }

    public String setDescription(String inputDescription) {
        this.description = inputDescription;
        return this.description;
    }

    @Override
    public String toString() {
        return "Book: [id:" + this.id + ", title:" + this.title + "]";
    }
}
           

修改persistence.xml

<?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="RestfulService">
        <class>entity.Book</class><!-- package.entityClass -->
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/LIBRARY"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="123456"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="eclipselink.logging.level" value="FINE"/>
            <property name="eclipselink.ddl-generation" value="create-tables"/>
        </properties>
    </persistence-unit>
</persistence>
           
注:因為預設情況下(不加@Column annotation),之後要寫的JPQL都會自動轉成大寫,而所用版本的mysql對大小寫敏感,是以這邊索性将database name 改為大寫,對應mysql那邊也做了修改

建立JpaHandle類對資料進行操作

package webService;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class JpaHandle {

    // for jpa test, if jpa service run well the titles of Book will show in console window
    public static void showTitle() {
        EntityManagerFactory bookFactory = Persistence.createEntityManagerFactory( "RestfulService" );
        EntityManager entityManager = bookFactory.createEntityManager();

        //Scalar function
        Query query = entityManager.createQuery("Select e.title from Book e");
        System.out.println("this is a test 2");
        List<String> list = query.getResultList();

        System.out.println("test list before");
        System.out.println(list.toString());
        System.out.println("test list after");
        int tempI = ;
        for(String e:list) {
            System.out.println("ok" + tempI);
            tempI++;
            System.out.println("Book title :"+e);
        }
    }

    // get the titles of Books 
    public static List<String> getTitle() {
        EntityManagerFactory bookFactory = Persistence.createEntityManagerFactory( "RestfulService" );
        EntityManager entityManager = bookFactory.createEntityManager();

        // Query query = entityManager.createQuery("select e from Book e where uppercase(e.title) = :title");
        Query query = entityManager.createQuery("Select e.title from Book e");
        List<String> list = query.getResultList();

        return list;
    }

}
           
如果檢視console會發現”Select e.title from Book e”作用在mysql時,會被自動轉成大寫,是以如果不使用@Column annotation或者其他設定,mysql中的table、column都需要換成大寫

對應修改WebService.java

package webService;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.json.JSONException;  
import org.json.JSONObject;

import java.util.List;

/* receive GET & POST requests from http://localhost:8080/RestfulService/API/restService */
@Path("/restService")
public class WebService {

    /* receive json data & search in mysql with it */
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response json_restResponse(InputStream incomingData) {
        // json receiving variables
        String receivedString = "";
        JSONObject receivedJson = null;


        // temp variables
        // returnCode will be send to client and be present in the console view
        String returnCode = "SEARCH PROGRESS & RESULTS:";

        // receive the json data as receivedJson(JSONObject)
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(incomingData));
            String line = null;
            while ((line = in.readLine()) != null) {
                receivedString += line;
            }
            try {
                // convert data stream to json
                receivedJson = new JSONObject(receivedString);
                returnCode += "\n\n- receive json data successfully...";

                // call jpa method
                List<String> title = JpaHandle.getTitle();
                System.out.println(receivedJson.toString());
                for(String e:title) {
                    returnCode += ("\n\ntitle:\t" + e);
                    if (e == receivedJson.getString("title")) {
                        returnCode += "\t-that's it!";
                    } else {
                        returnCode += ("\t-not the one I'm finding..." + e);
                    }
                }
            } catch (JSONException e){
                System.out.println(e);
            }
        } catch (Exception e) {
            System.out.println(e);
        }

        return Response.status().entity(returnCode).build();
    }

    /* receive the GET requests & test whether the server is on */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayPlainTextHello() {
        String returnCode = "this is a test~";

        return returnCode;
    }
}