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

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

下面是一个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 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 phoneNumbers; } 

了解更多信息

  • 第1部分 – 数据模型
  • 第2部分 – JPA
  • 第3部分 – JAXB(使用MOXy)
  • 第4部分 – RESTful服务(使用EJB会话bean)
  • 第5部分 – 客户

UPDATE

什么是所需的jar子

您可以将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配置

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

    org.eclipse.persistence.jpa.PersistenceProvider CustomerService org.example.Customer org.example.Address org.example.PhoneNumber             

看看这个链接 ,有一个video教程解释了如何完成它的方法。

因此,该video解释了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服务的方法之一:

   TODO supply a title   
TODO write content
Email Password

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

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