博主学习Java有几个月了,JavaEE的基本内容也都摸过了,所以上级布置了这么一个项目给练练手,萌新上路,还望多多包涵.
项目名
银行管理系统
项目描述
该系统应用场景类似ATM机有存款、取款、查看流水、转账等业务
具体功能
1. 登录注册
2. 存款
3. 取款
4. 转账
5. 查看流水
要求
6. 独立完成
7. 必须使用数据库以及MVC分包思想
8. GUI界面
说明:博主基本实现了全部功能,但初上路,对于mvc的分包思想掌握不好,名副其实的只会写代码2333,下面展示功能说明以及部分代码.截图放在最后,源代码以及数据库配置,有想参考的小伙伴请联系qq 2502513332(应该不会有人吧)
面向对象基本元素(如类,对象,继承,重载等等),GUI可视化设计,MySQL数据库,jdbc技术,c3p0连接池技术,mvc分层思想.
View层
GUI的设计:
所有窗口均使用 “添加Jframe窗口,设置容器,通过绝对布局往容器中添加组件,再由getText()方法获取键盘输入,以及按钮的监听事件实现各种功能”的思路.
定义容器:
Container c = this.getContentPane();
c.setLayout(null);
设计组件:
JLabel j1 = new JLabel("存款");
j1.setFont(new Font("宋体", Font.PLAIN, 24));
j1.setBounds(170, 0, 100, 40);
JLabel j2 = new JLabel("存款金额");
j2.setFont(new Font("宋体", Font.PLAIN, 20));
j2.setBounds(70, 70, 100, 40);
JLabel j3 = new JLabel("支付密码");
j3.setFont(new Font("宋体", Font.PLAIN, 20));
j3.setBounds(70, 140, 100, 40);
添加入容器:
c.add(j1);
c.add(j2);
c.add(j3);
c.add(j4);
c.add(j5);
c.add(j6);
c.add(j7);
事件监听:
j5.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if (j7.getText().length() == 6) {
if (j7.getText().equals(us.getBankPassword())) {
double d = Double.valueOf(j6.getText());
double e = d + us.getMoney();
UpdateSQL updateSQL = new UpdateSQL();
updateSQL.depositupdate(e, us);
setVisible(false);
} else {
JOptionPane.showMessageDialog(null, "密码错误!.", "提示", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(null, "密码错误!.", "提示", JOptionPane.ERROR_MESSAGE);
}
}
}
View层窗口的设计思路大致如上,但具体的组件参数,事件监听,条件控制,非常繁琐,不作多展示.
首先需要c3p0以及mysql connector等关键驱动jar包
然后需要给c3p0连接池配置xml文件,文件内容为加载驱动,以及选择数据库等
2. 连接数据库
此处又需要用到另一个工具类DataSourceUtils, 这个类提供了一系列操作数据库连接的工具方法,而我就用到了其中的DataSourceUtils.getConnection()方法获取连接的.这里以UpdateSQL为例:
获取链接:
Connection conn = null;
try {
conn = DataSourceUtils.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3. 执行SQL语句
对于如何使用SQL语句,我使用的是Dbutils中的QuerryRunner类,这个类中的方法可以简化SQL查询,同时不损失性能,具体使用方法如下
//1.核心类
QueryRunner queryRunner = new QueryRunner();
// 2.sql语句 UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
String sql = "update users set Password = ? WHERE Account = ? and BankId = ? and BankPassword = ?";
// 3.实际参数
Object[] parms = { a, us.getAccount(), us.getBankId(), us.getBankPassword() };
// 4.执行
int r = 0;
try {
r = queryRunner.update(conn, sql, parms);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
此外还使用了BeanHandler 类,可以从数据库返回一个完整对象,便于更新内存中User信息.
4. 关闭资源
这里是使用c3p0连接池技术的特殊之处了,在池中先创建一些Connection连接,等线程需要使用的时候直接拿就行,所以响应速度比较快。在使用完之后连接释放之后放回池中,但并未真正的关闭资源,等待下一次任务获取。所以就没有关闭资源的步骤了.