先建个大思路框架:显示层(JSP)---控制层(Servlet)---业务层(Service)---数据访问层(DAO)---数据库(DB).
今天就先搭一个数据库的架子,至于 各个功能的实现,明天在做详细分析!
1.建表:
bookstore.sql:
# MySQL-Front 3.2 (Build 6.2)
;
;
;
;
# Host: localhost:3309 Database: bookstore
# ------------------------------------------------------
# Server version 5.0.18-nt
#
# Table structure for table books
#
CREATE DATABASE bookstore;
USE bookstore;
DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
`id` varchar(8) NOT NULL,
`name` varchar(24) default NULL,
`title` varchar(96) default NULL,
`price` float default NULL,
`yr` int(11) default NULL,
`description` varchar(30) default NULL,
`saleAmount` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
#
# Dumping data for table books
#
INSERT INTO `books` (`id`,`name`,`title`,`price`,`yr`,`description`,`saleAmount`) VALUES ('201','王芳','Java编程指南',33.75,1999,'让读者轻轻松松掌握Java语言',1);
INSERT INTO `books` (`id`,`name`,`title`,`price`,`yr`,`description`,`saleAmount`) VALUES ('202','张丙','Weblogic技术参考',45.99,2002,'真的不错耶',1);
INSERT INTO `books` (`id`,`name`,`title`,`price`,`yr`,`description`,`saleAmount`) VALUES ('203','孙艳','Oracle数据库教程',40,2003,'关于Oracle的最畅销的技术书',1);
INSERT INTO `books` (`id`,`name`,`title`,`price`,`yr`,`description`,`saleAmount`) VALUES ('204','大卫','从Oak到Java: 语言的革命',20.75,1998,'很值得一看',1);
INSERT INTO `books` (`id`,`name`,`title`,`price`,`yr`,`description`,`saleAmount`) VALUES ('205','阿明','Apache从入门到精通',50.75,2002,'权威的Apache技术资料',1);
INSERT INTO `books` (`id`,`name`,`title`,`price`,`yr`,`description`,`saleAmount`) VALUES ('206','洪军','Java与数据算法 ',54.75,2002,'权威的Java技术资料',1);
#
# Table structure for table customer
#
DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
`id` int(11) NOT NULL default '0',
`name` varchar(30) default NULL,
`cardid` varchar(11) default NULL,
`balance` float(6,2) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
#
# Dumping data for table customer
#
INSERT INTO `customer` (`id`,`name`,`cardid`,`balance`) VALUES (1,'Tom','1234567890',1000);
;
;
;
2.数据库是必要要的!有了 数据库就要 有 数据库连接 :
这里要先导架包:
commons-collections-3.1.jar
commons-dbcp-1.2.2.jar
commons-pool-1.2.jar
mysql-connector-java-5.1.6-bin.jar
要导入连接池的配置文件
dbcpconfig_mysql.properties
dbcpconfig_oracle.properties
package com.myshopping.db;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import com.myshopping.util.MyBookConstants;
import com.myshopping.web.MyBookWebConfig;
public class DBHelper {
private static DataSource ds = null;
static{
String dbType = null;
dbType = MyBookWebConfig.getInstance().getValue(MyBookConstants.DB_TYPE);
String propFileName = null;
if(dbType.equals("mysql")){
propFileName = "dbcpconfig_mysql.properties";
}
if(dbType.equals("oracle")){
propFileName = "dbcpconfig_oracle.properties";
}
InputStream is = null;
is = DBHelper.class.getClassLoader().getResourceAsStream(propFileName);
Properties prop = new Properties();
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(MyBookConstants.LOAD_DBPROP_FILE_EXCEPTION_MESSAGE);
}
try {
ds = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(MyBookConstants.GET_DATASOURCE_EXCEPTION_MESSAGE);
}
}
public static Connection getonnection(){
Connection conn = null;
try {
conn = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(MyBookConstants.GET_CONNECTION_EXCEPTION_MESSAGE);
}
return conn;
}
public static void releaseDBSource(ResultSet rs,Statement st,Connection conn){
try {
if(rs != null)
rs.close();
if(st != null)
st.close();
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(MyBookConstants.CLOSE_DATABASE_SOURCE_EXCEPTION_MESSAGE);
}
}
}
3.上段代码中用了 dbType,这里选择数据库时,我们要做个监听,并在WEB.XML中进行配置:
package com.myshopping.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.myshopping.util.MyBookConstants;
import com.myshopping.web.MyBookWebConfig;
public class BookAppListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
ServletContext sc = arg0.getServletContext();
String dbType = sc.getInitParameter("dbType");
MyBookWebConfig.getInstance().addParam(MyBookConstants.DB_TYPE, dbType);
}
}
4.有了dbType,就要添加键值:
package com.myshopping.web;
import java.util.HashMap;
import java.util.Map;
public class MyBookWebConfig {
private Map paramMap = null;
private MyBookWebConfig(){
paramMap = new HashMap();
}
private static MyBookWebConfig instance = null;
static{
instance = new MyBookWebConfig();
}
public static MyBookWebConfig getInstance(){
return instance;
}
public void addParam(String key, String value){
this.paramMap.put(key, value);
}
public String getValue(String key){
if(this.paramMap.get(key) == null)
return null;
else
return (String) this.paramMap.get(key);
}
}
5.这里我们还要定一个常量类,方便调用!
package com.myshopping.util;
public class MyBookConstants {
public static final String DB_TYPE = "dbType";
//异常信息
public static final String GET_CONNECTION_EXCEPTION_MESSAGE = "根据 已经数据源获取数据连接异常";
public static final String GET_DATASOURCE_EXCEPTION_MESSAGE = "根据已经加载成功的属性文件获取数据源异常";
public static final String LOAD_DBPROP_FILE_EXCEPTION_MESSAGE = "加载数据库属性文件异常";
public static final String CLOSE_DATABASE_SOURCE_EXCEPTION_MESSAGE = "根据 已经数据源获取数据库连接异常 ";
}
配置下web.xml,这里就写需要的配置的代码段:
<context-param>
<param-name>dbType</param-name>
<param-value>mysql</param-value>
</context-param>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>CatalogServlet</servlet-name>
<servlet-class>com.myshopping.servlet.CatalogServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CatalogServlet</servlet-name>
<url-pattern>/catalogServlet</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.myshopping.listener.BookAppListener</listener-class>
</listener>
上面这几部是完成功能实现的基础,就像建房子一样,没有根基,上层的思想再完美也是徒劳!明天实现获取图书的功能!