您的位置:首页 > 其它

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

2017-04-04 17:31 246 查看
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.o
4000
ut.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(在工具类中修改)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: