黑马程序员技术交流社区
标题: 数据库概述 [打印本页]
作者: 金城武 时间: 2018-5-1 23:49
标题: 数据库概述
数据库概述
什么是数据库
是一个文件系统,方便用户对数据的操作,通过标准的sql语句进行访问
什么是关系型数据库
里面存的是实体与实体之间的关系
mysql数据库的存储方式(以表为单位进行存储,给他一个javabean对象就可以存起来)
类------表
属性----表中的字段
对象----记录
使用sql
sql对数据库进行crud的操作
增:createdatabase 数据库名称
删:dropdatabase 数据库名称
改:alterdatabase 数据库名称 character set 字符集 collate 校对规则;
sql对数据库中的表进行crud的操作
增:createtable 表名称 (字段名称字段类型(长度) 约束,...)
删:drop table 表名称;
改:alter table表名称 add 列名类型(长度) 约束;
sql对数据库中的表的记录进行crud的操作
增:insert into表名 values (值1,值2,值3,...)
删:delete from表名 where id = 2;
改:update userset password = "aaa" where username = "zhangsan"
查:
基本查询
select* from user;
条件查询
select* from user where username = "张三"
排序查询
使用 orderby asc / desc
聚合函数
sumcount(*) max min avg limit
分组查询
groupby
总结
书写顺序select--from---where--group by--having--order by
执行顺序from--where--group by--having--select--order by
常见错误
语法错误(syntax错误)
没有注意约束
聚合函数写在where后面(如果筛选条件里面没有聚合函数,就可以写在where后面,如果有必须写在having)
数据库的远程访问
1,打开系统的mysql数据库下面的user表,修改里面的Host字段的值为%(%表示允许任何ip地址)并保存
2,重启mysql服务
单表:
IS NULL 表示是否为空
DISTINCT distinct 去重
排序查询使用order by 字段名称 asc/desc
聚合函数 sum count max min avg 不能在where后面使用
分组查询使用group by 字段名称;
一般顺序: S(select)… F(from)…W(where)…G(group by)…H(having)…O(order by);
多表:
交叉连接:
select* from classes ,student
内连接:
select*from classes c inter join student son c.cid = s.cno
外连接
左外连接select*from classes c left outer join student s on c.cid = s.cno
右外连接select*from classes c right outer join student s on c.cid = s.cno
多表查询之子查询: in exists all any
子查询使用场景: 后面条件进行查询的时候需要依赖前面的查询结果
思路:
1,先写要查询的东西(学生姓名,选课总数)
2,再写要从哪些表中查
3,再写上关联的条件
4,然后将结果分组
5,最后再用having显示聚合函数
当select后面有表本身的字段,和聚合函数(sum)的字段,就要用group by.
jdbc
是什么
API接口
面向接口编程:通过jdbc里面的接口,从驱动中取出实现类,调用实现类的重写方法,来操作数据库
步骤:
1,加载驱动
2,获得连接
3,执行sql
获得执行sql语句的对象
Statementstmt = conn.createStatement();
编写sql语句
Stringsql = "delete from user where id = 4"
执行sql,需要传入sql语句
intnum = stmt.executeUpdate(sql);
遍历结果集
4,释放资源
接口:
DriverManager
1,注册驱动
2,获取连接
Connection
1,创建执行sql语句的对象
2,管理实务
Statement
1,执行sql
2,执行批处理
ResultSet
结果集的遍历
结果集的获取
jdbc的CRUD的操作
jdbc的抽取
工具类的抽取
配置信息提取到配置文件key=value
SQL注入漏掉
登录的案例
注入漏掉的分析解决(sql中 and 优先级大于 or)
用prepareStatement进行改写
执行sql语句有所不同
1,写sql语句,参数用?占位
Stringsql = "delete from user where id = ?";
2,预编译sql,需要传入写好sql语句
POPUPrepareStatement pstmt =conn.prepareStatement(sql);
3,设置参数,同时设置了参数的格式
pstmt.setInt(1,4);
4,执行sql,不需要传入sql语句
int num = pstmt.executeUpdate();
jdbc批处理
创建批处理的对象
用statement实现
Statementstmt = conn.createStatement();
用prepareStatement实现
PrepareStatementpstmt = conn.prepareStatement(sql);
//他的语句格式是一样的,参数不同
//用在批量的插入和删除
添加批处理
addBatch()
执行批处理
executeBatch()
请空批处理
clearBatch()
jdbc的事务管理
事务的概念
逻辑上的一组操作,组成这个操作的各个逻辑单元,要么全部成功,要么全部失败.
开启事务
conn.setAutoCommit(false)
提交事务
conn.commit();
回滚事务
conn.rollback();
连接池
就是一个池子,初始化的时候会放一些连接进去,用的时候从中间去拿,不用的时候归还过去
Druid连接池
C3p0连接池
区别:单纯使用连接池的话,用c3p0更快捷,但是Druid功能更多一些,能监控sql语句的执行状态,并且起到拦截作用.
改写工具类
因为连接池的创建和销毁是很耗资源,只需要创建一次就可以
步骤:
1,创建连接池,用静态进行修饰
2,重写获得连接的方法
3,提供一个获得连接池的方法
DBUtils:提供了封装数据库的一些操作
QueryRunner核心运行类:提供了对sql语句操作的方法
没有事务处理
构造
QueryRunner(连接池)
普通方法
qr.update(sql语句,参数)
qr.query(sql语句,结果集,参数)
有事务处理
构造
QueryRunner()
普通方法
qr.update(连接,sql语句,参数)
qr.query(连接,sql语句,结果集,参数)//保证多个操作来自同一个连接
ResultSetHandler接口:用于定义进行查询操作之后,怎样封装结果集
实现类
ArrayHandler和ArrayListHandler
BeanHandler和BeanListHandler
MapHandler和MapListHandler
ColumnListHandler//将一列值封装
ScalarHandler// 将单个值封装
KeyedHandler//将一条记录封装到map集合中,将多条记录封装到map集合中的map集合,而且外面的key的值是可以指定的
DBUtils:定义了关闭资源和事务处理的方法
DBUtils.commitAndCloseQuietly(conn);提交并且安静的释放资源
DBUtils.rollbackAndCloseQuietly(conn);回滚并且安静的释放资源
作者: Port 时间: 2018-5-2 07:42
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |