要求:
-
Java建包,对数据库操作的jdbc代码的包名“cn.java.dao.impl”
-
实体类,包名“cn.java.entity"
-
工具类,包名“cn.java.utils"
配置智能模板
-
提示:
Windows -> Preferences -> java -> editor -> Content Assist -> -> 在倒数第二行的“.”后加aZ和09
-
注释模板:
Windows -> Preferences -> java-> Code Style -> Code Templates -> import -> 导入 -> Windows -> Preferences -> java -> Editor -> Save Actions -> 选中:Format all lines
-
格式模板:
Windows -> Preferences -> java-> Code Style -> Formatter -> import ->
一、 前期准备
1.1 反射
###1.1.1 获取字节码文件的方式:
-
对象名.getClass();
Class c1 = user1.getClass();
-
类名.class;
Class c2 = User.class;
-
Class.forName(“字节码的全路径”);
Class c3 = Class.forName(路径);
1.2 多线程
1.2.1 概念
-
进程:
正在执行的程序
-
线程:
线程是进程的控制单元,一个进程可能有多个线程。
1.2.2 实现线程的两种方式
-
继承Thread类:
第一步:书写普通类,继承thread类
第二步:重写thread类中的run方法,run方法中存放任务代码
第三步:启动线程:对象名.start();
-
实现Runnable接口:
第一步:书写普通类,实现runnable接口
第二步:实现runnable接口中的run方法,run方法中存放任务代码
第三步:启动线程:先创建Thread对象,对象名.start();
Test1 test1 = new Test1(); Test1 test2 = new Test2(); Thread ts1 = new Thread(test1); Thread ts2 = new Thread(test2); ts1.state(); ts2.state();
1.2.3 线程安全问题:上锁
-
出现条件:
多个线程操作同一共享数据
-
解决方法:
给完成某一任务的代码块上锁
synchronized(类名.class){
语句体
}
二、 SQL语言
数据类型
-
整形
-
int
-
int(m):m表示预期值,与储存大小和数值的范围无关
-
zerofill 零填充,会在左侧补0(不是数据类型,不能单独使用)
eg: id int(3) zerofill 当输入的id为“1”时,储存为“001”,当输入为“1000”时,zerofill不起作用
-
-
tinyint:1字节
-
smallint:2字节
-
bigint:8字节
-
mediumint:3字节
-
-
浮点型
-
float
-
double
-
-
字符型
-
char(m):固定长度的字符串类型,不只是一个字符
-
varchar(m):可变长度的字符串类型
-
text:大的字符串类型,4G字符串
-
blob:字节类型
-
-
日期
-
date:日期类型,年月日
-
time:实践类型,时分秒
-
year:年份,年
-
timestamp:年月日 时分秒, 时间戳
-
datetime:年月日 时分秒
-
编程语言
-
DDL:数据定义语言
-
create
-
drop
-
alter
-
-
DML:数据操作语言
-
insert
-
delete
-
update
-
-
DQL:数据查询语言
- select
-
TCL:事务控制语言
-
commit:提交事务
-
rollback:事务回滚
-
savepoint:事务节点
-
-
DCL:数据控制语言
-
grant:授权
-
revoke:收权
-
2.0 分类
-
DQL:查询预压
-
DML:操作语言
-
DDL:定义语言
2.1 库操作
-
创建库:
create database 库名 ;
创建指定编码的库:
create database 库名 character set 编码名;
创建指定编码指定排序集的库:
create database 库名 character set 编码名 collate utf8_general_ci;
-
删除库:
drop database 库名;
-
查库的创建信息:
show create database 库名;
-
更改库的编码方式:
alert database 库名 character set 编码名;
2.2 表操作
-
创建表:
create table 表名(
字段 数据类型, 字段 数据类型, primary key(已有字段)【注意:设置主键时,所有的主键为bigint,占20字节,写法:bigint(20)】
);
-
删除表:
drop table 表名;
-
修改表:
-
修改表名:
rename table 旧表名 to 新表名;
-
添加字段:
alter table 表名 add 字段名 数据类型;
-
删除字段:
alter table 表名 drop 字段名;
-
更改字段名:
alter table 表名 change column 旧字段名 新字段名 数据类型;
-
修改字段数据类型:
alter table 表名 modify 字段名 新数据类型;
-
-
查询表结构(包括表中的字段和字段数据类型):
desc 表名;
-
查询表结构(建表的源代码):
show create table 表名;
-
复制表:
create table 表名(select * from 表名);
特点:没有了主键和自增
添加逐渐和自增:
2.2.1 其它关键字
-
not null
-
auto_increment
-
default 默认值
-
comment 注释内容
2.3 数据操作
-
添加数据:
-
insert into 表名(字段列表) value(参数列表);
-
insert into 表名 set 字段1=参数1,字段2=字段2…;
-
-
修改数据:
update 表名 set 字段名1=新值,字段名2=新值 where 关系表达式
-
删除数据:
delete from 表名 where 条件表达式
truncate table 表名 【删除全部数据,全部重新录入】
-
查询数据:
select 字段名 [[as] 别名] from 表名 where 条件表达式
2.4 cmd操作Mysql(先配置路径)
-
查看有多少库:
show databases;
-
使用库(表示选中):
use 表名
-
查看当前停留在哪个库:
-
select database();
-
\s(更全面)
-
-
查看有多少表:
show tables;
2.5 MySQL查询:
2.5.1 聚合函数
-
函数调用:
select 函数名(参数值1,参数值2) [其它]
-
count:统计某个参数的个数
select count(userName) as 名字出现次数 from person;
select count(*) as 总记录数 from person;
-
max
-
min
-
avg
-
sum
-
2.5.2 常用函数
-
concat(str1,str2…str3):拼接字符串
-
NOW():获取当前的系统时间
-
curDATE():获取当前日期
-
curDTIME():获取当前时间
-
rand():小数随机数
2.5.3 模糊查询
select 字段名1,字段名2…from 表名 where 字段名 like 条件;(以%为通配符)
2.5.4 分页查询
-
select * from table limit n(条数)
-
select * from table limit index,pageSize;
【index = (pageNo-1)*怕个Size】
2.5.5 排序查询
select * from 表名 [条件] order by 排序字段 desc/asc ;
2.5.6 联合查询:union
- select * from 表1 where id in (1,2,3)
union
select * from 表2 where id in (1,2,3,)
-> 查询的结果去重:完全相同的数据只显示一次
- select * from 表1 where id in (1,2,3)
union all
select * from 表2 where id in (1,2,3,)
-> 查询的结果全部显示:完全相同的数据显示多次;
2.5.7 连接查询(面试题)
-
内连接:
select * from 表1 别名1 inner join 表2 别名2 on 连接条件 where 筛选条件
-
外连接
-
左连接:
select * from 表1 别名1 left join 表2 别名2 on 连接条件 where 筛选条件
-
右连接:
select * from 表1 别名1 right join 表2 别名2 on 连接条件 where 筛选条件
-
2.6 自定义函数
-
语法:
delimiter //【自定义结束符,否则SQL默认;为语句结束符,将函数内的第一条语句视为函数体】
create function 函数名(参数名1 参数类型,参数名2 参数类型…) returns 数据类型
begin
declare result 返回类型 default 初始值;【声明变量和赋初始值】 SELECT money INTO ruslt FROM bankaccount WHERE id=ueserId;【变量赋值(实际例子)】
end//
delimiter ;【将结束符改回来】
-
调用:
select 函数名(实参);
-
删除:
drop function 函数名;
2.6.1 if
-
语法:
if 条件表达式 then
SQL语句体
elseif 条件表达式 then
SQL语句体
else
SQL语句体
end if
2.6.2 while
-
语法:
while 条件表达式 do
SQL语句
end while;
2.6.3 switch
-
语法:
case 标志
when 实际 then sql else sql
end case
2.6.4 自增
-
语法:
set i = i+1;
2.7 储存过程
-
语法:
delimiter //【自定义结束符,否则SQL默认;为语句结束符,将函数内的第一条语句视为函数体】
create procedure 存储过程名(参数名1 参数类型,参数名2 参数类型…) 【没有返回值类型】
begin
declare result 返回类型 default 初始值;【声明变量和赋初始值】 SELECT money INTO ruslt FROM bankaccount WHERE id=ueserId;【变量赋值(实际例子)】
end//
delimiter ;【将结束符改回来】
-
调用:
call 存储过程名(实参);
-
删除:
drop procedure 存储过程名
2.8 触发器
2.9 约束
-
default
-
not null
-
unique
-
primary key
-
foreign key
-
check:检查约束(MySQL不支持)
-
auto_increment
-
unsigned:无符号约束。指定当列的数值为非负数
-
zerofill:零填充约束
三、 JDBC
3.1 连接数据库
-
连接MySQL:
-
通过第三方连接:
如果mysql数据库被关闭了,通过sqlyog是连接不上的,需要手动开启Mysql服务器:windows+r—>services.msc调出服务选项
-
MySQL自带
-
CMD
-
3.2 Junit单元测试
当只是测试一个方法能不能跑通:
在该实例方法方法上写“@Test”,会报错,然后鼠标放上去,选中Junit。之后选中方法名右键运行即可。
规范写法
public void 方法名(){代码块} 【没有参数,不能用static】
3.3 JDBC操作步骤
-
导入驱动包
选中工程 -》 右键 -》 New -》 Folder -》 在Folder name处填写:lib -》 把驱动包复制到lib中 -》 选中驱动包右键 -》 Build Path -》 Add to Build Path -》 在lib文件上方出现个“小奶瓶 ”
-
加载驱动
Class.forName(“com.mysql.jdbc.Driver”);
-
连接数据库
DriverManager.getConnerction(“jdbc:mysql://localhost:3306/数据库名”, 用户名, 密码)【需要导包,选Java.sql的那个】
由于Java中万物皆对象,故该连接过程也是个对象,称为“Connection对象”
-
书写SQL语句,执行SQL语句,接受反馈
String sql = “原模原样的sql语句”
//创建一个车
Statement st = conn.createStatement();
//将sql装车、开车
int result = st.exeuteUpdate(sql);
if(result >= 1){
System.out.println("数据添加成功");
}else{
System.out.println("数据添加失败");
}
ResultSet rs = st.executeQuery(sql);
ResultSet主要有两个方法:getObject()
方法中的参数名称要与数据库空表字段名称一样
如果数据库中是Date类型,使用String类型接收
-
关闭连接
st.close();
conn.close();
3.4 配置文件properties(不能放到表下)
存放位置:new -> Source Folder -> 命名为conf或resource -> new -> file ->名字以".properties"结尾
-
特点:
-
只能以“key=value”的形式书写,一行一对
-
只有字符串类型
-
-
读取:
第一步:创建properties对象,用来表示properties文件
1. 将对象与实际内容关联 2. 将关联后的对象变成流
第二步:通过对象中的方法读取数据
3.5 静态代码块(面试点)
-
语法
static { }
-
特点:在构造方法前先执行
四、 数据库
4.1.时间转换函数
-
语法:
date_format(date,format);
此函数将date的类型转换为字符串
select date_foramt(publishTime,"%Y/%m%d %H:%i") from goods;
4.2 事务(transaction):
-
定义:多步操作为一个整体,不能分割
-
操作步骤:
-
开启事务:start transaction
-
【回滚事务:rollback】(回滚只有在提交之前操作才有效)
-
提交事务:commit
-
-
特点:
-
原子性(automic):
每步操作之间不可分
-
一致性(consistent):
操作对象的最终总数不变
-
隔离性(isolation):
事务和事务之间互不干扰。
隔离性有4z种隔离级别:read uncommitted、read committed、repeatable read、serializable(4个级别越来越高,级别越高性能越差)
查看MySQL数据库的隔离级别:select @@tx_isolation; 修改MySQL数据库的隔离级别:set transaction isolation level 隔离级别【一次性】/set all transaction isolation level 隔离级别【永久性】;
-
脏读:
当数据库的隔离级别为read uncommitted的时候就会引发脏读。
解决方法:将数据库软件的隔离性给为read committed
-
不可重复读:
当数据库的隔离级别为read committed的时候就会引发不可重复读。
解决方法:将数据库软件的隔离性给为repeatable read
-
虚读(幻读):
当数据库的隔离级别为repeatable read的时候就会引发不可重复读。
解决方法:将数据库软件的隔离性给为serializable
-
-
持久性:
数据一旦进入到数据库中,数据库需要保证数据的安全性。
-
4.3 数据库备份与还原
-
备份:
-
第三方软件sqlyog
一般备份为sql文件,文件命名为“库名+_back”
-
MySQL的命令
mysqldump -u用户名 -p密码 数据库名 > D:\数据库名_back.sql【需要在cmd下执行,执行时不能连接数据库】【还原时需要手动创建库】
-
-
还原:
-
MYSQL命令:
source 备份文件数据库脚本【需要在cmd下执行,执行时需要先连接数据库】
-
4.4 MySQL数据库的编码
-
查看:
show variables like “cha%”【%时通配符】
-
改变数据库编码:
set 变量名 = 编码名;
4.5 查看sql语句的性能
-
语法:
explain sql语句
-
提高性能方法:
-
给某一个字段建普通索引
-
语法:
create index 索引名 on 表名(字段名)
-
删除:
drop index 索引名 on 表名;
-
-
对表分区
-
使用缓存
-
五、 MD5加密
-
特点:
-
采取16进制
-
无论原密码多长,加密后变成32位(中间介质16个数)
-
六、 分层
-
UI层(界面):
包名:cn.java.ui
此外还有个包存放实体:cn.java.entity
UI层通过接口调用service层
-
service接口层:
包名:cn.java.service
-
service层(业务层):
包名:cn.java.service.impl
service层通过接口调用dao层,即接口层
-
dao接口层:
包名:cn.java.dao
只放接口
-
dao层:
包名:cn.java.dao.impl;
此外还有个包存放工具:cn.java.utils
dao层主要是操作数据库:增删改查,并且只能为实例方法,不能为静态方法
七、 框架BDUtils
-
核心类:
QueryRunner
使用时先创建QueryRunner对象
-
查询,则执行query方法:
-
query(Connertion conn, String sql, ResultSetHandler rsh):
第三个参数:表示返回什么类型:1)返回一个对象:new BeanHandler(对象类名.class); 2)返回一个对象的集合:new BeanListHandler(对象类名.class);
-
query(Connertion conn, String sql, ResultSetHandler rsh,Object…params):
第四个参数为sql中的参数,sql中参数用?代替。
-
-
增,执行insert方法:
返回
-
(增)删改,执行update方法: