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 获取字节码文件的方式:
对象名.getClass();
Class c1 = user1.getClass();
类名.class;
Class c2 = User.class;
Class.forName(“字节码的全路径”);
Class c3 = Class.forName(路径);
进程:
正在执行的程序
线程:
线程是进程的控制单元,一个进程可能有多个线程。
继承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();
出现条件:
多个线程操作同一共享数据
解决方法:
给完成某一任务的代码块上锁
synchronized(类名.class){
语句体
}
整形
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:数据查询语言
TCL:事务控制语言
commit:提交事务
rollback:事务回滚
savepoint:事务节点
DCL:数据控制语言
grant:授权
revoke:收权
DQL:查询预压
DML:操作语言
DDL:定义语言
创建库:
create database 库名 ;
创建指定编码的库:
create database 库名 character set 编码名;
创建指定编码指定排序集的库:
create database 库名 character set 编码名 collate utf8_general_ci;
删除库:
drop database 库名;
查库的创建信息:
show create database 库名;
更改库的编码方式:
alert database 库名 character set 编码名;
创建表:
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 表名);
特点:没有了主键和自增
添加逐渐和自增:
not null
auto_increment
default 默认值
comment 注释内容
添加数据:
insert into 表名(字段列表) value(参数列表);
insert into 表名 set 字段1=参数1,字段2=字段2…;
修改数据:
update 表名 set 字段名1=新值,字段名2=新值 where 关系表达式
删除数据:
delete from 表名 where 条件表达式
truncate table 表名 【删除全部数据,全部重新录入】
查询数据:
select 字段名 [[as] 别名] from 表名 where 条件表达式
查看有多少库:
show databases;
使用库(表示选中):
use 表名
查看当前停留在哪个库:
select database();
\s(更全面)
查看有多少表:
show tables;
函数调用:
select 函数名(参数值1,参数值2) [其它]
count:统计某个参数的个数
select count(userName) as 名字出现次数 from person;
select count(*) as 总记录数 from person;
max
min
avg
sum
concat(str1,str2…str3):拼接字符串
NOW():获取当前的系统时间
curDATE():获取当前日期
curDTIME():获取当前时间
rand():小数随机数
select 字段名1,字段名2…from 表名 where 字段名 like 条件;(以%为通配符)
select * from table limit n(条数)
select * from table limit index,pageSize;
【index = (pageNo-1)*怕个Size】
select * from 表名 [条件] order by 排序字段 desc/asc ;
union
select * from 表2 where id in (1,2,3,)
-> 查询的结果去重:完全相同的数据只显示一次
union all
select * from 表2 where id in (1,2,3,)
-> 查询的结果全部显示:完全相同的数据显示多次;
内连接:
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 筛选条件
语法:
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 函数名;
语法:
if 条件表达式 then
SQL语句体
elseif 条件表达式 then
SQL语句体
else
SQL语句体
end if
语法:
while 条件表达式 do
SQL语句
end while;
语法:
case 标志
when 实际 then
sql
else
sql
end case
语法:
set i = i+1;
语法:
delimiter //【自定义结束符,否则SQL默认;为语句结束符,将函数内的第一条语句视为函数体】
create procedure 存储过程名(参数名1 参数类型,参数名2 参数类型…) 【没有返回值类型】
begin
declare result 返回类型 default 初始值;【声明变量和赋初始值】
SELECT money INTO ruslt FROM bankaccount WHERE id=ueserId;【变量赋值(实际例子)】
end//
delimiter ;【将结束符改回来】
调用:
call 存储过程名(实参);
删除:
drop procedure 存储过程名
default
not null
unique
primary key
foreign key
check:检查约束(MySQL不支持)
auto_increment
unsigned:无符号约束。指定当列的数值为非负数
zerofill:零填充约束
Java连接SQL server
连接MySQL:
通过第三方连接:
如果mysql数据库被关闭了,通过sqlyog是连接不上的,需要手动开启Mysql服务器:windows+r—>services.msc调出服务选项
MySQL自带
CMD
当只是测试一个方法能不能跑通:
在该实例方法方法上写“@Test”,会报错,然后鼠标放上去,选中Junit。之后选中方法名右键运行即可。
规范写法
public void 方法名(){代码块} 【没有参数,不能用static】
导入驱动包
选中工程 -》 右键 -》 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();
存放位置:new -> Source Folder -> 命名为conf或resource -> new -> file ->名字以".properties"结尾
特点:
只能以“key=value”的形式书写,一行一对
只有字符串类型
读取:
第一步:创建properties对象,用来表示properties文件
1. 将对象与实际内容关联
2. 将关联后的对象变成流
第二步:通过对象中的方法读取数据
语法
static {
}
特点:在构造方法前先执行
语法:
date_format(date,format);
此函数将date的类型转换为字符串
select date_foramt(publishTime,"%Y/%m%d %H:%i") from goods;
定义:多步操作为一个整体,不能分割
操作步骤:
开启事务: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
持久性:
数据一旦进入到数据库中,数据库需要保证数据的安全性。
备份:
第三方软件sqlyog
一般备份为sql文件,文件命名为“库名+_back”
MySQL的命令
mysqldump -u用户名 -p密码 数据库名 > D:\数据库名_back.sql【需要在cmd下执行,执行时不能连接数据库】【还原时需要手动创建库】
还原:
MYSQL命令:
source 备份文件数据库脚本【需要在cmd下执行,执行时需要先连接数据库】
查看:
show variables like “cha%”【%时通配符】
改变数据库编码:
set 变量名 = 编码名;
语法:
explain sql语句
提高性能方法:
给某一个字段建普通索引
语法:
create index 索引名 on 表名(字段名)
删除:
drop index 索引名 on 表名;
对表分区
使用缓存
特点:
采取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层主要是操作数据库:增删改查,并且只能为实例方法,不能为静态方法
核心类:
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方法: