Java学习进阶2

Java 进阶学习记录

Tip:Ctrl+Alt+U开启diagramParagraph

【Junit】
这个东西是专门用来测试程序的,通常在相关文件同级文件夹中加入一个包:test,里面的类名命名为要测试的类名加上Test关键字。
其中要定义你需要测试的方法,直接就定义成成员方法一样的格式就行,对哪一部分语句(方法)进行测试时,就要先创建一个方法专门用来测试,在这个方法前面加上注解@Test(此时需要导入Junit环境)每次运行时要求在这个@Test之前点击绿箭头单独运行这个方法,这个方法一般不需要返回值,不需要参数,在这个里面出现异常的话会报红,使用静态方法Assert.assertEquals(expected Value,True Value)可以判断这段程序运行中的某一个值是否是与预测值相等,不相等则报红;
此外,类如一些每次执行前都要执行一次的代码段,可以用额外的方法包装起来,加上@Before的注解,而最后要执行的比如内存释放这样的则要用带有@After这样的方法封装起来

当时还学了SQL,现在看来学的很浅了

【MYSQL】

在控制台启动“服务”菜单:在cmd中输入:services.msc

在搜索中找到cmd,使用管理员身份运行,输入两个命令可以直接终止或者启动mysql服务:
net stop mysql
net start mysql(名称)
登录和退出:
登录:
mysql -uroot -proot:就是在这个服务输入用户名和密码,进行登录,检测MySQL服务是否正常开启
mysql -hip(host ip) --root --p连接目标的密码
mysql --host=ip ==user=root --password=连接目标的密码

使用;结束语句
注释:
– 注释内容(注意空格)
# 注释内容

SQL分类:
1 ) DDL(Data Definition Language)数据定义语言
用来定义数据库对象: 数据库, 表, 列等。关键字: create ,drop,alter 等
2 ) DML(Data Manipulation Language)数据库操作语言
用来对数据库中表的数据进行增删改。关键字: insert , delete , update 等
3 ) DQL(Data Query Language)数据查询语言
用来询数据库中表的记录〈数据)。关键字: select , where 等
4 ) DCL(Data control Language)数据控制语( 了解)
用来定义数据库的访问权限和安全级别, 及创建用户。关键字: GRANT,REVOKE 等
【1】DDL
查看数据库的名称:show databases;
查看对应数据库的字符集:show create database mysql(名称);
创建新的数据库:create database if not exists 数据库名称;(防止这个数据库已经存在)
create database if not exists 数据库名称 character set 字符集名;
修改数据库的字符集:alter database 数据库名称 character set 字符集名称;
删除数据库:drop database 数据库名称;
drop database if exists 数据库名称;
使用数据库:select database();查询当前使用的数据库的名字;
use 数据库名字,更改当前使用的数据库

操作表(表的结构,不是内容)
1.C创建
create table 表名(
列名1 数据类型1,
列名2 数据类型2,

列名n 数据类型n
);
将一个新表创建成和原有的表一样:create table 新表名 like 旧表名;(复制)
整形:int()最大位数
小数类型:double(m,n) [前一个m指的全部的位数,n表示小数的位数]
日期:date 只包含年月日 yyyy-MM-dd
日期e:datetime 还包含了时分秒 HH:mm:ss
时间错类型:timestamp 全包含,如果不给赋值,或者赋值为null的话,自动添加当前时间
字符串:varchar(num) [num是最大的字符数]
在这些语句之后可以加上 default value,来设置这个的初始值
2.R查询
查询某个数据库中的所有表名称
show tables;
查询表结构
desc 表名;
3.U修改
修改表名
alter table 表名 rename to 新表名;
修改表的字符集
alter table 表名 character set 字符集名称;(查看表的字符集的的时候就用:show create table 表名;)
添加一列
alter table 表名 add 列名 数据类型;
修改列名称类型
alter table 表名 change 列名 新列名 新数据类型;
alter table 表名 modify 列名 新数据类型;
删除列
alter table 表名 drop 列名;
4.D删除(直接删表)
drop table 表名;
drop table if exist 表名;
create table if not exists students(
id int,
score double(4,1),
gender varchar(10),
birth date,
insertTime timestamp
);

【2】DQL(表的内容操作)(所以都不带table关键字)
1.增添数据:
insert into 表名(列名1,列名2…列名n)values(值1,值2…值n),(值1,值2…值n),…(值1,值2…值n);(可以写好多个)
值要和列名对应
可以使用简化模式:insert into 表名 values(值1,值2…值n);(这样是默认给所有的列赋值)
除了数字类型,其他类型都要用引号引起来(单双都行)
2.删除数据
删除部分数据delete form 表名 [where 条件(例如:id=1)];
如果不加条件的话默认删除所有(一般不使用)
正经方法:truncate table 表名;
3.修改数据
update 表名 set 列名1=value1,列名2=value2,…列名n=valuen where 条件;
(查询记录):
select * from 表名;
select 列名,列名… from 表名;
select distinct 列名,列名… from 表名;(这个可以实现每种不同的数据只出现一次)
(查询出来的叫做结果集)distinct只能保证是结果集完全一样的情况下才可以去重。
在列后面的话可以起别名来改变得到地结果集的表头名称,使用as关键字(可省略)
计算列:数值类型可以计算(四则运算),ifnull(列名,value)如果在这个列中碰到null,则替换为value,防止null吞噬。

条件查询:
select * from 表名 where 条件; 是基本写法
使用的运算符:and(&&), or(||), not(!), is (not)null, in(数的集合), between...and...
模糊查找:
select * from 表名 where 列名 like 模糊条件;
在想要查询的字符串内加入"%"或者"_","%"代表0到无数个字符,"_"代表一个字符。
排序查询:
order by 子句1, 子句2...;
子句就是列名(排序字段)+排序方式,默认是ASC升序,可以设置为DESC降序。
子句2,只有在子句1相等时才会使用。
聚合函数:
count()(计算数量,就是这一列的数据个数,不计算null),max(),min(),sum(),avg();
分组查询:
group by 分组的字段;
select 列名(查询字段) from 表名 where 条件1 group by 分组字段 having 条件2;
条件1是分组前判断是否参与分组的条件,条件2是判断分组完成之后是否被查询显示
where后边不能跟聚合函数,having可以跟聚合函数
查询字段是分组字段或者聚合函数(否则没有意义)
分页查询:
分页查询主要使用的是limit关键字
select * from 表名 limit 开始的索引,每页查询的条数;(where语句还是放在表名的后面)
这里的话->开始的索引,计算的公式应该是: 开始的索引=(打印的页码-1)*每页显示的条数
补充:limit语句进行分页查询,这里的limit语句是mtsql的一个方言;

(create alter drop这种表操作的关键字都是带有table的,像insert into, delete from, update…set, select…from 这样的表内容操作是不带的)

【·约束】

分类:
主键分类 primary key
非空约束 not null
唯一约束 unique
外部约束 foreign key

非空约束 not null:
关键字加在创建表时,某一个列的后面;如果是在创建表之后进行增改,需要用到modify或者change,进行重加,或者删去(简单地不带着关键字创建即可)

唯一约束 (唯一索引)unique:
不允许出现重复数据,但可以出现多个null;
删除这个的方法是使用特殊的语句:
alter table 表名 drop index 唯一索引列名;
添加的时候还是使用alter table 表名 modify 列名 新数据类型;或者change语句

主键约束 primary key:
非空且唯一,而且一个表中只能有一个这样修饰的列;
在创建表时添加关键字,或者使用modify或者change添加关键字;使用特殊语句alter table 表名 drop primary key;即可删除关键字;无需指定,因为只有一个。
自动增长:primary key auto_increment, 关键字,作用是使一个数值型的列自动的增长数据,那么这个地方传递null即可,也可以手动赋值;
删除:modify和change,添加也是如此,无需在意primary key,它不能被删掉

外键约束:foreign key
首先需要两个表,一个是父表apartment,一个子表employee,假如说父表里面有个int类型的列是id,它必须是主键约束;假如说往里面加了两个值:1,2;那么在子表中,必须有一个和父表类型相同的int的列,假设叫emp_id,而且子表的内容父表必须都有:(父表的东西大多数时候少于子表)
constraint 约束名(不显示) foreign key (设置外键的列名称(本表)) references 父表名(父表的主键列名),【其中的constraint 约束名 可以省略不写,这意味着你不会删除它了,同时对这个外键进行的操作会变得很麻烦,请尽量不要使用】
删除外键:alter table 表名 drop foreign key 外键约束名;
增添外键:alter table 表名 add constraint 约束名 foreign key (设置外键的列名) references(外表主键列名);
设置级联更新,级联删除:
alter table 表名 add constraint 约束名 foreign key (设置约束的列名) references(外表主键名) on update cascade (on delete cascade)(可选式);
设置了之后就可以在主表处更改相应的值,同时关联到子表,级联删除就是可以在主表处删除,关联删除所有子表的数据。(慎用)

范式:
一范式(1NF) : 每一列都是不可分的原子数据项
二范式(2NF) : 在1NF 的基础上, 非码属性必须完全依赖于码( 在1NF 基础上消除非主属性对主码的部分函数依赖)
三范式(3NF) : 在2NF 基础上, 任何非主属性不依赖于其它非主属性( 在2NF 基础上消除传递依赖)

多表查询:
显式内连接:select 列名 from 表名1 简称1, 表名2 简称2 where 条件;
匹配条件并显示,可以使用表明.列明的方式来替换*处数据

隐式内连接:select 列名 from 表名 inner join 表名2 on 条件;
相当于是把表二加到表一上去,满足条件的匹配,使用.替换显示
外连接
左外连接
右外连接
select 列名 from 表1 left(right) outer join 表2 on 条件;
这个主要是查询左表或者右表的所有数据,和它与另一表的交集,交集便是条件成立的部分;	
(这两个链接的条件部分没有必要设置外键,但是为了数据可靠性是要设置外键(设置了外键必须先创建父表,给父表录入数据,允许设置外键数据为null,但是不得有别的值))

子查询
1.单行单列的子查询表可以用作条件判断
2.多行单列的子查询看作是一个in(value1,value2...)条件判断
3.多行多列的子查询看作是一个新表,参与查询语句(这时候必须给子查询表拟定新名,否则会报错)	
同一个表拟定两个不同的简称也可以当两个表用。

【事务】
事务要么全部成功,要么全部失败。
开始:start transaction
提交:commit
回滚:rollback
每一条语句都设置了自动提交,相当于开启了语句又在结束时commit
如果说有一个事务没有进行commit语句,只有开始语句。而且这个语句还没有错误,那么这次进行的DML操作将不会真正生效,在你关闭mysql重新打开后会发现数据库里面的内容没有更新。
使用set @@autocommit=1或者=0来设置自动提交或是手动提交。

事务的四大特征:原子性,持久性,隔离性,一致性
事务的隔离级别:
read uncommitted
read committed
repeatable read
serializable
脏读,可重复读,幻读;安全性升高,但是效率减低
set global transaction isolation level 目标隔离级别;
mysql的默认级别是repeatable read 

【DCL】
用户的添加:
create user "用户名"@"主机名(localhost)" identified by "密码";
用户的删除:
drop user "用户名"@"主机名";
主机名为"%"时可以在任意的主机上登陆这个数据库。
在使用前请务必切换到mysql数据库,
查询请查询:user表

修改密码:设置新密码的方式:set password for "用户名"@"主机名" = password("新密码");
或者:update user set password = password("新密码") where 条件;

【授予权限】
查询权限:
show grants for "用户名"@"主机名";
授予权限:
grant 权限名 on 库名.表名 to "用户名"@"主机名";
想给全权限的话请使用通配符:权限名:ALL;库名.表名:*.*	
(这里再次提醒:往表里添加数据或者说是修改数据时:)
撤销权限:
revoke 权限名 on 库名.表名 from "用户名"@"主机名";(通配符可以使用)

【JDBC】
1.注册驱动:Class.forName(“com.mysql.jdbc.Driver”);
这一步注册驱动实际上是调用了一次Driver类,从而执行了里面的静态代码块,静态代码块里面的语句是注册语句,
java.sql.DriverManager.registerDriver(new Driver());
2.获取数据库连接对象:
Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/数据库名”,“用户名”,“密码”);
//?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
//数据库后面还得跟?useSSL=false&serverTimezone=UTC(需要更改时区)
如果是连接自己的数据库:那么jdbc:mysql:///数据库名这样写也是可以的,省略了:localhost:3306
Statement:执行sql的对象
ResultSet:结果集对象
PreparedStatement:执行sql的对象
针对经常出现的一部分代码,可以创建JBDC工具类JBDCUtils进行简化操作;
(注册驱动操作放在static语句块中)

(记录几个点:首先是配置文件,还记得原来有一个集合类叫做properties,操作流和集合的通道,制作一个配置文件,放到src下边,后缀通常改为.properities,这时候可以新建一个静态代码块(静态代码块里面只能操作静态变量)把已经声明好的那几个静态变量进行赋值,并且传入getConnection()进行DriverManager.getConnection(url,user,password)操作,后边创建closeAll()方法进行全关闭操作(重载两种形态,一个是executeQuery()带有ResultSet的 rs,另一个executeUpdate()没有这个操作))

(知识点:获取src路径下文件的方式:ClassLoader类加载器,比如你要在类:JDBCUtils中获得jdbc.properities文件的绝对路径,则:ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource(“jdbc.properties”);
String path = res.getPath();
path即可)

PreparedStatement才是主要使用的类,防止了sql注入,效率高
JDBC事务管理:
Connection类中的成员方法:.setAutoCommit(false);开启事务:在得到conn后,执行sql前
.commit();提交,放在sql执行最后;
.rollback();回滚,放在整个try…catch的catch里,这时catch捕获的异常需要是Exception类型,放在e.printStackTrace();前边

数据库连接池:
1.C3P0
2.Druid

获取数据库连接池:getConnection();,归还:close()
使用:
1.C3P0创建数据库连接池对象
DataSource ds= new ComboPooledDataSource();
Connection conn=ds.getConnection();
sout(conn);
打印出来日志信息
2.Druid创建数据库连接池对象
Properties pro=new Properties();//创建properties类型进行储存
InputStream is=DruidDemo(当前类类名).class.getClassLoader().getResourceAsStream(“druid.properties(配置文件名)”);(省去了创建InputStream的麻烦,直接由当前程序的字节码文件获取配置文件的路径,生成inputStream)
pro.load(is);(从配置文件中读取)
DataSource ds=DruidDataSourceFactory.createDataSource(pro);(创建数据库连接池,传递pro)
Connection conn=ds.getConnection();(获取连接对象)
Sout(conn);
工具类:获取Connection对象的:getConnection()方法,直接return ds.getConnection();
两个重载的closeAll();方法
getDataSource();方法:return ds;
(private static DataSource ds =NULL;在静态语句块外边,静态语句块里边ds=DruidDataSourceFactory.createDataSource(pro)来获取这个ds,ds就是数据源)

JDBCTemplate:是个简化的工具类,首先需要创建这个类的对象,然后需要一个数据库连接池,向这个的构造方法中传递datasource的对象;
这个类主要是用来简化创建数据库,使用步骤是:
首先需要一个这个类的对象:
Template template=new Template((这里传入一个DataSource对象));
(DataSource 对象主要是由C3P0或者Druid中的工具类中的方法获取的,)

其中有成员方法:update();传入SQL语句,执行增删改
queryForMap();传入SQL语句,将一个结果集包装成Map集合,返回<String,Object>型Map
queryForList();传入SQL语句,将多个结果集包装成List<Map<String,Object>>型List
query();需要一个自定义的JavaBean类,各个成员变量对应表中的各个列名,并且需要这个成员变量都是包装类,传入SQL语句和new BeanPropertyRowMapper<Bean类名>(Bean类名.class);返回List<Bean类名>的list集合
queryForObject();用于聚合函数结果的查询。返回值是某种包装类,传入SQL语句和某种包装类的字节码(.class),返回的就是这个包装类类型的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值