仓库管理系统总结(1)
今天比较累了,学到的还蛮多的!趁现在还有点精神,把自己今天做的事总结一下,加深印象,免得以后忘了!
这两天的主要任务是一个仓库管理系统。!
今天完成了一个查询,一个添加功能!就这两个功能就把我累得够呛了!
个人觉得做类似的这种小项目,关键的要理解的地方就就是JDBC和数据库的连接了,
本人用的是mysql。Mysql的安装就不罗嗦了。
关键的代码:
PreparedStatement ps = null;
Connection ct = null;//定义与数据源得到连接
ResultSet rs = null;
Vector rowData, columnNames;
Class.forName("com.mysql.jdbc.Driver");//加载驱动
Class.forName("com.mysql.jdbc.Driver").newInstance();//生产相应的Driver实例。
下面是数据库操作的全部代码
public void init(String sql)
{
if(sql.equals(""))
{
sql = "select * from cangku";
}
columnNames = new Vector();
columnNames.add("cid");
columnNames.add("cName");
columnNames.add("cAddress");
columnNames.add("cPid");
columnNames.add("cbeizhu");
rowData = new Vector();
//从数据库中取出行数据
try {
//加载驱动
/Class.forName("org.git.mm.mysql.Driver").newInstance();
Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver").newInstance();
//String url="jdbc:mysql://localhost:3306/store?user=root&password= ";
//ct = DriverManager.getConnection("jdbc:odbc:store","root","");
ct = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/store","root",""); ps = ct.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next())
{
Vector yi = new Vector();
//String text=new String(text.getBytes("ISO-8859-1"),"GBK");
String text = rs.getString(1);
String text1 = new String(text.getBytes("ISO-8859-1"),"GBK");
yi.add(text1);
yi.add(rs.getString(2));
yi.add(rs.getString(3));
yi.add(rs.getString(4));
yi.add(rs.getString(5));
rowData.add(yi);
}
} catch (Exception e) {
e.printStackTrace();
}finally
{
if(rs!=null)
try {
rs.close();
if(ps!=null)
ps.close();
if(ct!=null)
ct.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在这里将对数据库操作的代码建立在一个独立的类中。
这个类继承了一个AbstactTableModel,
AbstactTableModel 作用:用来接收数据库的操作。
AbstactTableModel 有必须要实现的三个方法:
//得到表中共有多少列
public int getColumnCount()
//得到共有多少行
public int getRowCount()
//得到某一行某一列的具体数据
public Object getValueAt(int rowIndex, int columnIndex)
return (String)((Vector)this.rowData.get(rowIndex)).get(columnIndex);
这里先得到某一行的数据 this.rowData.get(rowIndex)
在将行的数据转换成向量后获得列的数据,因为表中的数据都是字符串的,多以强制转换了。
如果表中的数据包含int 则不必强制转换。
下面是实现的查询功能:
if(e.getSource() == jb1)//jb1表示查询按钮
{
System.out.println("查询数据库!");
String name = jtf.getText().trim();//从输入框中得到查询得到内容String sql = "select * from cangku where cid = '"+name+"'";//这里是按编号来查询的
Mymodel my = new Mymodel(sql);//建议一个新的model,重新处理数据库表中信息 在Mymodel中两个构造函数,通过sql来决定调用哪一个
jt.setModel(my);//更新
}
下面实现添加功能:
点击添加后,弹出一个添加仓库的框,框的布局不多说了。
框是格外一个类的
jp1.setLayout(new GridLayout(5,1));
jp2.setLayout(new GridLayout(5,1));
两个5行一列的
this.add(jp1,BorderLayout.WEST);
this.add(jp2,BorderLayout.CENTER);
this.add(jp3,BorderLayout.SOUTH);
在流布局
添加功能要操作数据库。
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == jb1)//jb1是框上的添加按钮
{
//定义好需要的参数
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
PreparedStatement pstamt = null;
try {
Class.forName("com.mysql.jdbc.Driver");//加载驱动
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/store","root","");
String strsql = "insert into cangku values(?,?,?,?,?)";
pstamt=(PreparedStatement)conn.prepareStatement(strsql);
//将要插入的数据插进表中
pstamt.setString(1, jtf1.getText());
pstamt.setString(2, jtf2.getText());
pstamt.setString(3, jtf3.getText());
pstamt.setString(4, jtf4.getText());
pstamt.setString(5, jtf5.getText());
pstamt.executeUpdate();
this.dispose();//关闭对话框
} catch (ClassNotFoundException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(SQLException e2)
{
e2.printStackTrace();
} catch (InstantiationException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
} catch (IllegalAccessException e4) {
// TODO Auto-generated catch block
e4.printStackTrace();
}finally
{
if(conn!=null)
try {
conn.close();
if(stmt!=null)
stmt.close();
if(rs!=null)
rs.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
程序中不知怎么出现了乱码,配置文件也该了。明天还得继续。
程序中有什么需要改进,优化的地方,望指教。谢谢!