Webservice数据库访问示例:轻松学习用web服务连接数据库 (webservice数据库访问例子)
随着云计算和移动互联网技术的不断发展,Web服务越来越受到广泛的关注和使用,尤其是在数据交互与处理方面。Web服务利用HTTP/HTTPS等协议,将数据转化为XML格式进行传递和共享,较之传统的SOA体系更加方便、灵活、高效和安全。本文将结合一个实例,介绍如何使用Web服务连接数据库进行数据的访问和操作。
一、实现原理
Web服务与数据库间的交互可分为两种方式:一种是直接使用原生的数据库API进行访问和操作,比如Oracle、MySQL、SQL Server等;另一种是借助第三方开源类库/中间件,如Hibernate、MyBatis、Spring等。这两种方式各有优缺点,主要取决于不同的应用场景和要求。在此,我们以之一种方式为例,讲解Web服务如何访问Relational Database Management System (RDBMS)。
在Web服务中实现对RDBMS的访问,需要完成以下几个步骤:
1. 搭建Web服务环境:比如Apache-CXF、Axis2等,通常是基于Java语言的,并支持一些声明式的访问方式,例如JAX-WS和JAX-RS。
2. 配置Web服务:包括Web服务的部署、端口等信息的配置。通过配置,可以使得Web服务可以被外部的其他应用程序所调用和访问。
3. 实现Web服务接口:Web服务通过定义一些Java接口来实现对数据库的访问和操作,例如增、删、改、查等。
4. 实现数据源的访问:Java提供了一些标准的数据库API,例如JDBC、JPA等,可以使用这些API来实现对数据源的访问和操作。
二、代码实现
下面通过一个示例具体介绍如何使用Web服务连接数据库进行数据的访问和操作。
我们需要搭建Web服务环境。这里我们选择使用Apache-CXF作为Web服务的框架,并利用Gradle搭建开发环境,代码如下:
build.gradle
“`
plugins {
id ‘java’
id ‘war’
}
repositories {
jcenter()
}
dependencies {
servletApi ‘javax.servlet:servlet-api:2.5’
compile “org.apache.cxf:cxf-rt-frontend-jaxws:3.2.4”
compile “org.apache.cxf:cxf-rt-transports-http:3.2.4”
compile “org.apache.cxf:cxf-rt-wsdl:3.2.4”
compile “org.apache.cxf:cxf-rt-bindings-soap:3.2.4”
compile “com.oracle.driver:ojdbc6:11.2.0.3.0”
}
“`
这里的代码使用了org.apache.cxf:cxf-rt-frontend-jaxws等几个Maven依赖,其中ojdbc6是Oracle JDBC驱动的依赖。由于Web服务与数据库的交互需要使用到JDBC,所以我们首先需要引入JDBC的驱动包,并且需要在classpath中添加相关的配置信息。这里我们假设要操作的是一个Oracle数据库。
接下来,我们需要在Web服务中实现对应的Java接口,例如:
“`
@WebService
public interface ExampleService {
/** 查询所有的用户 */
@WebMethod
List getAllUsers();
/** 根据ID查询用户信息 */
@WebMethod
User getUserById(int id);
/** 根据ID更新用户信息 */
@WebMethod
void updateUserById(int id, User user);
/** 插入一个用户 */
@WebMethod
void insertUser(User user);
/** 删除一个用户 */
@WebMethod
void deleteUserById(int id);
}
“`
这里我们定义了五个Java接口,分别实现查询、更新、插入、删除等操作。其中的User类表示一个用户实体。
接着,我们实现这些接口的具体实现类:
“`
@Service
public class ExampleServiceImpl implements ExampleService {
private final DataSource dataSource;
/** Data source 初始化 */
public ExampleServiceImpl(final DataSource dataSource) {
this.dataSource = dataSource;
}
/** 获取数据源的连接 */
private Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/** 执行 SQL */
private void executeUpdate(final String sql, final Object… params) {
try (final Connection conn = getConnection()) {
final PreparedStatement pstmt = conn.prepareStatement(sql);
for (int i = 0; i
pstmt.setObject(i + 1, params[i]);
}
pstmt.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/** 查询所有的用户 */
@Override
public List getAllUsers() {
final List users = new ArrayList();
try (final Connection conn = getConnection()) {
final Statement stmt = conn.createStatement();
try (final ResultSet rs = stmt.executeQuery(“SELECT * FROM users”)) {
while (rs.next()) {
final User user = new User();
user.setId(rs.getInt(“id”));
user.setName(rs.getString(“name”));
user.setEml(rs.getString(“eml”));
users.add(user);
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return users;
}
/** 根据ID查询用户信息 */
@Override
public User getUserById(final int id) {
try (final Connection conn = getConnection()) {
final PreparedStatement pstmt = conn.prepareStatement(“SELECT * FROM users WHERE id = ?”);
pstmt.setObject(1, id);
try (final ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
final User user = new User();
user.setId(rs.getInt(“id”));
user.setName(rs.getString(“name”));
user.setEml(rs.getString(“eml”));
return user;
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return null;
}
/** 根据ID更新用户信息 */
@Override
public void updateUserById(final int id, final User user) {
executeUpdate(“UPDATE users SET name = ?, eml = ? WHERE id = ?”, user.getName(), user.getEml(), id);
}
/** 插入一个用户 */
@Override
public void insertUser(final User user) {
executeUpdate(“INSERT INTO users (name, eml) VALUES (?, ?)”, user.getName(), user.getEml());
}
/** 删除一个用户 */
@Override
public void deleteUserById(final int id) {
executeUpdate(“DELETE FROM users WHERE id = ?”, id);
}
}
“`
这里我们使用了Spring的依赖注入技术,将DataSource注入到ExampleServiceImpl中。同时,我们实现了getConnection方法,用于创建Connection对象,并且实现了executeUpdate方法,用于执行SQL语句,将数据源中的数据进行增、删、改等操作。在具体实现中,我们使用了PreparedStatement对象来处理查询语句和更新语句,避免了SQL注入等安全问题,同时也提高了速度和效率。
我们需要在Java代码中配置Web服务的端口和地址等信息:
“`
@Configuration
public class AppConfig {
/** 数据源配置 */
@Bean
public DataSource dataSource() {
final BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(“oracle.jdbc.driver.OracleDriver”);
dataSource.setUrl(“jdbc:oracle:thin:@localhost:1521:xe”);
dataSource.setUsername(“username”);
dataSource.setPassword(“password”);
return dataSource;
}
/** 对URL请求的映射 */
@Bean
public ServletRegistrationBean cxfServlet() {
final ServletRegistrationBean servletRegBean = new ServletRegistrationBean(new CXFServlet(), “/soap/*”);
servletRegBean.setLoadOnStartup(1);
return servletRegBean;
}
/** 对Web服务接口的扫描 */
@Bean
public Endpoint exampleEndpoint() {
final EndpointImpl endpoint = new EndpointImpl(new ExampleServiceImpl(dataSource()));
endpoint.publish(“/example”);
return endpoint;
}
}
“`
这里我们使用了Java配置类的方式,定义了数据源、Servlet和Web服务接口的扫描等信息。其中,dataSource()方法用于创建Oracle的数据源,cxfServlet()方法用于对URL请求的映射,exampleEndpoint()方法用于将Web服务接口发布到指定的地址下,做到了对外部应用程序的服务开放。在这个示例中,我们使用了例子所示的默认数据库连接参数,调用者可以通过修改这些参数来实现自己数据源的访问。
三、