SQL注入问题(sql inject)-- 安全风险:
原因:由于是SQL拼接的方式处理SQL,拼接的字符串所得的SQL不符合预期
如:
这样不符合预期的期望
处理:带参数的SQL处理(prepareStatement更应该使用的方案)
如:SQL:select * from books where current_count > ? (?:参数占位符)
public static void main(String[] args) throws SQLException {
Scanner scanner=new Scanner(System.in);
try(Connection c = dataSource().getConnection()) {
System.out.print("> ");
while (scanner.hasNextLine()) {
String keyword = scanner.nextLine();
//? : 占位符 , 通过 ? 进行占位
String sql = "select * from books where current_count > ?";
System.out.println(" DEBUG:" + sql);
System.out.print("> ");
try (PreparedStatement ps = c.prepareStatement(sql)) {
//通过ps.setXXX(...)使用真实参数替换
//由于keyword是String 类型,所以使用setString()
//只有一个占位符,所以parameterIndex=1
ps.setString(1,keyword);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int bid = rs.getInt("bid");
String name = rs.getString("name");
int totalCount = rs.getInt("total_count");
int currentCount = rs.getInt("current_count");
System.out.printf(" %3d %10s %3d %3d\n",bid,name,totalCount,currentCount);
}
}
}
}
}
}
注意:通过字符串拼接构造SQL应该被完全禁止,不然很容易造成SQL注入
事务(Transaction):
数据的一致性(Consistency):DBMS用户根据其应用场景,对数据提出的一系列约束要求
如:图书管理系统中,任取books中的一本书book,要求:
1.book.存量>=0;
2.book.存量<=book.总量
3.book.总量 - book.存量 <-> 被借出去的数 = count(借阅记录中未归还的书)
事务的概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败(失败会回退,不会破坏数据一致性)。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
1.为什么会需要事务?
为了让过程中一致性破坏不影响数据整体的一致性
没有事务风险:(1)SQL执行过程,出现异常,导致SQL执行不下去
(2)当多个会话同时动同一份数据,造成互相干扰
2.SQL中如何使用事务?
start transaction:开启事务,告诉DBMS接下来的所有SQL被当做一个整体(事务)来对待
正常执行一条或多条SQL
commit:以成功的状态结束事务(提交事务),告诉BDMS,这组事务已经完成了
/rollback:回滚事务,代表本次事务全部不生效
3.JDBC中如何使用事务?
在jdbc 中执行事务
默认情况,每条SQL都当成一个独立的事务对待。自动进行提交(auto commit)关闭auto commit
明确进行commit
c.setAutoCommit(false):关闭自动提交功能
执行事务
c.commit():关闭事务
/c.rollback():回滚事务,代表本次事务全部不生效
事务回滚操作可以添加保存点,类似于游戏中的存档,使得回滚操作时,可以选择会滚到哪个保存点
索引(Index)--属于优化部分:
为什么会需要索引?
索引对于提高数据库的性能有很大的帮助,可以提高效率
索引是一种搜索树,但不是红黑树
数据建模(给定场景如何进行表的设计):
虽然目前专注于DB领域,但数据建模(数据抽象)的价值不局限于DB领域
三大层次:
1.现实世界(概念层)
2.开发人员头脑中的世界(逻辑层)
计算机软件世界
3.计算机硬件世界(物理层)
B+树 or 红黑树 or 顺序方式存储
哪种方式更快、哪种方式更好