三大范式:
1. 列不可分
2. 要有主键
3. 不可存在递归依赖
比如商品表里面关联商品类别表,那么只需要一个关联字段product_type_id即可,其他字段信息可以通过表关联查询即可得到。
如果商品表还存在一个商品类别名称字段,如product_type_name,那就属于存在传递依赖的情况,第三范式主要是从空间的角度来考虑,避免产生冗余信息,浪费磁盘空间。
反范式设计(第三范式)
原因1. 提高查询效率(读多写少)
预处理解决方案:采用PreparedStatement对象,而不是Statement对象
MyBatis如何解决SQL注入的问题?采用#
MyBatis的#和$的差异,#可以解决SQL注入,而?号不能解决
JDBC对事务的操作是基于Connection来进行控制的
try{
connection.setAutoCommit(false);
...
connection.commit();
} catch (Exception e){
try{
} catch (SQLException e1){
e1.printStackTrace();
}
}
事务:
原子性是基础,要么一起成功要么一起失败
隔离性是手段,一个事务的执行不被其他事务干扰,并发执行的各个事务之间不能相互干扰
一致性是约束条件,数据库中的数据在事务操作前后都必须满足业务规则约束
持久性是目的,事务提交结果便是永久性的
简称ACID
事务的隔离级别(解决并发情况下,数据安全问题):
1. READ UNCOMMITTED 读未提交,脏读,不可重复读,幻读有可能发生(基本不会使用,不安全)
2. READ COMMITTED读已提交,可避免脏读的发生,但不可重复读,幻读有可能发生(Oracle默认)
3. REPEATABLE READ 可重复读,可避免脏读,不可重复读发生,但幻读有可能发生(MySQL默认)
4. SERIALIZABLE串行化,可避免脏读,不可重复读,换的发生,但性能会影响比较多