目录
JDBC API支持事务对数据库的加锁,并且提供了5种操作支持
SQL注入
利用非法的SQL拼接来达到入侵数据库的目的。
示例:
数据库中用户信息:
以登录为例:
public class User {
/*
登陆方法
*/
boolean doLogin(String name,String passwd){
boolean result = false;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.01:3306/jing","root","123456");
System.out.println("连接成功");
//获取Statement结果
Statement statement = connection.createStatement();
//查询数据库
String sql = "select * from user where name = "+name+" and passwd = "+passwd;
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet.next()) result = true;
//关闭资源
resultSet.close();
statement.close();
connection.close();
} catch (Exception e) {
System.out.println("连接失败");
e.printStackTrace();
}
return result;
}
}
public class App{
public static void main(String[] args) {
String name = "123 or 1=1";
String passwd = "123456";
User user = new User();
boolean login = user.doLogin(name,passwd);
if (login){
System.out.println("用户登录成功");
}else {
System.out.println("用户名或密码错误,请重新登录");
}
}
}
运行结果:
在上述代码中,通过用户名和密码与SQL语句进行拼接,查询数据库,当用户名和密码同时正确才能执行成功。
将name参数写成“name = 123 or 1=1” 则拼接成的语句是 select * from user where name = 123 or 1=1 and passwd=123456,name参数拼接中通过非法的SQL拼接达到修改SQL语义,就达到了入侵数据库的目的。当name = 123 或者 1=1 and passwd=123456 后面中只要任何一个成立即可 ,1=1 为true ,就不在判断passwd是否正确,因此对应登录操作给定用户名,不知道密码情况下也能完成登陆。
SQL注入问题解决方案
使用PreparedStatement解决:
PreparedStatement将SQL及参数分别传递到MySQL服务端,会先进行SQL语义检查,能够规避SQL注入问题,建议使用prepareStatement来处理JDBC连接数据库问题。
JDBC处理事务
/**
* 事务操作
* 在Connection中也提供相应方法
* connection.setAutoCommit(false); //true 自动提交 false:手动提交 首先要取消自动提交
* connection.commit(); //事务提交
* connection.rollback();//事务回滚
*/
try {
connection.setAutoCommit(false);
sql操作
connection.commit();
} execption(e){
connection.rollback();
}
使用JDBC事务步骤
- 获取Connection对象
- 取消Connection的事务自动提交方式
- 操作完毕提交事务
- 发生异常回滚事务
注意:在JDBC中,事务操作默认是自动提交,所以要修改提交方式。
JDBC API支持事务对数据库的加锁,并且提供了5种操作支持
int TRANSACTION_NONE = 0; 不提供事务
int TRANSACTION_READ_UNCOMMITTED = 1; 未提交事务
int TRANSACTION_READ_COMMITTED = 2; 读已提交事务
int TRANSACTION_REPEATABLE_READ = 4; 可重复事务
int TRANSACTION_SERIALIZABLE = 8; 串行化事务
以上都是学习过程中的知识点总结,如果有错误或者有疑问,欢迎指正交流吖~~