数据库的类型与SQL语句
整数类型,例如int/bigint
字符串类型,例如varchar(100)/TEXT
时间类型,例如timestamp
钱 用int 1元=100分存或者Decimal类型
数据库的表设计
每个实体一张表(用户、商品)
每个实体都有一个主键
按照业务需要建索引
每个关系用一张表联系
关系型数据库
SQl语言
DDL
create table 建表
drop table 删表
alter table 修改表
基本SQL
sql语句不区分大小写
命名风格是两个单词之间有下划线
数据库中字符串是单引号
数据库的注释是—
分号分隔多个sql语句
蛇形命名法(snake case)驼峰命名法(camel case)
峰命名法(camel case):fileName、lineNumber。
蛇形命名法(snake case):file_name、 line_number。
insert into 增
delete from 删
update 改
增加状态属性,更改状态属性以达到逻辑删除的目的,其数据还保留在数据库中
update xxx set xx=xxx where 条件
将xxx表中符合where后的条件的xx属性改为xxx
select 查
select * from USER
可以是具体的列
其他表Goods Order
条件如:Id>1、xxx is not null、xxx=’xx’
select from xxx order by xx asc/desc
根据xxx表的xx属性升序/降序排序
select from xxx order by xxa,xxb,xxc asc/desc
根据多个属性排序
select max/min/avg(xx) from xxx
查询表中xx属性最大最小的
select from xxx limit <从第几个元素开始找>,<最多返回几个元素>
分页
Select * from xxx where id in ( 子查询select xxx_id from xxx)
select count(distinct USER_ID) from “ORDER” where GOODS_ID=1
- count() 求总数
- distinct 去重关键字
select GOODS.ID as ID,NAME,sum(GOODS_NUM*GOODS_PRICE) as GMV
from GOODS
join “ORDER” on GOODS.ID = “ORDER”.GOODS_ID
group by GOODS.ID
order by GMV desc
- desc 降序 oder by xx 根据xx属性
select “ORDER”.ID as ORDER_ID,USER.NAME as USER_NAME,GOODS_PRICE*GOODS_NUM as TOTAL_PRICE from GOODS
INNER JOIN “ORDER” on GOODS.ID = “ORDER”.GOODS_ID
INNER JOIN USER on “ORDER”.USER_ID = USER.ID
- inner join 只包含都有的 on后面为连接条件
select “ORDER”.ID as ORDER_ID,USER.NAME as USER_NAME,GOODS.NAME,GOODS_PRICE*GOODS_NUM as TOTAL_PRICE from “ORDER”
left join GOODS on “ORDER”.GOODS_ID = GOODS.ID
left join USER on “ORDER”.USER_ID = USER.ID
- left join 从右表中将符合ON条件的结果查询出来,合并到左表中,再作为一个结果集输出。
- right join 将符合ON条件的左表结果搜索出来,然后右联到右表上,然后将合并后的表输出。
JDBC Java Database Connection
三个必要
连接串
用户名
密码
JDBC(连接H2数据库)
File projectDir = new File(System.getProperty("basedir", System.getProperty("user.dir")));
String jdbcUrl = "jdbc:h2:file:" + new File(projectDir, "target/test").getAbsolutePath();
sql注入
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
SQL注⼊是因为SQL没有验证传⼊的参数 导致攻击者可以通过精⼼设计的参数使得拼装出的SQL达 到他的⽬的
实例
String sql = "select * from user_table where username=
' "+userName+" ' and password=' "+password+" '";
--当输入了上面的用户名和密码,上面的SQL语句变成:
SELECT * FROM user_table WHERE username=
'’or 1 = 1 -- and password='’
"""
--分析SQL语句:
--条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;
--然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,
--这样语句永远都--能正确执行,用户轻易骗过系统,获取合法身份。
--这还是比较温柔的,如果是执行
SELECT * FROM user_table WHERE
username='' ;DROP DATABASE (DB Name) --' and password=''
--其后果可想而知…
"""
如何防范
PrepareStatement - 防SQL注⼊的