本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、构造代码块
1、格式:使用{}声明
public class Code{
{
System.out.println("构造代码块");
}
}
2、特性
- 构造代码块在创建对象时被调用,每创建一次对象都会被调用一次;
- 在创建对象时,先执行构造代码块,然后再执行构造函数本体;
- 需要注意的是,当一个类具有多个构造函数时,每创建一个对象时,构造代码块都会执行一次,但是对于构造函数来讲,只执行某一个构造函数(看创建对象时的参数决定对应的构造函数);
- 由上面的特性可得,可以使用构造代码块来统计某个类所创建的个数;
2、静态代码块
1、格式:在{}前面加上static
public class Code{
static{
System.out.println("静态代码块");
}
}
2、特性
- 静态代码块在类加载的时候运行,==并且只运行一次==;
- 静态代码块的执行优先级:优于各种代码块和构造函数;
- 静态代码块是属于Java静态域中的问题,它的很多特性也属于静态域的特性;
==拓展:== 关于特性的第一点,在数据库连接池中可以运用到: 比如使用Druid时,需要创建连接池,如果我们将创建连接池的代码块放入类中的方法内,那么每次调用方法(此方法是用来获取数据库连接)时都会创建一次连接池,这会非常耗时,从而违背了设计连接池的初衷。我们其实只需要创建一个连接池即可。所以我们在类中应该使用静态代码块,而不是放入到类中的获取连接方法内。
public class JDBCUntils{
//创建一个Druid数据库连接池
private static DataSource source;
static{
Properties pros = new Properties();
//加载数据库的基本配置文件(此文件自己配置即可)
FileInputStream is = new FileInputStream(new File("src/dbcp.properties"));
pros.load(is);
source = DruidDataSourceFactory.createDataSource(pros);
}
//获取数据库连接
public static Connection getConnection() {
Connection conn = source.getConnection();
return conn;
}
}
1、构造代码块
1、格式:使用{}声明
public class Code{
{
System.out.println("构造代码块");
}
}
2、特性
- 构造代码块在创建对象时被调用,每创建一次对象都会被调用一次;
- 在创建对象时,先执行构造代码块,然后再执行构造函数本体;
- 需要注意的是,当一个类具有多个构造函数时,每创建一个对象时,构造代码块都会执行一次,但是对于构造函数来讲,只执行某一个构造函数(看创建对象时的参数决定对应的构造函数);
- 由上面的特性可得,可以使用构造代码块来统计某个类所创建的个数;
2、静态代码块
1、格式:在{}前面加上static
public class Code{
static{
System.out.println("静态代码块");
}
}
2、特性
- 静态代码块在类加载的时候运行,==并且只运行一次==;
- 静态代码块的执行优先级:优于各种代码块和构造函数;
- 静态代码块是属于Java静态域中的问题,它的很多特性也属于静态域的特性;
==拓展:== 关于特性的第一点,在数据库连接池中可以运用到: 比如使用Druid时,需要创建连接池,如果我们将创建连接池的代码块放入类中的方法内,那么每次调用方法(此方法是用来获取数据库连接)时都会创建一次连接池,这会非常耗时,从而违背了设计连接池的初衷。我们其实只需要创建一个连接池即可。所以我们在类中应该使用静态代码块,而不是放入到类中的获取连接方法内。
public class JDBCUntils{
//创建一个Druid数据库连接池
private static DataSource source;
static{
Properties pros = new Properties();
//加载数据库的基本配置文件(此文件自己配置即可)
FileInputStream is = new FileInputStream(new File("src/dbcp.properties"));
pros.load(is);
source = DruidDataSourceFactory.createDataSource(pros);
}
//获取数据库连接
public static Connection getConnection() {
Connection conn = source.getConnection();
return conn;
}
}
DDL语句
1、创建库
- create database test default character set utf8;
- drop database test;
2、创建表
(创建表的列,列名和类型)
- create table employees(employee_id int,employee_name varchar(30),salary float(8,2));
- drop table employees;
3、修改表
- alter table employees(表的名字) rename emp(表的名字) ; 修改表名字
- alter table emp(表的名字) change column employee_name(列的名字) emp_name varchar(30); 修改列的名字
- alter table emp(表的名字) modify emp_name(列的名字) varchar(40); 修改列的长度
- alter table emp add column commission_pct float(4,2); 增加新列
- alter table emp drop column commission_pct; 删除列
- show databases;
- show tables;
- desc 表的名字; 查看表结构
4、创建表时指定约束
- 非空约束(not null)
- 唯一性约束(unique)
- 主键约束(primary key)PK
- 外键约束(foreign key)FK
示例1: department_id主键约束并且自动增长;department_name 不允许重复不允许有空值;location_id 不允许为空:
- create table departments(department_id int primary key auto_increment,department_name varchar(30) no null unique,location_id int not null);
- show keys from departments; 查询
示例2:创建employees表,包含employee_id,设该列为主键并且自动增长;last_name列不允许含有空值;dept_id为外键参照departments表的主键:
- create table employees(employee_id int primary key auto_increment,last_name varchar(30)not null,dept_id int,constraint emp_fk foreign key(dept_id) references departments(department_id));
外键部分语句:constraint ...
5、采用修改表的方式完成约束的添加与删除
5.1、对指定列增加主键约束:
- alter table emp add primary key(employee_id);
- alter table emp modify employee_id int auto_increment; 添加自增长
5.2、删除主键约束:
- ps:若主键有自增长,需要先删除自增长,再删除主键。
- alter table emp modify employee_id int; 去除自动增长
- alter table emp drop primary key; 删除主键
5.3、非空约束:
- 添加非空约束:alter table 表名 modify 列名 类型 not null;
- 删除非空约束:alter table 表名 modify 列名 类型 null;
5.4、唯一性约束:
- 添加: alter table 表名 add constraint 约束名 unique(列名);
- 删除: alter table 表名 drop key 约束名;
5.5、外键约束:
- 添加: alter table 表名 add constraint 约束名 foreign key(列名) references 参照的表明(参照的列名);
- alter table 表名 drop foreign key 约束名; 删除外键约束
- alter table 表名 drop index 约束名; 删除外键约束时必须删除索引名(创建外键时会把外键放到索引中)