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

时间:2012-04-09 06:48:22

标签: java rest tomcat jersey

我是网络服务新手。请给出如何使用jersey-RS in java?

从数据库插入和检索数据的建议

2 个答案:

答案 0 :(得分:13)

下面是一个 JAX-RS 服务的示例,它使用 JPA 作为会话bean实现持久性,而 JAXB 用于消息传递可能看起来像。

<强>的CustomerService

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();
    }

}

<强>客户

以下是其中一个实体的示例。它包含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;

}

了解更多信息


<强>更新

  

所需的罐子是什么

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

  

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

JDBC资源&amp;连接池

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

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

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

    <?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>
    

答案 1 :(得分:4)

看看这个link,有一个视频教程,解释了如何完成它的方法。

因此,该视频解释了Web服务如何检索某些值以告知客户端给定的凭据与数据库中的某些数据匹配。

处理客户端请求的方法如下:

@POST
    @Produces(MediaType.TEXT_PLAIN)
    @Path("/login")
    public Response login(@FormParam("email") String email, @FormParam("password") String password) {

        Response.ResponseBuilder responseBuilder = null;
        
        boolean result = entityFacade.doLogin(email, password);
        if (result) {
             responseBuilder = Response.ok("Success");//Login good!
        }
        else {            
            responseBuilder = Response.ok("Wrong credentials!");//Login bad!
        }

        return responseBuilder.build();
    }

此Web服务将凭据传输到EJB将在数据库中执行select操作的业务层:

@Stateless
public class EntityFacade implements EntityFacadeLocal {

    @Resource
    private UserTransaction ut;
    private CredentialJpaController controller;

    @PostConstruct
    public void init() {        
        controller = new CredentialJpaController(ut, Persistence.createEntityManagerFactory("ROLEProject-ejbPU"));
    }


    public boolean doLogin(String email, String password){        
        return controller.loginWithParameters(email,password);
    }
}

EJB依赖于将执行与数据库交互的任务的服务类

public class CredentialJpaController implements Serializable {

    public CredentialJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx;
        this.emf = emf;
    }
    private UserTransaction utx = null;
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
    public boolean loginWithParameters(String email, String password) {
        boolean result = false;
        EntityManager em = getEntityManager();
        Long l = (Long) em.createNamedQuery("loginquery").setParameter("emailParam", email).setParameter("passwordParam", password).getSingleResult();
        if (l == 1) {
            result = true;
        }
        return result;
    }
}

最后,为了能够与DB交互,数据必须表示为JPA实体。 此外,为了能够将所选行封送回客户端,无论需要什么样的MediaType,实体都必须包含一些JaxB注释:

@XmlRootElement
@Entity
@Table(name = "CREDENTIALS")
@NamedQuery(name="loginquery", query="SELECT COUNT(c) FROM Credential c WHERE c.email = :emailParam AND c.password = :passwordParam")
public class Credential implements Serializable {

    @Id
    private String email;
    @Column(nullable = false)
    private String password;

    @XmlElement
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

     @XmlElement
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

以下是一些示例客户端代码,因此您可以看到如何调用Web服务的方法之一:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>TODO supply a title</title>
    </head>
    <body>
        <div>TODO write content</div>
        <form action="http://localhost:8080/ROLEProject-war/role/login" method="POST">
            Email <input name="email"/>
            Password <input type="password" name="password"/>
            <input type="submit"/>
        </form>
    </body>
</html>

我希望这有助于给你一个想法。

要插入数据,过程几乎相同,只需使用方法persist()而不是实体管理器中的find()。