阶段学习知识点小结


数据库的书写要求

1.主键 :pk_...id

2.外键 :fk_...id
3.属性 :f_...
4.表名 :t_...

5.外键约束 :fk_表1_表2



表属性约束的添加内容

一. 添加NOT NULL(非空约束)
1)建表时直接添加
CREATE TABLE t_user(user_id INT(10) NOT NULL);
2)通过ALTER 语句
ALTER TABLE t_user MODIFY user_id INT(10) NOT NULL;
ALTER TABLE t_user CHANGE user_id user_id INT(10) NOT NULL;

删除非空约束
1)ALTER TABLE t_user MODIFY user_id INT(10);
2)ALTER TABLE t_user CHANGE user_id user_id INT(10);

二. 添加UNIQUE(唯一约束)
1)建表时直接添加
第一种
CREATE TABLE t_user(user_id INT(10) UNIQUE);
第二种
CREATE TABLE t_user(
user_id INT(10),
user_name VARCHAR(30),
CONSTRAINT UN_PHONE_EMAIL UNIQUE(user_id,user_name)#复合约束
);
第三种
CREATE TABLE t_user(
user_id INT(10),
UNIQUE KEY(user_id)
);

2)通过ALTER语句
1.ALTER TABLE t_user MODIFY user_id INT(10) UNIQUE;
2.ALTER TABLE t_user CHANGE user_id user_id INT(10) UNIQUE;
3.ALTER TABLE t_user ADD UNIQUE(user_id);
4.ALTER TABLE t_user ADD UNIQUE KEY(user_id);
5.ALTER TABLE t_user ADD CONSTRAINT UN_ID UNIQUE(user_id);
6.ALTER TABLE t_user ADD CONSTRAINT UN_ID UNIQUE KEY(user_id);

删除唯一性约束
        ALTER TABLE t_user DROP INDEX user_id;

注:唯一但是可以为空(空和空不相等)

三. 添加PRIMARY KEY(主键约束)
1)建表时直接添加
第一种:
CREATE TABLE t_user(user_id INT(10) PRIMARY KEY);
第二种:
CREATE TABLE t_user(
user_id INT(10),
user_name VARCHAR(30),
CONSTRAINT PK_ID_NAME PRIMARY KEY(user_id,user_name)#复合约束
);
第三种:
CREATE TABLE t_user(
user_id INT(10),
PRIMARY KEY(user_id)
);

2)通过ALTER语句
1.ALTER TABLE t_user MODIFY user_id INT(10) PRIMARY KEY;
2.ALTER TABLE t_user CHANGE user_id user_id INT(10) PRIMARY KEY;
3.ALTER TABLE t_user ADD PRIMARY KEY(user_id);
4.ALTER TABLE t_user ADD CONSTRAINT PK_ID PRIMARY KEY(user_id);


删除主键约束
1)ALTER TABLE t_user DROP PRIMARY KEY;

注:主键约束相当于(唯一约束+非空约束)
一张表中最多有一个主键约束,如果设置多个主键,就会出现如下提示:
Multiple primary key defined!!!
删除主键约束前,如果有自增长需要先删除自增长,如果不删除自增长就无法删除主键约束



如果要想在一个持久层方法中书写多个相关的sql语句同时执行的话
例:
public void deleteStudent(int studentID) {

//第一个sql语句
String sql1 = "update t_room set f_inNum = f_inNum - 1 where pk_roomid = "
+ "(select fk_roomid from t_student where pk_studentid = "+studentID+")";
//第二个sql语句
String sql2 = "delete from t_student where pk_studentid = " + studentID;
//连接
Connection con = DBUtil.getConnection();

try {
//将sql语句的提交方式改为非自动提交
//注意:如果是true则表示自动提交第一个语句,第二个语句直接无视
con.setAutoCommit(false);

//多个sql语句执行
//第一句:
Statement stat1 = con.createStatement();
stat1.executeUpdate(sql1);

//第二句:
Statement stat2 = con.createStatement();
stat2.executeUpdate(sql2);
//提交sql语句执行
con.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
con.rollback();//如果两句sql语句中只要有一个语句出错,则回滚
//表示错一个,则都不执行
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
DBUtil.closeConnection(con);
}

}



1.什么是事务?


指要做的或所做的事情。
是访问并可能更新数据库中各种数据项的一个程序执行单元。



2.在计算机中的事务指的是什么?


在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序

        事务是恢复和并发控制的基本单位


3.事务具有四大特性


原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(atomicity)。
一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。


一致性(consistency)。
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。
持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。


MySQL中IFNULL(expr1,expr2)函数:

     如果expr1不为NULL就返回expr1,否则返回expr2

        如果想把null值视为60,则这样书写IFNULL(60,0)

         或者IFNULL(1/0,60)


wherehaving的作用都是加过滤条件

wherehaving的区别:

1.where不能使用聚合函数,having可以

2.where不受分组限制,它的执行速度在分组前;having只能在分组后使用



sql注入:

利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作

 

造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码

 

防止策略

1.严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害

2.检查输入的数据是否具有所期望的数据格式,严格限制变量的类型

3.对进入数据库的特殊字符(’”\尖括号&*;等)进行转义处理,或编码转换。

 

在应用发布之前建议使用专业的SQL注入检测工具进行检测,以及时修补被发现的SQL注入漏洞。网上有很多这方面的开源工具,例如sqlmap、SQLninja等。



线程和进程的区别

1)线程是CPU调度的基本单元,而进程是资源分配和调度的一个独立单元

2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。

3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而一个线程的结束不会影响同个进程中的其他线程

4)线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的

5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源

6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的



 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;

   这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

得到反射的三种方法

1、类.class;

2、对象.getClass();

3、class.forName();

一个类里都有类名、类修饰符、包信息、父类、实现的接口、属性、方法、构造器(构造方法)、注解多部分组成。

属性有修饰符、类型、属性名、属性值四部分组成。

方法有修饰符、返回类型、方法名、参数列表、方法体、返回值

构造器:修饰符、构造器名称(类名)、参数列表、方法体

对类的包名进行反射

    Class clazz = 类.class;

    Package packag = clazz.getPackage();

    System.out.println(packag);   //得到   package + 完全限定包名

    System.out.println(packag.getName());  //得到完全限定包名

对类名进行反射

    Class clazz = 类.class;

    String className = clazz.getName();       //完全限定类名(包括包名)

    String className = clazz.getCanonicaName(); //完全限定类名(包括包名)

    String className = clazz.getSimpleName();  //获取不含包名的类名

对类修饰符进行反射

    Class clazz = 类.class;

    int modifieers = clazz.getModifiers();  //得到类的修饰符是数字型

    System.out.println(Modifier.toString(modifieers));  // Modifier.toString();

    该方法用来将数字型转换成修饰符



你可能感兴趣的:(初学者)