利用PreparedStatement处理登录、注册、转账等功能

package day03;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

import day01.DBUtil;
import day01.DBUtil2;

/**
 * 与用户相关的业务逻辑
 */
public class UserService {
	public static void main(String[] args) {
		/**
		 * 程序启动后:选择1,2,3,4等操作
		 * 1.注册新用户  用户ID从1开始
		 * 2.更改用户信息
		 * 3.删除用户信息
		 * 4.查询用户信息
		 */
		System.out.println("请输入选项:");
		System.out.print("1:注册	");
		System.out.print("2:登录	");
		System.out.print("3:修改	");
		System.out.print("4:删除	");
		System.out.print("5:查询	");
		System.out.println("6:转账");
		Scanner scan = new Scanner(System.in);
		int option = Integer.parseInt(scan.nextLine().trim());
		switch(option){
			case 1:
				//注册
				regUser(scan);
				break;
			case 2:
				//登录
				login(scan);
				break;
			case 3:
				//修改
				modify(scan);
				break;
			case 4:
				//删除某条记录
				delete(scan);
				break;
			case 5:
				//查询某条记录
				find(scan);
				break;
			case 6:
				giveMoney(scan);
				break;
			default:
				System.out.println("输入有错");
		}
	}
	
	//转账
	public static void giveMoney(Scanner scan){
		/**
		 * 1.获取用户输入的信息
		 * 2.必要的验证,查看转出账户余额是否够
		 * --事务开始的地方
		 * 3.更新转出账户的余额
		 * 4.更新转入账户的余额
		 * --事务结束的地方
		 */
		System.out.println("现在是转账操作");
		System.out.println("请输入您的帐号:");
		String fromUser = scan.nextLine().trim();
		System.out.println("请输入收款人的帐号:");
		String toUser = scan.nextLine().trim();
		System.out.println("请输入转出金额:");
		String money = scan.nextLine().trim();
		//查看转出账户余额是否够
		String countSql = "SELECT money FROM user_wq "
					+ "WHERE name=?";
		try {
			Connection conn = DBUtil2.getConnection();
			//事物中有多个业务要处理时,关闭自动提交
			conn.setAutoCommit(false);
			
			PreparedStatement ps = conn.prepareStatement(countSql);
			ps.setString(1, fromUser);
			ResultSet rs = ps.executeQuery();
			//判断是否查询出数据
			if(rs.next()){
				int count = rs.getInt("money");
				//判断余额是否足够
				if(count >= Integer.parseInt(money)){
					//执行转账操作
					String fromSql = "UPDATE user_wq SET money=money-? "
								+ "WHERE name=?";
					ps = conn.prepareStatement(fromSql);
					ps.setInt(1, Integer.parseInt(money));
					ps.setString(2, fromUser);
					//修改当前用户的余额
					int flag = ps.executeUpdate();//此处并不会自动提交
					if(flag > 0){
						//修改收款人余额
						String toSql = "UPDATE user_wq SET money=money+? "
									+ "WHERE name=?";
						ps = conn.prepareStatement(toSql);
						ps.setInt(1, Integer.parseInt(money));
						ps.setString(2, toUser);
						if(ps.executeUpdate() > 0){
							System.out.println("转账成功");
							/**
							 * 两次更新账户操作均成功,我们才认为这次
							 * 转账操作完毕,提交事务
							 */
							conn.commit();//提交事务
						}else{
							System.out.println("转账失败:没有收款人:"+toUser);
							/**
							 * 若第二次更新失败,那么整次操作就算失败
							 * 应该回滚事务
							 */
							conn.rollback();//回滚事务
						}
					}
				}else{
					System.out.println("余额不足");
				}
			}else{
				System.out.println("没有该用户:"+fromUser);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil2.closeConnection();
		}
	}
	
	//注册
	public static void regUser(Scanner scan){
		/**
		 * 1.获取用户输入的相关信息
		 * 2.获取连接
		 * 3.获取Satatement
		 * 4.先获取ID的最大值,对该值+1,作为当前记录的主键值
		 * 5.插入记录
		 * 6.关闭连接
		 */
		try{
			System.out.println("现在是注册操作:");
			System.out.println("请输入用户名:");
			String user = scan.nextLine().trim();
			System.out.println("请输入密码:");
			String pwd = scan.nextLine().trim();
			System.out.println("请输入账户金额:");
			String money = scan.nextLine().trim();
			System.out.println("请输入邮箱:");
			String email = scan.nextLine().trim();
			Connection conn = DBUtil2.getConnection();
			Statement state = conn.createStatement();
			//此处要使用别名,否则后面获取时要使用rs.getInt("MAX(id)");
			String idSql = "SELECT MAX(id) id FROM user_wq";
			ResultSet rs = state.executeQuery(idSql);
			int id = -1;
			if(rs.next()){
				id = rs.getInt("id");
			}
			//统计出最大值后对ID加1
			id++;
			rs.close();//关闭节约资源
			String sql = "INSERT INTO user_wq VALUES (?,?,?,?,?)";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setInt(1, id);
			ps.setString(2, user);
			ps.setString(3, pwd);
			ps.setString(4, money);
			ps.setString(5, email);
			int flag = ps.executeUpdate();
			if(flag >0){
				System.out.println("注册成功!欢迎你"+user);
			}else{
				System.out.println("呵呵");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			DBUtil.closeConnection();
		}
	}

	//登录(有注入攻击 a' or '1'='1 )
	public static void login(Scanner scan){
		/**
		 * 1.要求输入用户名和密码
		 * 2.根据用户输入作为条件去表中查询
		 * 3.若查询出数据,则说明输入正确
		 */
		System.out.println("现在是登录操作");
		System.out.println("请输入用户名:");
		String user = scan.nextLine().trim().toLowerCase();
		System.out.println("请输入密码:");
		String pwd = scan.nextLine().trim();
		try{
			Connection conn = DBUtil2.getConnection();
			//注意输入端额大小写和数据库里面的大小写
			String sql = "SELECT * FROM user_wq WHERE "
						+"LOWER(name)="+"LOWER(?)"+" AND "
					    +"password=?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, user);
			ps.setString(2, pwd);
			ResultSet rs = ps.executeQuery();
			//根据用户的输入看能否查到数据
			if(rs.next()){
				System.out.println("登陆成功");
			}else{
				System.out.println("用户名或密码错误");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			DBUtil2.closeConnection();
		}
	}

	//修改(以修改用户名为例)
	public static void modify(Scanner scan){
		try {
			System.out.println("现在是修改操作");
			System.out.println("请输入修改数据的ID:");
			int id = Integer.parseInt(scan.nextLine().trim());
			System.out.println("请输入修改后的姓名:");
			String name = scan.nextLine().trim();
			Connection conn = DBUtil2.getConnection();
			String sql = "UPDATE user_wq SET name=? WHERE id=?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, name);
			ps.setInt(2, id);
			int flag = ps.executeUpdate();
			if(flag > 0){
				System.out.println("修改成功");
			}else{
				System.out.println("修改失败");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil2.closeConnection();
		}
	}
	
	//删除某条记录(以用户名为例)
	public static void delete(Scanner scan){
		try {
			System.out.println("现在是删除操作");
			System.out.println("请输入删除的姓名:");
			String name = scan.nextLine().trim();
			Connection conn = DBUtil2.getConnection();
			String sql = "DELETE FROM user_wq WHERE name=?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, name);
			int flag = ps.executeUpdate();
			if(flag > 0){
				System.out.println("删除成功");
			}else{
				System.out.println("删除失败");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil2.closeConnection();
		}
	}
	
	//查询某条记录(以用户名为例)
	public static void find(Scanner scan){
		try {
			System.out.println("现在是查询操作");
			System.out.println("请输入用户的姓名:");
			String str = scan.nextLine().trim();
			Connection conn = DBUtil2.getConnection();
			String sql = "SELECT * FROM user_wq WHERE name=?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, str);
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String password = rs.getString("password");
				int money = rs.getInt("money");
				String email = rs.getString("email");
				System.out.println("查询结果为:");
				System.out.println("id="+id+"\nname="+name+"\npassword="+password+"\nmoney="+money+"\nemail="+email);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil2.closeConnection();
		}
	}
}

所用到的工具类为:

package day01;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;

/**
 * 使用连接池技术管理连接
 */
public class DBUtil2 {
	// 数据库连接池
	private static BasicDataSource ds;
	// 为不同线程管理连接
	private static ThreadLocal<Connection> tl;
	static {
		Properties p = new Properties();
		InputStream is = DBUtil2.class.getClassLoader().getResourceAsStream("wq/config.properties");
		try {
			p.load(is);
			is.close();
			String driver = p.getProperty("driver").trim();
			String url = p.getProperty("url").trim();
			String user = p.getProperty("user").trim();
			String password = p.getProperty("password").trim();
			int initsize = Integer.parseInt((p.getProperty("initsize")));
			int maxactive = Integer.parseInt(p.getProperty("maxactive"));
			long maxwait = Integer.parseInt(p.getProperty("maxwait"));
			// 初始化连接池
			ds = new BasicDataSource();
			// 设置驱动
			ds.setDriverClassName(driver);
			// 设置url
			ds.setUrl(url);
			// 设置数据库用户名
			ds.setUsername(user);
			// 设置数据库密码
			ds.setPassword(password);
			// 设置初始化连接数量
			ds.setInitialSize(initsize);
			// 设置连接池允许的最大连接数量
			ds.setMaxActive(maxactive);
			// 设置最大等待时间
			ds.setMaxWait(maxwait);
			//初始化线程本地
			tl = new ThreadLocal<Connection>();
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("加载配置文件失败", e);
		}
	}
	
	/**
	 * 通过连接池获取一个空闲连接
	 * @throws SQLException 
	 */
	public static Connection getConnection() throws SQLException{
		Connection conn = ds.getConnection();
		tl.set(conn);
		return conn;
	}
	/**
	 * 关闭数据库连接
	 */
	public static void closeConnection(){
		try {
			Connection conn = tl.get();
			if(conn != null){
				//回复连接为自动提交事务
				conn.setAutoCommit(true);
				/**
				 * 通过连接池获取的此处的Connection的
				 * close()方法实际上并没有将连接关闭,
				 * 而是将该连接归还给连接池
				 */
				conn.close();
				tl.remove();//将该连接从线程本地删除
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
测试结果如下:

请输入选项:
1:注册	2:登录	3:修改	4:删除	5:查询	6:转账
6
现在是转账操作
请输入您的帐号:
jack
请输入收款人的帐号:
rose
请输入转出金额:
1000
转账成功
注意:事务中执行多条sql语句时,将连接的自动提交功能设置为false,当事务完成之后再手动提交事务,最后再将连接的提交事务方式修改为true(在工具类中修改)


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值