如何使用JAX-RS在Java中使用Web Service从数据库插入数据

spt*_*spt 13 java rest tomcat jersey

我是网络服务的新手.请给出如何在java中使用jersey JAX-RS从数据库插入和检索数据的建议?

bdo*_*han 13

下面是一个JAX-RS服务的示例,该服务作为会话bean实现,使用JPA进行持久化,JAXB用于消息传递.

客户服务

package org.example;

import java.util.List;

import javax.ejb.*;
import javax.persistence.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {

    @PersistenceContext(unitName="CustomerService",
                        type=PersistenceContextType.TRANSACTION)
    EntityManager entityManager;

    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public void create(Customer customer) {
        entityManager.persist(customer);
    }

    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("{id}")
    public Customer read(@PathParam("id") long id) {
        return entityManager.find(Customer.class, id);
    }

    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    public void update(Customer customer) {
        entityManager.merge(customer);
    }

    @DELETE
    @Path("{id}")
    public void delete(@PathParam("id") long id) {
        Customer customer = read(id);
        if(null != customer) {
            entityManager.remove(customer);
        }
    }

    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("findCustomersByCity/{city}")
    public List<Customer> findCustomersByCity(@PathParam("city") String city) {
        Query query = entityManager.createNamedQuery("findCustomersByCity");
        query.setParameter("city", city);
        return query.getResultList();
    }

}
Run Code Online (Sandbox Code Playgroud)

顾客

以下是其中一个实体的示例.它包含JPA和JAXB注释.

package org.example;

import java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;

import java.util.Set;

@Entity
@NamedQuery(name = "findCustomersByCity",
            query = "SELECT c " +
                    "FROM Customer c " +
                    "WHERE c.address.city = :city")
@XmlRootElement
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private long id;

    @Column(name="FIRST_NAME")
    private String firstName;

    @Column(name="LAST_NAME")
    private String lastName;

    @OneToOne(mappedBy="customer", cascade={CascadeType.ALL})
    private Address address;

    @OneToMany(mappedBy="customer", cascade={CascadeType.ALL})
    private Set<PhoneNumber> phoneNumbers;

}
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息


UPDATE

什么是所需的罐子

您可以将JAX-RS/EJB/JPA/JAXB应用程序部署到任何符合Java EE 6的应用程序服务器,而无需任何其他服务器设置.对客户端进行编程,您可以从Jersey(http://jersey.java.net/)获取JAX-RS API,从EclipseLink获取JPA和JAXB API(http://www.eclipse.org/eclipselink/).

以及写入数据库连接的位置

JDBC资源和连接池

您需要在应用程序服务器上配置连接池.以下是在GlassFish上执行此操作的步骤.步骤将根据您使用的应用程序服务器而有所不同.

  1. 将JDBC驱动程序(ojdbc14.jar)复制到/ glashfish/lib
  2. 启动管理控制台
  3. 创建连接池:
    1. Name = CustomerService
    2. 资源类型='javax.sql.ConnectionPoolDataSource'
    3. 数据库供应商= Oracle(或任何适合您的数据库的数据库供应商)
    4. 单击"下一步"并填写以下"其他属性":
    5. 用户(例如CustomerService)
    6. 密码(例如密码)
    7. URL(例如jdbc:oracle:thin:@localhost:1521:XE)
    8. 使用"Ping"按钮测试数据库连接
  4. 创建名为"CustomerService"的JDBC资源
    1. JNDI Name = CustomerService
    2. 池名称= CustomerService(您在上一步中创建的连接池的名称)

JPA配置

然后我们在persistence.xmlJPA实体的文件中引用我们上面创建的数据库连接,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    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_1_0.xsd">
    <persistence-unit name="CustomerService" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>CustomerService</jta-data-source>
        <class>org.example.Customer</class>
        <class>org.example.Address</class>
        <class>org.example.PhoneNumber</class>
        <properties>
            <property name="eclipselink.target-database" value="Oracle" />
            <property name="eclipselink.logging.level" value="FINEST" />
            <property name="eclipselink.logging.level.ejb_or_metadata" value="WARNING" />
            <property name="eclipselink.logging.timestamp" value="false"/>
            <property name="eclipselink.logging.thread" value="false"/>
            <property name="eclipselink.logging.session" value="false"/>
            <property name="eclipselink.logging.exceptions" value="false"/> 
            <property name="eclipselink.target-server" value="SunAS9"/> 
        </properties>
    </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)