小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
登陆练习
需求:
1.通过键盘录入用户名和密码
2.判断用户是否登录成功
select * from user where username = "" and password = "";
如果这个sql有查询结果,则成功反之失败
数据库
更改配置文件即可
代码
package cn.caq.jdbc;
import cn.caq.utils.JDBCutils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
/**
* 需求:
* 1.通过键盘录入用户名和密码
* 2.判断用户是否登录成功
*/
public class JDBCDemo08 {
public static void main(String[]args){
//1.键盘录入,接受用户名和密码
Scanner scanner = new Scanner(System.in);
System.out.println("请输入username:");
String username = scanner.nextLine();
System.out.println("请输入password");
String password = scanner.nextLine();
//2.调用方法
// JDBCDemo08 jdbcDemo08 = new JDBCDemo08();
// boolean login = jdbcDemo08.login(username, password);
boolean flag = new JDBCDemo08().login(username, password);
//3.判断结果,输出不同语句
if (flag){
System.out.println("Success!!!!!!");
}else {
System.out.println("username or passwd False!!!!!!!!");
}
}
//登录方法
public boolean login(String username,String password){
if (username == null || password == null){
return false;
}
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//1.连接数据库
try {
conn = JDBCutils.getConnection();
//2.定义sql
String sql = "select * from user where username = '"+username+"' and password = '"+password+"'";
//3.获取执行sql的对象
stmt = conn.createStatement();
//4.执行sql语句
rs = stmt.executeQuery(sql);
//5.判断
return rs.next();//有下一行返回true
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JDBCutils.close(rs,stmt,conn);
}
return false;//如果出现异常返回false
}
}
输出结果为:
请输入username:
zs
请输入password
123
Success!!!!!!
请输入username:
sadfa
请输入password
24323
username or passwd False!!!!!!!!
测试成功
JDBC控制事务
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2.操作:
1.开后事务
2.提交事务
3.回滚事务
3.使用connection对象来管理事务
开启事务: setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开后事务
在执行sql之前开启事务
提交事务: commit()
当所有sql都执行完提交事务
回滚事务: rollback()
在catch中回滚事务
下面通过一个转账实例来加深印象
转账实例
package cn.caq.jdbc;
import cn.caq.utils.JDBCutils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 事务操作
*/
public class JDBCDemo10 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
//1.获取连接
try {
conn = JDBCutils.getConnection();
//开启事务
conn.setAutoCommit(false);
//2.定义sql
//2.1张三 - 500
String sql1 = "update account set balance = balance - ? where id = ?";
//2.1李四 + 500
String sql2 = "update account set balance = balance + ? where id = ?";
//3.获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
//4.设置参数
pstmt1.setDouble(1, 500);
pstmt1.setInt(2, 1);
pstmt2.setDouble(1, 500);
pstmt2.setInt(2, 2);
//5.执行sql
pstmt1.executeUpdate();
//手动制造异常
int i = 3 / 0;
pstmt2.executeUpdate();
//提交事务
conn.commit();
} catch (Exception throwables) {
try {
if (conn != null) {
conn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}
}
}
如果中途出现任何异常,则触发回滚操作! 输出结果为:
java.lang.ArithmeticException: / by zero
at cn.caq.jdbc.JDBCDemo10.main(JDBCDemo10.java:43)
金额没有发生变化
成功了
小总结
通过事务的控制,来解决数据传输中可能遇到的问题,通过在程序中实现这一操作能很好的加深我们的印象