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

Posted

技术标签:

【中文标题】如何使用 JAX 在 Java 中使用 Web 服务从数据库中插入数据 - RS【英文标题】:How to insert data from database with Web Service in java using JAX - RS 【发布时间】:2012-04-21 15:08:23 【问题描述】:

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

【问题讨论】:

所以你想使用 Jersey 从 DB 中获取一些数据? 是的,我应该得到它并使用它插入数据库 【参考方案1】:

看看这个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 将在数据库中执行选择操作的业务层:

@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()。

【讨论】:

你能把这个例子的整个代码发过来吗谢谢和问候 @Praveensai 这就是所有相关的东西。其余的只是不相关的附加代码,如果我发布所有代码,我将超过最大字符数。只需执行以下操作: 1-创建实体并确保在 DB 中创建表 2-创建 CRUD 外观 3-如上所述创建 Web 服务。我仍然可以给你的答案是给你一些示例代码客户端如何调用它(我会在 2 分钟内粘贴它)。使用您最喜欢的 IDE 中的调试器来执行每个步骤。 谢谢@sfrj,但是要添加什么jar文件,数据库连接,登录方法应该写在哪里 @Praveensai 所有需要的 jar 文件都包含在 JEE 6 JDK 中。如果您想要单独使用它们,则需要下载 I-Stack 和 Jersey,但不确定还有什么。我认为您可以对 Blaise Doughan 的回答发表评论,了解这个过程中涉及的所有工具是什么,他非常擅长这个话题。几天前我问了一个类似的问题。 ***.com/questions/10029976/… @Praveensai 对不起我的朋友,但我不想在这里粘贴我的邮件 ID。如果你愿意,可以关注我的博客。或者邀请我到***的聊天室,我可以给你邮箱。【参考方案2】:

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

客户服务

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;


更多信息

Part 1 - Data Model Part 2 - JPA Part 3 - JAXB (using MOXy) Part 4 - RESTful Service (using an EJB session bean) Part 5 - The client

更新

需要什么罐子

您可以将 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 资源和连接池

您需要在应用服务器上配置一个连接池。以下是在 GlassFish 上执行此操作的步骤。这些步骤会因您使用的应用程序服务器而异。

    将 JDBC 驱动程序 (ojdbc14.jar) 复制到 /glashfish/lib 启动管理控制台 创建连接池:
      姓名 = 客户服务 资源类型 = 'javax.sql.ConnectionPoolDataSource' 数据库供应商 = Oracle(或任何适合您的数据库的数据库供应商) 点击下一步,填写以下“附加属性”: 用户(例如 CustomerService) 密码(例如密码) URL(例如 jdbc:oracle:thin:@localhost:1521:XE) 使用“Ping”按钮测试您的数据库连接
    创建一个名为“CustomerService”的 JDBC 资源
      JNDI 名称 = CustomerService Pool Name = CustomerService(您在上一步中创建的连接池的名称)

JPA 配置

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

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

【讨论】:

需要什么 jars 以及数据库连接写在哪里 @Praveensai - 我已更新我的答案以包含此信息。 我使用的是tomcat服务器和mysql数据库,如何在编码中实现数据库连接 对于这两个注解@Stateless,@LocalBean.需要什么jars @Praveensai - 这些注释用于 EJB 会话 bean。我不相信 Tomcat 支持 EJB。以下文章可能有助于创建对 Tomcat 友好的服务:vogella.de/articles/REST/article.html。如果没有 EJB,您将需要自己创建 JPA EntityManager 并进行自己的事务管理。

以上是关于如何使用 JAX 在 Java 中使用 Web 服务从数据库中插入数据 - RS的主要内容,如果未能解决你的问题,请参考以下文章

JAVA - 使用 JAX-RS 和 JSON Web 令牌记住用户登录

tomcat发布web service教程

将 Web 代理与 Java 8 JAX-RS RESTEasy 客户端一起使用

如何将 Java Gradle 项目转换为动态 Web 项目?

用 Java 技术创建 RESTful Web 服务/@Path@Produces@PathParam

如何避免需要在 CXF 或 JAX-WS 生成的 Web 服务客户端中指定 WSDL 位置?