事务的四大特性:
原子性:
是不可分割的最小操作单位,要么同时成功,要么同时失败
持久性:
当事务提交或者回滚,数据库会持久化的保存数据
隔离性:
多个事物之间,相互独立
一致性:
事务操作前后,数据总量不变
事务的四大特性:
原子性:
是不可分割的最小操作单位,要么同时成功,要么同时失败
持久性:
当事务提交或者回滚,数据库会持久化的保存数据
隔离性:
多个事物之间,相互独立
一致性:
事务操作前后,数据总量不变
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
* 步骤:
1. 导入jar包
2. 创建JdbcTemplate对象。依赖于数据源DataSource
* JdbcTemplate template = new JdbcTemplate(ds);
3. 调用JdbcTemplate的方法来完成CRUD的操作
* update():执行DML语句。增、删、改语句
* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
* 注意:这个方法查询的结果集长度只能是1
* queryForList():查询结果将结果集封装为list集合
* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
* query():查询结果,将结果封装为JavaBean对象
* query的参数:RowMapper
* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
* new BeanPropertyRowMapper<类型>(类型.class)
* queryForObject:查询结果,将结果封装为对象
* 一般用于聚合函数的查询
定义工具类
1. 定义一个类 JDBCUtils
2. 提供静态代码块加载配置文件,初始化连接池对象
3. 提供方法
1. 获取连接方法:通过数据库连接池获取连接
2. 释放资源
3. 获取连接池的方法
1. 概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
2. 好处:
1. 节约资源
2. 用户访问高效
3. 实现:
1. 标准接口:DataSource javax.sql包下的
1. 方法:
* 获取连接:getConnection()
* 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
2. 一般我们不去实现它,有数据库厂商来实现
1. C3P0:数据库连接池技术
2. Druid:数据库连接池实现技术,由阿里巴巴提供的
4. C3P0:数据库连接池技术
* 步骤:
1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
* 不要忘记导入数据库驱动jar包
2. 定义配置文件:
* 名称: c3p0.properties 或者 c3p0-config.xml
* 路径:直接将文件放在src目录下即可。
3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
4. 获取连接: getConnection
* 代码:
//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();
druid:数据库连接池实现技术,由阿里巴巴提供
步骤:
1.倒入jar包
2.定义配置文件:是properties形式的,放在那个包下都行
3.加载配置文件
4.获取连接池对象
5.获取连接
PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理
抽取jdbc工具类:jdbcUtils
目的:简化书写
分析:注册驱动也抽取
抽取一个方法获取连接对象
需求:不想传递参数(麻烦),还要保证工具类的通用性
解决:配置文件
jdbc.properties
DDL:操作数据库和表
DML:增删改表中的数据
DQL:查询表中数据
DCL:管理用户,授权
DBA:数据管理员
步骤:
导入驱动jar包
注册驱动
获取数据库连接对象connection
定义sql
获取执行sql语句的对象ststement
执行sql,接受返回对象
处理结果
释放资源
jdbc:Java dateBase connectivity Java数据库连接,Java语言操作数据库
jdbc本质:官方定义了一套操作所有关系型数据库的规则,即接口
事务的隔离级别:
多个事务之间隔离的,相互独立。但是如果多个事务同时操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题
存在问题:
脏读:一个事务读取到另一个事务中还没有提交的数据
不可重复度:在同一个事务中,两次读取的数据不一样
幻读:一个事务操作数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
隔离级别:
读未提交:脏读,不可重复度,幻读
读已提交:不可重复度,幻读(oracle默认)
可重复读:幻读(mysql默认)
串行化:解决所有问题
隔离级别从小到大安全性越来越高,但是效率越来越低
数据库:用于存储和管理数据的仓库
数据库的特点:持久化存储数据的。其实数据库就是一个文件系统,方便存储和管理数据,使用了统一的方式操作数据库
事务:
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
操作:开启事务 start transaction
回滚:rollback
提交:commit
四大特征:
隔离级别
子查询:查询中嵌套查询,称为子查询
外连接:
左联
left join
右联
right join
区别:
内联查询: inner join ... on ... ,不以谁为主,列出满足条件的查询结果集;
左联查询:left join .... on ... , 以昨表为主,列出满足条件的结果集;
右联查询:right join ... on ... ,以右表为主,列出满足条件的结果集;
内连接查询:
隐式查询:id关联
显示内连接:inner join on
笛卡尔积
数据库设计的范式:
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
2.第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
where和having的区别
where在分组之前进行限定,having在分组之后进行限定
where后不能跟聚合函数,having能跟聚合函数
DQL:查询表中数据
DML:增删改表中的数据