随着内容的不断深入,已经学了不少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,创建的时候,也许会弹出下面的警告框,请忽视,不会影响后面的步骤。 创建好后,用下面的内容更新server.bat文件
- 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,内容如下
- CREATE TABLE products (
- id INTEGER NOT NULL PRIMARY KEY,
- description varchar(255),
- price decimal(15,2)
- );
- CREATE INDEX products_description ON products(description);
load_data.sql ,用来添加一些测试数据,内容如下
- INSERT INTO products (id, description, price) values(1, 'Lamp', 5.78);
- INSERT INTO products (id, description, price) values(2, 'Table', 75.29);
- INSERT INTO products (id, description, price) values(3, 'Chair', 22.81);
数据库的创建方面就先准备到这,接下来,先说一下,访问数据库的相关技术内容,这里使用的是JDBC技术,为了实现这个访问功能,我们需要创建几个java文件 首先,创建一个接口文件ProductDao.java ,位置在springapp/repository/包下面 因为还没有repository包,我们先创建repository包。 然后在它下面创建ProductDao.java文件,这是一个接口文件,内容如下:
- package springapp.repository;
- import java.util.List;
- import springapp.domain.Product;
- public interface ProductDao {
- public List<Product> getProductList();
- public void saveProduct(Product prod);
- }
然后,创建一个JdbcProductDao.java来实现这个接口文件,内容如下
- package springapp.repository;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.List;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
- import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
- import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
- import springapp.domain.Product;
- public class JdbcProductDao extends SimpleJdbcDaoSupport implements ProductDao {
-
- protected final Log logger = LogFactory.getLog(getClass());
- public List<Product> getProductList() {
- logger.info("Getting products!");
- List<Product> products = getSimpleJdbcTemplate().query(
- "select id, description, price from products",
- new ProductMapper());
- return products;
- }
- public void saveProduct(Product prod) {
- logger.info("Saving product: " + prod.getDescription());
- int count = getSimpleJdbcTemplate().update(
- "update products set description = :description, price = :price where id = :id",
- new MapSqlParameterSource().addValue("description", prod.getDescription())
- .addValue("price", prod.getPrice())
- .addValue("id", prod.getId()));
- logger.info("Rows affected: " + count);
- }
-
- private static class ProductMapper implements ParameterizedRowMapper<Product> {
- public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
- Product prod = new Product();
- prod.setId(rs.getInt("id"));
- prod.setDescription(rs.getString("description"));
- prod.setPrice(new Double(rs.getDouble("price")));
- return prod;
- }
- }
- }
因为引入数据库后,product多了一个key值,所以要修改一下springapp/domain/Product.java文件,修改后的内容如下:
- package springapp.domain;
- import java.io.Serializable;
- public class Product implements Serializable {
- private int id;
- private String description;
- private Double price;
-
- public void setId(int i) {
- id = i;
- }
- public int getId() {
- return id;
- }
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public Double getPrice() {
- return price;
- }
-
- public void setPrice(Double price) {
- this.price = price;
- }
-
- public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append("Description: " + description + ";");
- buffer.append("Price: " + price);
- return buffer.toString();
- }
- }
接下来,要创建一个jdbc.properties文件,用来存放数据库的访问信息,这个文件要创建在src下面,和前面的messages.properties文件同一个目录下面,文件内容如下:
- jdbc.driverClassName=org.hsqldb.jdbcDriver
- jdbc.url=jdbc:hsqldb:hsql:
- jdbc.username=sa
- jdbc.password=
由于取数据的方法改变了,需要修改一下springapp/service/SimpleProductManager.java程序文件,修改后的内容如下:
- package springapp.service;
- import java.util.List;
- import springapp.domain.Product;
- import springapp.repository.ProductDao;
- public class SimpleProductManager implements ProductManager {
-
- private ProductDao productDao;
- public List<Product> getProducts() {
-
- return productDao.getProductList();
- }
- public void increasePrice(int percentage) {
- List<Product> products = productDao.getProductList();
- if (products != null) {
- for (Product product : products) {
- double newPrice = product.getPrice().doubleValue() *
- (100 + percentage)/100;
- product.setPrice(newPrice);
- productDao.saveProduct(product);
- }
- }
- }
- public void setProductDao(ProductDao productDao) {
- this.productDao = productDao;
- }
- }
接下来,WEB-INF下面的springapp-servlet.xml也需要修改一下,新的内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <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-2.5.xsd">
-
- <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
- <property name="basename" value="messages"/>
- </bean>
-
- <bean name="/hello.htm" class="springapp.web.InventoryController">
- <property name="productManager" ref="productManager"/>
- </bean>
- <bean name="/priceincrease.htm" class="springapp.web.PriceIncreaseFormController">
- <property name="sessionForm" value="true"/>
- <property name="commandName" value="priceIncrease"/>
- <property name="commandClass" value="springapp.service.PriceIncrease"/>
- <property name="validator">
- <bean class="springapp.service.PriceIncreaseValidator"/>
- </property>
- <property name="formView" value="priceincrease"/>
- <property name="successView" value="hello.htm"/>
- <property name="productManager" ref="productManager"/>
- </bean>
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
- <property name="prefix" value="/WEB-INF/jsp/"></property>
- <property name="suffix" value=".jsp"></property>
- </bean>
- </beans>
然后,修改web.xml文件,新的内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <servlet>
- <servlet-name>springapp</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>springapp</servlet-name>
- <url-pattern>*.htm</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>
- index.jsp
- </welcome-file>
- </welcome-file-list>
- <jsp-config>
- <taglib>
- <taglib-uri>/spring</taglib-uri>
- <taglib-location>/WEB-INF/tld/spring-form.tld</taglib-location>
- </taglib>
- </jsp-config>
- </web-app>
在web.xml里面,由于添加了<listener>,所以需要创建一个applicationContext.xml 文件,位置和web.xml是在一起的。这个文件也是一个很重要的配置文件,请大家注意下它和web.xml的关系,以及和整个springframework的关系。 applicationContext.xml 的内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
-
- <bean id="productManager" class="springapp.service.SimpleProductManager">
- <property name="productDao" ref="productDao"/>
- </bean>
- <bean id="productDao" class="springapp.repository.JdbcProductDao">
- <property name="dataSource" ref="dataSource"/>
- </bean>
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- </bean>
- <bean id="propertyConfigurer"
- class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations">
- <list>
- <value>classpath:jdbc.properties</value>
- </list>
- </property>
- </bean>
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"/>
- </bean>
- <aop:config>
- <aop:advisor pointcut="execution(* *..ProductManager.*(..))" advice-ref="txAdvice"/>
- </aop:config>
- <tx:advice id="txAdvice">
- <tx:attributes>
- <tx:method name="save*"/>
- <tx:method name="*" read-only="true"/>
- </tx:attributes>
- </tx:advice>
- </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,如下图所示:
3:输入server.bat后,如果得到下面的内容就ok了。
这样就完成了数据库的启动。 接下来要运行前面创建的两个数据库sql文件,分别是create_products.sql和load_data.sql。 下面介绍一下运行这两个文件的方法。 在create_products.sql上鼠标右键,在弹出菜单中选择“Execute SQL Files”
在弹出的对话框里的“Database Server Type”选择“HSQLDB_1.8”,然后在“Connection profile name”,点击“Create…”按钮,弹出如下窗口,并按照下图所示,选择“HSQLDB”
选择好后,点击“Next”按钮,得到下面的对话框
在上图中点击红色框的地方,会弹出一个下面的对话框
在“Name/Type”选项卡里,作如下图的选择
在“Jar List”选项卡里,先点击右侧的“Clear All”按钮;然后点击“Add JAR/Zip”按钮,来选择在程序里面的hsqldb.jar包文件,我的选择,如下图所示:
在“Properties”选项卡里的内容可以不用动,直接点击“OK”按钮。 然后在接下来的对话框的“Database location”里输入“hsql://localhost”,输入后的画面如下图所示:
这里要确保一下,Database里的内容是否是“spring001”。 为了测试一下有没有问题,可以点击“Test Connection”按钮,如果得到下面的画面就成功了。 现在就可以点击“OK”按钮,来开始运行create_products.sql脚本。运行后可以在Eclipse的“SQL Results”里看到运行的结果。
下面,按照相同的办法运行load_data.sql,可以在Eclipse里的“SQL Results”里看到如下运行结果。
然后是启动web站点,启动方法和前面介绍过的一样,如果没有问题,会得到下面的画面
到这里,就算是完成了入门的部分。 重点总结: 1:jdbc.properties文件的使用方法。 2:DAO class的使用方法。 3:springframework中是如何实现事务的。 4:springframework中是如何实现connection pool的。 END |