数据库概述 什么是数据库 是一个文件系统,方便用户对数据的操作,通过标准的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);回滚并且安静的释放资源
|