简单模拟支付宝转账系统

来源:互联网 发布:linux piwik 安装 编辑:程序博客网 时间:2024/04/29 04:51

此案例为加深对数据库操作时,对事务的理解,当转钱过程中由于某些原因发生错误时,会出现A的钱变少而B

无改变的状况,或是其他不正确的情况,注意正确的是A转给B10元,A-10   B+10,这个时候就需要使用Connection

的三个方法


首先,将自动提交设置为false,这里的自动提交指的是对sql语句的提交编译

通常状况下,默认是自动提交的,当调用PreparedStatement对象的execute方法时,就会自动提交

conn.setAutoCommit(false);


然后,在设置了false以后,就需要手动提交

conn.commit();


最后,当发生错误时,使用conn.rollback();可以撤销对数据库已做的改变,恢复原状

该方法通常写在catch中,且方法本身也需要try-catch




案例代码:

共四个类,其中DBUtil工具类获得Connection的对象

两个javabean模式的实体类,这里不贴代码了

最后的测试类,核心代码,方法包装时和选课系统虽然有不同,但也有相似之处

博主想过把jdbc封装成一个方法,但是有的sql语句需要设定?值,有的不需要,且设定的?值不确定是几个

还没有找到合适的处理方法


package userMoveMoney;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Scanner;public class MyTest {public static Scanner console=new Scanner(System.in);public static Connection conn=DBUtil.getConnection();public static void main(String[] args) {createUser();login();}/** * 创建客户 * @return */public static User createUser(){System.out.println("------------CREATE USER--------------");System.out.println("Please input you username");String username=console.next();System.out.println("Please input you password");String password=console.next();System.out.println("Please input you password again");String password2=console.next();if(password.equals(password2)){User user=new User(username,password);System.out.println("Create user success!");saveUserToSql(user);return user;}else{System.out.println("The password is wrong,do you want re-create? 0/1");int info=console.nextInt();if(info==1){createUser();}else{System.exit(0);}return null;}}/** * 保存到数据库中 * @param user */private static void saveUserToSql(User user){PreparedStatement ptmt;String sql="INSERT users(username,password) VALUES(?,?)";try {ptmt=conn.prepareStatement(sql);ptmt.setString(1,user.getUsername());ptmt.setString(2, user.getPassword());ptmt.execute();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 登陆 */public static void login(){System.out.println("-------------LOGIN---------------");System.out.println("Please input you username:");String username=console.next();System.out.println("Please input you password:");String password=console.next();String sql="SELECT password FROM users WHERE username=?";PreparedStatement ptmt;ResultSet rs;String checkPassword=null;try {ptmt=conn.prepareStatement(sql);ptmt.setString(1,username);ptmt.execute();rs=ptmt.getResultSet();while(rs.next()){checkPassword=rs.getString("password");}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(password.equals(checkPassword)){System.out.println("Login succcess!");checkIsUserWantMoveMoney(username);}else{System.out.println("Login fail!");}}/** * 判断用户是否想转钱 */private static void checkIsUserWantMoveMoney(String userFromName){System.out.println("Do you want to move money to other account?0/1");int info=console.nextInt();if(info==0){System.out.println("GOOD BYE!");}else{getMoveMoneyInfo(userFromName);}}/** * 获得收钱方的姓名和转钱金额 */private static void getMoveMoneyInfo(String userFromName){System.out.println("Please input name who is gonna accept the moeny:");String userToName=console.next();boolean flag=checkUserExist(userToName);if(flag){System.out.println("Please input money you want to move:");int userToDeposit=console.nextInt();moveMoney(userFromName,userToName,userToDeposit);System.out.println("Move Money Success!");}else{System.out.println("No such account exist");}}/** * 转钱 * @param userToName * @param userToDeposit */private static void moveMoney(String userFromName,String userToName,int userToDeposit){String sql="UPDATE users SET userDeposit=userDeposit+? WHERE username='"+userToName+"'";String sql2="UPDATE users SET userDeposit=userDeposit-? WHERE username='"+userFromName+"'";PreparedStatement ptmt;try {conn.setAutoCommit(false);ptmt=conn.prepareStatement(sql);ptmt.setInt(1, userToDeposit);ptmt.execute();ptmt=conn.prepareStatement(sql2);ptmt.setInt(1, userToDeposit);ptmt.execute();conn.commit();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();try {conn.rollback();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}/** * 判断用户名是否存在 * @param userToName * @return */private static boolean checkUserExist(String userToName){String sql="SELECT username,userID FROM users WHERE username='"+userToName+"'";PreparedStatement ptmt;ResultSet rs;boolean flag=false;try {ptmt=conn.prepareStatement(sql);ptmt.execute();rs=ptmt.getResultSet();flag=rs.next();} catch (SQLException e) {e.printStackTrace();}if(flag){return true;}else{return false;}}}




创建一个用户,登陆,然后选择用户进行转账,会自动判断是否存在此用户

其实应该设置的更加具有互动性,再添加一个方法,判断是新用户还是旧用户,是否需要注册

已经注册是也要判断是否已经存在同样的用户名

0 0
原创粉丝点击