表设计准备工作(引入SQL注入,事务,索引,数据建模)

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 顺序方式存储

   哪种方式更快、哪种方式更好

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值