Eclipse+Spring从头学到脚之6-入门篇C

本文是Eclipse+Spring系列的入门篇C,主要讲解如何在Eclipse环境中配置Spring项目,使用HSQldb内存数据库进行开发。内容包括Spring的导入、数据库连接设置以及属性文件配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着内容的不断深入,已经学了不少springframework的相关知识了,

也许大家都在想,为什么还没有开始和数据库相关的部分?

呵呵~~,今天我们就开始把数据库的部分

这里,依据spring的官方教材,我们采用的是HSQL数据库,
这是一个用java来编写的开源的数据库。

在springframework里面使用HSQL非常方便,只需把jar文件包拷贝一下即可,方法如下:
把D:/StudySpring/spring-framework-2.5.5/lib/hsqldb/hsqldb.jar拷贝到
WebContent/WEB-INF/lib/下面。

关于,HSQL的使用,这里我们是以standalone server 模式来启用的。

另,HSQL更多的内容,请参照相关网站,这里就不多说了。

首先,在spring001下面建一个“db”的文件夹,用来存放和db文件和脚本程序。

建好db文件夹后,在下面创建一个server. bat的脚本程序,用来启动并创建数据库,数据库的名字是spring001,创建的时候,也许会弹出下面的警告框,请忽视,不会影响后面的步骤。

6-1

6-2

 

创建好后,用下面的内容更新server.bat文件

  1. java -classpath ../ WebContent/WEB-INF/lib/hsqldb.jar org.hsqldb.Server -database spring001

接下来,要创建两个sql文件,一个是create_products.sql文件,一个是load_data.sql文件,都在db目录下面。

create_products.sql用来创建表products,内容如下

  1. CREATE TABLE products (
  2.   id INTEGER NOT NULL PRIMARY KEY,
  3.   description varchar(255),
  4.   price decimal(15,2)
  5. );
  6. CREATE INDEX products_description ON products(description);

load_data.sql,用来添加一些测试数据,内容如下

  1. INSERT INTO products (id, description, price) values(1, 'Lamp', 5.78);
  2. INSERT INTO products (id, description, price) values(2, 'Table', 75.29);
  3. INSERT INTO products (id, description, price) values(3, 'Chair', 22.81);

数据库的创建方面就先准备到这,接下来,先说一下,访问数据库的相关技术内容,这里使用的是JDBC技术,为了实现这个访问功能,我们需要创建几个java文件

首先,创建一个接口文件ProductDao.java,位置在springapp/repository/包下面

因为还没有repository包,我们先创建repository包。

然后在它下面创建ProductDao.java文件,这是一个接口文件,内容如下:

  1. package springapp.repository;
  2. import java.util.List;
  3. import springapp.domain.Product;
  4. public interface ProductDao {
  5.     public List<Product> getProductList();
  6.     public void saveProduct(Product prod);
  7. }

然后,创建一个JdbcProductDao.java来实现这个接口文件,内容如下

  1. package springapp.repository;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import java.util.List;
  5. import org.apache.commons.logging.Log;
  6. import org.apache.commons.logging.LogFactory;
  7. import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
  8. import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
  9. import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
  10. import springapp.domain.Product;
  11. public class JdbcProductDao extends SimpleJdbcDaoSupport implements ProductDao {
  12.     /** Logger for this class and subclasses */
  13.     protected final Log logger = LogFactory.getLog(getClass());
  14.     public List<Product> getProductList() {
  15.         logger.info("Getting products!");
  16.         List<Product> products = getSimpleJdbcTemplate().query(
  17.                 "select id, description, price from products",
  18.                 new ProductMapper());
  19.         return products;
  20.     }
  21.     public void saveProduct(Product prod) {
  22.         logger.info("Saving product: " + prod.getDescription());
  23.         int count = getSimpleJdbcTemplate().update(
  24.             "update products set description = :description, price = :price where id = :id",
  25.             new MapSqlParameterSource().addValue("description", prod.getDescription())
  26.                 .addValue("price", prod.getPrice())
  27.                 .addValue("id", prod.getId()));
  28.         logger.info("Rows affected: " + count);
  29.     }
  30.    
  31.     private static class ProductMapper implements ParameterizedRowMapper<Product> {
  32.         public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
  33.             Product prod = new Product();
  34.             prod.setId(rs.getInt("id"));
  35.             prod.setDescription(rs.getString("description"));
  36.             prod.setPrice(new Double(rs.getDouble("price")));
  37.             return prod;
  38.         }
  39.     }
  40. }

因为引入数据库后,product多了一个key值,所以要修改一下springapp/domain/Product.java文件,修改后的内容如下:

  1. package springapp.domain;
  2. import java.io.Serializable;
  3. public class Product implements Serializable {
  4.     private int id;
  5.     private String description;
  6.     private Double price;
  7.    
  8.     public void setId(int i) {
  9.         id = i;
  10.     }
  11.     public int getId() {
  12.         return id;
  13.     }
  14.     public String getDescription() {
  15.         return description;
  16.     }
  17.    
  18.     public void setDescription(String description) {
  19.         this.description = description;
  20.     }
  21.    
  22.     public Double getPrice() {
  23.         return price;
  24.     }
  25.    
  26.     public void setPrice(Double price) {
  27.         this.price = price;
  28.     }
  29.    
  30.     public String toString() {
  31.         StringBuffer buffer = new StringBuffer();
  32.         buffer.append("Description: " + description + ";");
  33.         buffer.append("Price: " + price);
  34.         return buffer.toString();
  35.     }
  36. }

接下来,要创建一个jdbc.properties文件,用来存放数据库的访问信息,这个文件要创建在src下面,和前面的messages.properties文件同一个目录下面,文件内容如下:

  1. jdbc.driverClassName=org.hsqldb.jdbcDriver
  2. jdbc.url=jdbc:hsqldb:hsql://localhost
  3. jdbc.username=sa
  4. jdbc.password=

由于取数据的方法改变了,需要修改一下springapp/service/SimpleProductManager.java程序文件,修改后的内容如下:

  1. package springapp.service;
  2. import java.util.List;
  3. import springapp.domain.Product;
  4. import springapp.repository.ProductDao;
  5. public class SimpleProductManager implements ProductManager {
  6.     // private List<Product> products;
  7.     private ProductDao productDao;
  8.     public List<Product> getProducts() {
  9.         // return products;
  10.         return productDao.getProductList();
  11.     }
  12.     public void increasePrice(int percentage) {
  13.         List<Product> products = productDao.getProductList();
  14.         if (products != null) {
  15.             for (Product product : products) {
  16.                 double newPrice = product.getPrice().doubleValue() *
  17.                                     (100 + percentage)/100;
  18.                 product.setPrice(newPrice);
  19.                 productDao.saveProduct(product);
  20.             }
  21.         }
  22.     }
  23.     public void setProductDao(ProductDao productDao) {
  24.         this.productDao = productDao;
  25.     }
  26. //    public void setProducts(List<Product> products) {
  27. //        this.products = products;
  28. //    }
  29. }

接下来,WEB-INF下面的springapp-servlet.xml也需要修改一下,新的内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  5.        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
  6.     <!-- the application context definition for the springapp DispatcherServlet -->
  7.     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  8.         <property name="basename" value="messages"/>
  9.     </bean>
  10.    
  11.     <bean name="/hello.htm" class="springapp.web.InventoryController">
  12.         <property name="productManager" ref="productManager"/>
  13.     </bean>
  14.     <bean name="/priceincrease.htm" class="springapp.web.PriceIncreaseFormController">
  15.         <property name="sessionForm" value="true"/>
  16.         <property name="commandName" value="priceIncrease"/>
  17.         <property name="commandClass" value="springapp.service.PriceIncrease"/>
  18.         <property name="validator">
  19.             <bean class="springapp.service.PriceIncreaseValidator"/>
  20.         </property>
  21.         <property name="formView" value="priceincrease"/>
  22.         <property name="successView" value="hello.htm"/>
  23.         <property name="productManager" ref="productManager"/>
  24.     </bean>
  25.     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  26.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
  27.         <property name="prefix" value="/WEB-INF/jsp/"></property>
  28.         <property name="suffix" value=".jsp"></property>       
  29.     </bean>
  30. </beans>

然后,修改web.xml文件,新的内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.4"
  3.          xmlns="http://java.sun.com/xml/ns/j2ee"
  4.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  6.          http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
  7.   <listener>
  8.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  9.   </listener>
  10.   <servlet>
  11.     <servlet-name>springapp</servlet-name>
  12.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  13.     <load-on-startup>1</load-on-startup>
  14.   </servlet>
  15.   <servlet-mapping>
  16.     <servlet-name>springapp</servlet-name>
  17.     <url-pattern>*.htm</url-pattern>
  18.   </servlet-mapping>
  19.   <welcome-file-list>
  20.     <welcome-file>
  21.       index.jsp
  22.     </welcome-file>
  23.   </welcome-file-list>
  24.   <jsp-config>
  25.     <taglib>
  26.       <taglib-uri>/spring</taglib-uri>
  27.       <taglib-location>/WEB-INF/tld/spring-form.tld</taglib-location>
  28.     </taglib>
  29.   </jsp-config>
  30. </web-app>



在web.xml里面,由于添加了<listener>,所以需要创建一个applicationContext.xml文件,位置和web.xml是在一起的。这个文件也是一个很重要的配置文件,请大家注意下它和web.xml的关系,以及和整个springframework的关系。

applicationContext.xml的内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xmlns:aop="http://www.springframework.org/schema/aop"
  5.          xmlns:tx="http://www.springframework.org/schema/tx"
  6.          xsi:schemaLocation="http://www.springframework.org/schema/beans
  7.            http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  8.            http://www.springframework.org/schema/aop
  9.            http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
  10.            http://www.springframework.org/schema/tx
  11.            http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
  12.     <!-- the parent application context definition for the springapp application -->
  13.     <bean id="productManager" class="springapp.service.SimpleProductManager">
  14.         <property name="productDao" ref="productDao"/>
  15.     </bean>
  16.     <bean id="productDao" class="springapp.repository.JdbcProductDao">
  17.         <property name="dataSource" ref="dataSource"/>
  18.     </bean>
  19.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  20.         <property name="driverClassName" value="${jdbc.driverClassName}"/>
  21.         <property name="url" value="${jdbc.url}"/>
  22.         <property name="username" value="${jdbc.username}"/>
  23.         <property name="password" value="${jdbc.password}"/>
  24.     </bean>
  25.     <bean id="propertyConfigurer" 
  26.           class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  27.         <property name="locations">
  28.             <list>
  29.                 <value>classpath:jdbc.properties</value>
  30.             </list>
  31.         </property>
  32.     </bean>
  33.     <bean id="transactionManager" 
  34.           class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  35.         <property name="dataSource" ref="dataSource"/>
  36.     </bean>
  37.     <aop:config>
  38.         <aop:advisor pointcut="execution(* *..ProductManager.*(..))" advice-ref="txAdvice"/>
  39.     </aop:config>
  40.     <tx:advice id="txAdvice">
  41.         <tx:attributes>
  42.             <tx:method name="save*"/>
  43.             <tx:method name="*" read-only="true"/>
  44.         </tx:attributes>
  45.     </tx:advice>
  46. </beans>

同时,也需要拷贝几个jar文件

1:D:/StudySpring/spring-framework-2.5.5/lib/aspectj/aspectjweaver.jar

2:D:/StudySpring/spring-framework-2.5.5/lib/jakarta-commons/commons-dbcp.jar

3:D:/StudySpring/spring-framework-2.5.5/lib/jakarta-commons/ commons-pool.jar

把这3个jar文件,拷贝到WebContent/WEB-INF/lib/下面。


ok,到目前为止,完成了准备工作,下面来启动我们的练习项目,启动分成两部分

首先启动的是数据库,启动方法如下

1:运行cmd命令,或运行“附件”里的“命令提示符”

2:在dos界面里,先把当前路径改成D:/StudySpring/MyWorkspace/spring001/db,如下图所示:
6-3

3:输入server.bat后,如果得到下面的内容就ok了。
6-4

这样就完成了数据库的启动。

接下来要运行前面创建的两个数据库sql文件,分别是create_products.sql和load_data.sql。

下面介绍一下运行这两个文件的方法。

在create_products.sql上鼠标右键,在弹出菜单中选择“Execute SQL Files”
6-5

在弹出的对话框里的“Database Server Type”选择“HSQLDB_1.8”,然后在“Connection profile name”,点击“Create…”按钮,弹出如下窗口,并按照下图所示,选择“HSQLDB”
6-6

选择好后,点击“Next”按钮,得到下面的对话框
6-7

在上图中点击红色框的地方,会弹出一个下面的对话框
6-8

在“Name/Type”选项卡里,作如下图的选择
6-9

在“Jar List”选项卡里,先点击右侧的“Clear All”按钮;然后点击“Add JAR/Zip”按钮,来选择在程序里面的hsqldb.jar包文件,我的选择,如下图所示:
6-10

在“Properties”选项卡里的内容可以不用动,直接点击“OK”按钮。

然后在接下来的对话框的“Database location”里输入“hsql://localhost”,输入后的画面如下图所示:
6-11

这里要确保一下,Database里的内容是否是“spring001”。

为了测试一下有没有问题,可以点击“Test Connection”按钮,如果得到下面的画面就成功了。

6-12

现在就可以点击“OK”按钮,来开始运行create_products.sql脚本。运行后可以在Eclipse的“SQL Results”里看到运行的结果。
6-13

下面,按照相同的办法运行load_data.sql,可以在Eclipse里的“SQL Results”里看到如下运行结果。
6-14

然后是启动web站点,启动方法和前面介绍过的一样,如果没有问题,会得到下面的画面
6-15

到这里,就算是完成了入门的部分。

重点总结:

1:jdbc.properties文件的使用方法。

2:DAO class的使用方法。

3:springframework中是如何实现事务的。

4:springframework中是如何实现connection pool的。

 

 

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值