域模型
public class Vehicle {
private String vehicleNo;
private String color;
private int wheel;
private int seat;
// Constructors, Getters and Setters
...
}
表
CREATE TABLE VEHICLE (
VEHICLE_NO VARCHAR(10) NOT NULL,
COLOR VARCHAR(10),
WHEEL INT,
SEAT INT,
PRIMARY KEY (VEHICLE_NO)
);
DAO
public interface VehicleDao {
public void insert(Vehicle vehicle);
public void update(Vehicle vehicle);
public void delete(Vehicle vehicle);
public Vehicle findByVehicleNo(String vehicleNo);
}
Most parts of the JDBC APIs declare throwing java.sql.SQLException. But because this interface
aims to abstract the data access operations only, it should not depend on the implementation
technology. So, it’s unwise for this general interface to declare throwing the JDBC-specific SQLException.
A common practice when implementing a DAO interface is to wrap this kind of exception with a runtime
exception (either your own business Exception subclass or a generic one).
大部分 JDBC API声明抛出 SQLException异常, 但是对于DAO接口 它的目的仅仅是数据操作,所以针对拥有泛化性的接口来讲声明抛出JDBC规范的SQLException异常是不明智的。当实现DAO接口的时候 一种普遍的做法就是把这样类型的异常与RuntimeException异常包装在一起。
DAO实现类
public class JdbcVehicleDao implements VehicleDao {
private DataSource dataSource;
CHAPTER 15 ■ DATA ACCESS
601
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void insert(Vehicle vehicle) {
String sql = "INSERT INTO VEHICLE (VEHICLE_NO, COLOR, WHEEL, SEAT) "
+ "VALUES (?, ?, ?, ?)";
Connection conn = null;
try {
conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, vehicle.getVehicleNo());
ps.setString(2, vehicle.getColor());
ps.setInt(3, vehicle.getWheel());
ps.setInt(4, vehicle.getSeat());
ps.executeUpdate();
ps.close();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
}
public Vehicle findByVehicleNo(String vehicleNo) {
String sql = "SELECT * FROM VEHICLE WHERE VEHICLE_NO = ?";
Connection conn = null;
try {
conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, vehicleNo);
Vehicle vehicle = null;
ResultSet rs = ps.executeQuery();
if (rs.next()) {
vehicle = new Vehicle(rs.getString("VEHICLE_NO"),
rs.getString("COLOR"), rs.getInt("WHEEL"),
rs.getInt("SEAT"));
}
rs.close();
ps.close();
return vehicle;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
CHAPTER 15 ■ DATA ACCESS
602
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
}
public void update(Vehicle vehicle) {/* … */}
public void delete(Vehicle vehicle) {/* … */}
}
in JDBC 2.0 or higher, you can obtain database connections from a
preconfigured javax.sql.DataSource object without knowing about the connection details.
在JDBC2.0或更高的版本里,我们可以在不知道任何关于连接的详细信息的情况下从预设值好的javax.sql.DataSource里获得数据库连接.
The vehicle insert operation is a typical JDBC update scenario. Each time this method is called, you
obtain a connection from the data source and execute the SQL statement on this connection. Your DAO
interface doesn’t declare throwing any checked exceptions, so if a SQLException occurs, you have to wrap
it with an unchecked RuntimeException. Don’t forget to release the connection in the finally block. Failing to do so
may cause your application to run out of connections.
当执行这个方法的时候 我们从data source里获取connection 然后在该connection执行SQL语句。由于我们的Dao接口没有声明抛出任何checked异常 所以如果一个SQLException异常放生 我们需要将它与unchecked RuntimeException异常包装在一起。最后不要忘记在finally块里释放Connection,因为当操作失败时 程序会用完该connection 来达到释放connection的目的.
Spring datasource配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="org.apache.derby.jdbc.ClientDriver" />
<property name="url"
value="jdbc:derby://localhost:1527/vehicle;create=true" />
<property name="username" value="app" />
<property name="password" value="app" />
</bean>
<bean id="vehicleDao"
class="com.apress.springrecipes.vehicle.JdbcVehicleDao">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
The javax.sql.DataSource interface is a standard interface defined by the JDBC specification that
factories Connection instances. There are many data source implementations provided by different
vendors and projects: C3PO and Apache Commons DBCP are popular open source options, and most
applications servers will provide their own implementation. It is very easy to switch between different
data source implementations, because they implement the common DataSource interface. As a Java
application framework, Spring also provides several convenient but less powerful data source
implementations. The simplest one is DriverManagerDataSource, which opens a new connection every
time one is requested.
javax.sql.DataSource接口是JDBC规范定义的一个标准,有很多的来自于不同的组织和项目提供的datasource相关实现 例如CSP0和Apache Commons DBCP就是非常广泛使用的相关实现,在不同的实现之间进行切换是非常容易的 因为他们实现的都是DataSource接口。作为Java框架 Spring也同样提供了几个方便的 但是不够强大的DataSource实现,其中最简单的实现就是DriverManagerDataSource,当每次有一个请求时该实现总会开辟一个新的Connection.
DriverManagerDataSource is not an efficient data source implementation because it opens a new
connection for the client every time it’s requested. Another data source implementation provided by
Spring is SingleConnectionDataSource (a DriverManagerDataSource subclass). As its name indicates, this
maintains only a single connection that’s reused all the time and never closed. Obviously, it is not
suitable in a multithreaded environment.
DriverManagerDataSource 不是一个很有效的DataSource实现 因为针对客户端的每次请求总会开辟一个新的Connection,Spring提供的另一个DataSource实现是SingleConnectionDataSource(它是DriverManagerDataSource的子类),如同的它的名字 它只保持维护一个Connection,在整个运行期一直会重复使用并且一直都不会关闭,很显然它不适合用于多线程环境。
Spring’s own data source implementations are mainly used for testing purposes. However, many
production data source implementations support connection pooling. For example, the Database
Connection Pooling Services (DBCP) module of the Apache Commons Library has several data source
implementations that support connection pooling. Of these, BasicDataSource accepts the same
connection properties as DriverManagerDataSource and allows you to specify the initial connection size
and maximum active connections for the connection pool.
Spring提供的DataSource实现一般都是用来测试的, 然而有很多的DataSource实现都支持连接池;例如 Apache Commons Library的 Database Connection Pooling Services(DBCP)模块拥有几个支持连接池的Datasource实现;其中 BasicDataSource 接受与DriverManagerDataSource一样的连接参数 并且允许我们针对连接池指定initial connection的大小和active connections 的最大值
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="org.apache.derby.jdbc.ClientDriver" />
<property name="url"
value="jdbc:derby://localhost:1527/vehicle;create=true" />
<property name="username" value="app" />
<property name="password" value="app" />
<property name="initialSize" value="2" />
<property name="maxActive" value="5" />
</bean>
分享到:
相关推荐
集成Spring Data JDBC可以减少代码量,提高可维护性,并且由于Spring的其他模块(如Spring MVC和Spring Security)与之良好集成,可以构建更复杂的Web应用。例如,Spring MVC提供了模型-视图-控制器架构,使业务逻辑...
在本项目中,我们主要利用Spring框架,包括其核心模块Spring、MVC模块Spring MVC以及数据访问/集成模块Spring JDBC,结合MySQL数据库来构建一个基础的登录注册系统。以下是这个项目涉及的关键技术点: 1. **Spring...
《Spring JDBC:构建高效数据访问层》 Spring JDBC是Spring框架的一个重要组成部分,它提供了一种简化传统JDBC编程的抽象层,使得开发者能够更轻松、更安全地处理数据库交互。"spring-jdbc jar包"包含了Spring框架...
在实际使用中,Spring JDBC通常与Spring的其他模块结合,如Spring ORM(Object-Relational Mapping)和Spring AOP(Aspect-Oriented Programming),以提供更完整的数据访问解决方案。例如,Hibernate或MyBatis可以...
总之,Spring JDBC是Spring框架中强大的数据库访问工具,它通过提供一系列的模板类和事务管理机制,极大地简化了JDBC编程,提高了代码的可读性和可维护性。正确理解和使用Spring JDBC,可以让我们在开发过程中更加...
- Spring JDBC可以与Spring的其他模块无缝集成,比如MyBatis、Hibernate等ORM框架,以及Spring Data JPA,提供了更高级别的数据访问抽象。 现在,让我们看一个简单的Spring JDBC实例: ```java @Autowired ...
总之,SpringMVC、Spring和SpringJDBC的整合为Java Web开发提供了一个强大的解决方案,它们的相互配合可以实现灵活的控制流、高效的数据库访问以及整洁的代码结构。理解并熟练掌握这些技术,对于提升Java开发能力...
- 在数据访问层中,使用Spring JDBC的JdbcTemplate或NamedParameterJdbcTemplate来执行SQL语句。 - 在Service层,通过AOP实现事务管理,确保数据一致性。 - 编写Controller,接收并处理HTTP请求,调用Service层...
Spring JDBC是Spring提供的数据访问层,它简化了JDBC操作,消除了手动管理连接、准备语句和结果集等繁琐任务。通过使用Spring JDBC,开发者可以专注于SQL语句的编写,而无需关注底层的数据库交互细节。它支持事务...
标题 "spring学习:JDBC数据访问" 涉及到的是Spring框架中关于JDBC(Java Database Connectivity)数据访问的相关内容。Spring是一个广泛使用的开源Java应用程序框架,它为开发人员提供了一个全面的平台来管理数据库...
这使得开发者能够更专注于业务逻辑,而不是繁琐的数据访问层实现。Spring JDBC不仅包含了JDBC的基本功能,如数据源配置、事务管理,还引入了模板模式,即JdbcTemplate,进一步降低了数据库操作的复杂性。 ...
《Spring数据访问策略详解》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,数据访问策略是Spring的重要组成部分,它为开发者提供了多种处理数据存储和检索的方法。本文将深入探讨Spring...
当我们谈论"Spring+JDBC实例"时,通常是指在Spring框架中使用JDBC进行数据访问的方式,这种方式可以利用Spring提供的便利性,同时保留对数据库的直接控制。 在Spring框架中,JDBC操作被封装在`org.springframework....
总结来说,Spring Security JDBC提供了一种灵活的方式来管理和验证用户账户,以及执行基于角色的访问控制。通过结合使用JDBC和数据库,我们可以构建安全、可扩展的身份验证和授权系统。理解并熟练掌握Spring ...
本文将详细探讨Spring3MVC与JDBC的集成,以及它们如何协同工作来实现高效的数据访问。 首先,Spring3MVC是一个轻量级的Web MVC框架,它提供了一种结构化的方式来组织和处理HTTP请求。通过注解驱动的控制器,可以...
Spring JDBC模块则是Spring提供的一个数据访问层,它简化了JDBC的使用。Spring JDBC提供了一个JdbcTemplate类,通过这个类,开发者可以避免手动处理数据库连接、预编译语句、结果集等繁琐的工作,降低了出错的可能性...
Spring-JDBC是Spring框架的一个重要模块,它提供了一种简化数据库操作的抽象层,使得开发者可以更加方便地进行数据访问。在本篇文章中,我们将深入探讨Spring-JdbcTemplate、DataSourceTransactionManager以及相关的...
首先,Spring框架提供了多种数据访问机制,如JDBC(Java Database Connectivity)、ORM(Object-Relational Mapping)框架集成,例如Hibernate和MyBatis,以及对JPA(Java Persistence API)的支持。这些工具使得...
SpringMVC和SpringJDBC是Java开发中两个重要的框架,它们分别是Spring框架在Web层和数据访问层的应用。本文将详细介绍这两个组件的核心概念、工作原理以及如何整合使用,旨在帮助开发者更好地理解和应用。 **...
1. MyBatis集成:Spring JDBC与MyBatis结合,可以利用MyBatis的动态SQL和映射文件,进一步简化数据访问。 2. Hibernate集成:Spring也可以与ORM框架如Hibernate配合,提供更高级别的对象关系映射。 六、实战案例 在...