Java实现的WebService连接数据库详解 (java webservice访问数据库)
Web服务是客户端和服务器之间的一种通用通信方式,它通过HTTP协议发布WebService并接受SOAP消息,实现跨平台、跨语言的数据交互。而Java作为一种跨平台的开发语言,自然也可以用来开发WebService。在实际开发中,与数据库的交互是非常常见的需求之一,因此本文将详细介绍如何使用Java实现的WebService连接数据库。
一、WebService的搭建
在介绍如何实现Java连接数据库之前,我们先要有一个能够接受SOAP消息的WebService,并可以正确地解析和返回SOAP消息。这里我们使用Eclipse作为开发工具,先创建一个Web项目,然后在项目中创建一个类,用来实现我们的WebService:
“`
package com.example.webservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class MyWebService {
@WebMethod
public String sayHello(@WebParam(name = “name”) String name) {
return “Hello ” + name + “!”;
}
public static void mn(String[] args) {
Endpoint.publish(“http://localhost:8080/MyWebService”, new MyWebService());
System.out.println(“MyWebService has started.”);
}
}
“`
这个类很简单,它只有一个公开的方法sayHello,它接受一个名为name的参数,并返回一个字符串,表示问候语。我们使用@WebService注解来标识它是一个WebService,使用@WebMethod注解来标识它是可供调用的方法,使用@WebParam注解来标识方法参数的名称。在mn方法中,我们使用Endpoint.publish方法将WebService发布到本地的8080端口,并启动WebService服务。
我们可以使用浏览器访问http://localhost:8080/MyWebService?wsdl,来获取我们刚刚发布的WebService的WSDL文件。WSDL是一种XML格式的描述文件,它用来描述WebService的接口、输入参数、输出参数等信息,客户端通过WSDL文件可以了解WebService提供的功能和参数要求,从而可以生成与WebService相匹配的客户端代码。
二、连接MySQL数据库
接下来我们使用Java连接MySQL数据库,并在WebService中对数据库进行操作。在使用Java连接数据库之前,我们需要确保我们的项目中包含了MySQL驱动程序的Jar包,我们可以将驱动程序的Jar包添加到项目的lib目录中,然后在项目的classpath中添加Jar包,才能在代码中使用MySQL提供的API访问数据库。
下面是连接MySQL的Java代码示例:
“`
package com.example.database;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MyDatabase {
private String url;
private String username;
private String password;
public MyDatabase(String url, String username, String password) {
this.url = url;
this.username = username;
this.password = password;
}
public Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName(“com.mysql.jdbc.Driver”);
return DriverManager.getConnection(url, username, password);
}
public ResultSet select(String sql) throws ClassNotFoundException, SQLException {
Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
return rs;
}
}
“`
这个类MyDatabase是一个封装了MySQL数据库连接方法的类,它包含了一个getConnection方法,可以返回一个连接到MySQL数据库的Connection对象,还包含一个select方法,可以用来执行查询语句并返回结果集。getConnection方法中,我们使用了Java反射机制来动态加载MySQL驱动程序,然后通过DriverManager.getConnection方法获取Connection对象。在select方法中,我们首先获得一个Connection对象,然后通过它创建一个Statement对象,最后调用Statement对象的executeQuery方法执行SQL语句并返回结果集。
接下来我们在WebService中使用MyDatabase类来连接MySQL数据库,这里我们以查询一个学生表为例:
“`
package com.example.webservice;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.ws.Endpoint;
import com.example.database.MyDatabase;
@WebService
public class StudentService {
private static final String URL = “jdbc:mysql://localhost:3306/mydb”;
private static final String USERNAME = “root”;
private static final String PASSWORD = “123456”;
@WebMethod
public StudentList getStudents() throws ClassNotFoundException, SQLException, JAXBException {
MyDatabase db = new MyDatabase(URL, USERNAME, PASSWORD);
ResultSet rs = db.select(“SELECT * FROM student”);
StudentList list = new StudentList();
while (rs.next()) {
Student student = new Student();
student.setId(rs.getInt(“id”));
student.setName(rs.getString(“name”));
student.setGender(rs.getString(“gender”));
student.setAge(rs.getInt(“age”));
list.add(student);
}
return list;
}
public static void mn(String[] args) {
Endpoint.publish(“http://localhost:8080/StudentService”, new StudentService());
System.out.println(“StudentService has started.”);
}
@XmlRootElement
public static class Student {
private int id;
private String name;
private String gender;
private int age;
@XmlElement
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@XmlElement
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
@XmlRootElement
public static class StudentList {
private List students = new ArrayList();
public List getStudents() {
return students;
}
public void setStudents(List students) {
this.students = students;
}
public void add(Student student) {
students.add(student);
}
}
}
“`
我们在StudentService类中增加了一个getStudents方法,它的返回值为StudentList类型,StudentList是一个包含了Student类型的列表。在getStudents方法中,我们使用MyDatabase类创建了一个连接到MySQL数据库的Connection对象,然后执行了一个查询语句,获取到结果集。最后我们遍历查询结果集,使用Student类来封装学生信息,并将Student对象添加到StudentList中,最后将StudentList返回给客户端。
为了让客户端可以正确地解析和生成StudentList类型的对象,我们使用了JAXB注解,并在Student和StudentList类上分别添加了@XmlRootElement注解。这样客户端就可以使用Java自带的JAXB API来将SOAP消息转换为Java对象,并将Java对象转换为SOAP消息了。
三、WebService的调用
最后我们就可以测试我们刚刚创建的WebService了。在这里我们使用SoapUI来调用WebService接口。
在SoapUI中创建一个新项目,并添加我们发布的WebService的WSDL文件:
点击OK后,SoapUI就生成了一个MyWebService项目,并自动生成了与WebService相匹配的SOAP请求:
我们将请求中的name字段的值修改为“Jack”,然后点击“Send Request”按钮。SoapUI发送请求到WebService的地址,接收到服务端的响应后,自动将响应解析为SOAP消息,并以XML格式展示在右侧的响应面板中:
我们可以看到,WebService返回了一个包含了“Hello Jack!”的SOAP消息,这表明我们刚刚创建的WebService已经成功地连接到了MySQL数据库,并返回了数据。