数据库基本操作
数据库介绍
数据库管理系统介绍
表和javabean的关系(会封装成javabean)
注册情况:
在controller层就把传入的数据封装成一个javabean对象
查询情况:
mysql-sql语言介绍
mysql-sql语言通用语法说明
mysql-sql中的数据类型
mysql-数据库操作
mysql-表操作
表的创建和查看
删除表
修改表结构(了解)
mysql-数据操作
插入数据
varchar用单引号:因为之后写sql语句不是在mysql中写,而是在java中写,所以不应该用双引号,应用单引号:
可能会出现双引号匹配错误的问题,第一个双引号应该和最后一个双引号匹配,可能会匹配到蔬菜前面那个双引号
正确做法:
删除数据
修改数据
mysql-约束
主键约束
添加方式3:一开始创建表的时候不指定主键,后面通过修改表结构的方式设定主键
联合主键
注意:虽然有多个列,也只有一个主键,多个列组合而成的一个主键
删除主键:通过修改表结构
自增长约束
自增长的那一列就可以不用维护了。自动编号。
删除主键自增长:
如果我删除了编号为7的数据,之后我再添加数据之后,编号就会从8开始,这个编号7的行就不会再添加数据了
delete-truncate区别
非空约束
唯一约束
单表查询
简单查询
条件查询
排序查询
查询顺序
所有的查询语句都是从from开始执行,在执行过程中,每个步骤都会生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入,最后一个步骤产生的虚拟表即为输出结果。
聚合查询
分组查询
分页查询(优化方案)
有两种参数的形式:
如果是以逗号分隔的,就是offset在前,count在后,然后就是用limit <count> offset<offset>标明
如果后面只有一个参数,就是指count,代表从1开始获取count条。
①参数count代表一页要展示多少条数据。
②参数代表我要从第几条数据开始往下查询。
offset是分页开始的起点,每次都要从1开始扫描到那个起点,性能差。
如:SELECT * FROM table LIMIT 20 OFFSET 40;
说明一页有20条数据,要查询第三页的数据,因为
- 这种方式直接从
id >= 100001开始查询,不需要跳过前面的记录,因此避免了大量无用的扫描。相当于代替了offset的作用。 id字段通常有索引,利用这个索引可以高效地定位查询的起点,从而提高分页查询的效率。- 利用子查询也是去查找到分页开始的起点,避免再使用offset从头开始扫描。
数据库备份与还原
但大多使用图形化界面点击备份
数据库三范式
第一范式:这个属性不可再拆分
第二范式:1NF基础上,非码属性必须完全依赖于候选码(1NF基础上消除非主属性对主码的部分函数依赖)
第二范式需确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键)。
第三范式:在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
多表关系
多表之间的关系说明
学生成绩表-学生信息表说明
一对多-建立外键约束
多对多-建立外键约束
中间表存的是两个主表的主键
多表查询-交叉查询
所以就要添加更多的条件
多表查询-内连接
多表查询-外连接
多表查询-全外连接
多表查询-子查询
多表查询-子查询作为伪表使用
mysql函数
数据准备
字符串函数
mysql函数-数值函数-日期函数
mysql函数-if函数
DCL语句说明-分配权限
给用户分配权限:
JDBC-介绍
JDBC-准备工作
要使用JDBC就必须导入他的jar包,想要管理哪种数据库就要下载哪个数据库的驱动,查询操作会查询出来一堆数据,这堆数据存的地方就是ResultSet
JDBC-开发步骤-详解
如果使用原生JDBC开发,步骤是固定的,都是这7步
JDBC-注册驱动
JDBC-获取连接
JDBC-插入操作
JDBC-修改操作
JDBC-查询操作
上面都一样
JDBC-抽取工具类
增删改查的时候前面的注册驱动等操作经常重复,所以把重复的部分抽取成工具类。
当遇到异常时,用try。。。catch处理
工具类:
改完之后:
或者:
JDBC-获取最新添加数据id
注意:这个只有在id是自增长(id不能手动指定)的情况下才能获取正确id值
JDBC-用户登录分析
JDBC-sql注入说明
但是!这种操作意味着你密码无论输入什么字符串都会被拼在sql语句中
这样就会发生sql注入问题。
就算你密码输入错误,只要永远为真,都能登陆成功,这样在你的sql语句捣乱的就叫sql注入
JDBC-PreparedStatement预处理对象
所以不能直接拼字符串了。
解决方法:
改造:
他会认为你输入的一坨是一个整体,里面的符号不会和外面的符号匹配
添加:
JDBC-改造工具类-读取properties配置
如果数据库的信息一旦改变,就要修改源码,所以就把数据库的信息抽取到properties中
修改:
批量添加操作
批处理后面要多加一个参数:
连接池-介绍(简化)
连接池-C3P0
下面的代码直接复制就行,这段代码就放在c3p0-config.xml文件里
这边关闭资源中的关闭连接也不是真正把连接关闭了,而是将连接归还给连接池
连接池-Druid连接池
DBUtils-准备工作(进一步简化)
导包,创建Utils工具类
DBUtils-介绍
DBUtils-空参QueryRunner使用
DBUtils-有参QueryRunner使用
这个写在DruidUtils类中:
DBUtils-查询-BeanHandler使用(封装第一行)
先创建一个JavaBean,属性要和表对应
DBUtils-查询-BeanListHandler(封装所有行)
DBUtils-查询-ScalarHandler(处理单值的:聚合函数)
DBUtils-查询-ColumnListHandler
事务-mysql中的事务操作
在还没commit之前,都是临时的数据,一旦commit,就要存储进表中了,commit之后就不能再回滚了
事务-分层事务-环境搭建
事务-转账案例-表现层实现
事务-转账案例-业务层和持久层实现
事务-转账案例-添加事务
没有添加事务,所以会出现不一致问题。
回滚事务:conn.rollback()
注意:如果要设置事务,就必须要使用同一条连接,所以以上的事务无法成功,因为在outmoney和inmoney里面也都各有一条连接,所以现在一共有三条连接。
解决方法,把outmoney和inmoney中的两条连接都删掉,只保留service层的那条连接,把service层的那条连接作为参数传入outmoney和inmoney,供他们使用:
转账案例-问题描述
ThreadLocal的介绍
一个ThreadLocal只能存储一个值,但是可以创建多个ThreadLocal对象来存储多个不同的值。
之前获取连接和事务操作都放在service中,现在重新创建一个连接管理类去进行这些操作
保证一条线程内都是同一条连接
