小型仓库管理系统的详细设计实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
小型仓库管理系统的详细设计及实现
1.系统设计概述
(1)问题域部分,设计构造一组为底层应用建立模型的类和对象,细化分析结果;由建立数据对象部分实现。
(2)人机交互部分,设计一组有关类接口视图的用户模型的类和对象,设计用户界面;由建立商品数据维护界面部分实现。
(3)任务管理部分,确定系统资源的分配,设计用于系统中类的行为控制的对象/类;由建立商品类别显示模型和商品类型模型部分以及建立商品数据维护界面部分共同实现。
(4)数据管理部分,确定持久对象的存储,将对象转换成数据库记录或表格;由连接数据库和建立商品数据访问对象部分实现。
2.连接数据库
要通过Java访问数据库,必须要使用JDBC(Java Data Base Connectivity,java数据库连接),访问不同的数据库,采用的JDBC驱动程序也不同。连接Access采用Jdbc-odbc桥的方式比较方便,不需要引入额外的驱动程序包。
主流的数据库都提供了专门的JDBC驱动,如ORCALE、Sql Server、Sybase等等,对于微软的Access和Excel以及其他的一些小型的桌面数据库,可以通过JDBC-ODBC桥接的方式来访问。通过编码,我们不需要在环境中配置ODBC数据源,就可以直接访问这些小型桌面数据库。
在应用系统中,数据库的连接参数一般都是写在配置文件当中,以防止数据库的属性的变化导致程序的修改。对于本任务来说,Access是桌面数据库,我们需要知道的只是Access 数据库文件的路径,因此我们可以将Access数据库文件拷贝到发布路径下,从而可以通过编码获得数据库文件路径,而不需要使用配置文件。
package test.sample.dao;
import .URL;
import java.sql.Connection;
import java.sql.DriverManager;
public class DaoFactory {
static public Connection getConnection() throws Exception{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载数据库驱动
URL dbUrl =DaoFactory.class.getClassLoader().getResource("Mystock.mdb");
String dbPath=dbUrl.getPath(); //通过Java的类加载机制,获得数据库文件路径
if (dbPath.charAt(0)=='/'){ //去掉路径的第一个字符/
dbPath=dbPath.substring(1);
}
String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+dbPath;
Connection con = DriverManager.getConnection(url, "sa", "");
return con;
}
}
Class.forName方法的作用是通过类的完整路径名获得一个类的实例,在本例子中的作用是加载我们要使用的数据库驱动。在使用DriverManager获得数据库连接前,必须通过此语句加载数据库驱动。
ClassLoader类负责管理Java编译后代码的加载,因此能够获取class文件的加载路径,也就是应用的发布路径。我们把数据库文件放到发布路径下(即class文件所在路径),即可以通过ClassLoader类的getResource方法获得该文件的绝对路径。由于获得的绝对路径的第一个字符是“/”,这是为了兼容不同的操作系统而导致的,这个符号在Access的数据库路径上是不合法的,需要去掉。
通过数据库url,提供数据库的驱动描述,以及数据库的路径,就可以使用DriverManager 类来获得数据库连接。
3.建立商品数据访问对象
从数据库中提取数据,以及向数据库中插入记录和删除数据,都必须使用SQL语句来完成。因此数据访问对象的方法,实际上就是通过Java数据访问对象,在数据库数据和数据对象之间进行转换。
在数据库的访问中,我们需要用到几个数据访问对象:
1.java.sql.Connection:用来获得数据库连接。
2.java.sql.PreparedStatement和java.sql.Statement:都可以用来执行SQL语句。其中PreparedStatement的功能较强,SQL 语句被预编译并且存储在PreparedStatement 对象中。然后可以使用此对象高效地多次执行该语句。PreparedStatement可以设置set方法设置参数。以下是一个设置参数的示例中,con 表示一个活动连接:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 2000.00) ;
pstmt.setInt(2, 100) ;
pstmt.excuteUpdate();
SQL语句中需要赋值的部分可以用?代替,然后通过set方法来设置参数。由于设计参数时不同的类型方法也不同,能够很好的处理不同的类型。例如在设置日期型的参数时,可以直接通过setDate方法设置参数,而如果通过SQL语句的字符串拼写,则必须对日期进行格式化。对于复杂的Insert、update和delete的SQL语句,以及需要多次执行而参数不同的SQL语句,使用PreparedStatement具有明显优势。
3.java.sql.ResultSet:从数据库库提取后的数据保存在ResultSet中,ResultSet提供的getter 方法能够方便的返回记录集中的数据。
程序代码设计如下:
package test.sample.dao;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import test.sample.bean.Product;
import test.sample.bean.ProductType;
public class ProductDao {
//提取商品数据,并转换为商品对象,存储到列表中
public static List getProductList() throws Exception{
Connection conn=DaoFactory.getConnection();
try{
Statement st = conn.createStatement();
String sql="select * from Product";
ResultSet rs = st.executeQuery(sql);
List list=new ArrayList();
while(rs.next()){
Product p=new Product();
p.setId(rs.getInt("ID"));
p.setName(rs.getString("NAME"));
p.setType(rs.getInt("TYPE"));
p.setCountInBox(rs.getString("COUNT_IN_BOX"));
p.setPrice(rs.getFloat("PRICE"));
p.setStock(rs.getInt("STOCK"));
list.add(p);
}
rs.close();
st.close();
return list;
}
finally{
conn.close();
}
}