利用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(在工具类中修改)
相关文章推荐
- iOS实战演练之关于数据交互的问题(利用XAMPP搭建本地服务器, 编写PHP代码实现iOS端注册登录功能)
- 练习:利用迭代器写一个注册登录功能
- 利用node.js+mongodb如何搭建一个简单登录注册的功能详解
- java利用jdbc连接Mysql数据库——实现登录注册功能
- rails 使用devise完成注册、登录功能
- Silverlight 2.5D RPG游戏技巧与特效处理:(十九)基于WCF的注册与登录
- 登录以及注册功能的分析
- 利用Delphi为Visual C++添加JPEG图形处理功能
- 利用Delphi为Visual C++添加JPEG图形处理功能
- JSP+JAVA+MYSQL编写分页功能以及登录注册功能(有小问题,尚未解决,仅供参考)
- PetShop 4.0学习--登录以及注册功能的分析
- 利用Java事件处理机制实现录制、回放功能
- 利用.net部署功能注册自己的文件类型
- Delphi简单TCP聊天程序(三):登录注册功能
- Java Web 案例一 登录、注册功能实现
- Silverlight 2.5D RPG游戏技巧与特效处理:(十九)基于WCF的注册与登录
- ocourse.net用户注册和登录功能
- [转]利用Java事件处理机制实现录制、回放功能
- 1.JBoss下利用JAAS处理登录
- Ajax-HelloWorld(运用AJAX技术实现会员注册登录验证功能)