1.数据库和SQL
- DB(文件集合,类似.doc,.docx文件)
- DBMS: Database Management System(类似Office/WPS)
- 操纵和管理数据库的软件,可建立、使用和维护数据库
- DB种类
- 文本文件/二进制文件
- Xls文件
- Access(包含在office里面,收费,只能运行在Windows上。32和64位,office95/97/2000/2003/2007/2010/…)
- Mysql /Postgresql/Berkely DB (免费, 但也有收费版。多平台,32和64位区分。)
- SQL Server(收费,只能运行Windows,32位和64位,中文文档。SQL Server 2000/2005/2008/2012/…,也有免费版,但有CPU和内存限制)
- Oracle/DB2(收费,全平台,32和64位,英文文档,也有免费版,但有CPU和内存限制)
- SQLite (免费,手机上使用)
表
- 表:table, 实体
- 列:列、属性、字段
- 行:记录、元组tuple,数据
- 数据值域:数据的取值范围
- 字段类型
- int :整数 -2147483648~2147483647,4个字节
- double:小数,8个字节
- datetime :时间,7个字节
- varchar:字符串,可变字节
SQL
- 结构化查询语言(Structured Query Language),简称SQL
- 是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
- SQL标准
- SQL-86/SQL-89/SQL-92
- SQL:1999/ SQL:2003/ SQL:2008/ SQL:2011/ SQL:2016
- 基础的部分,所有标准都一样
- 标准仅仅是标准,每个厂商的数据库实现可能有一些不一致
常规语句
1 | create table t1(a int, b varchar(20)); |
2.JDBC基本操作
- java.sql/ javax.sql (接口类)
- 根据数据库版本和JDBC版本合理选择
- 一般数据库发行包都会提供jar包,同时也要注意区分32位和64位
- 连接字符串(样例)
- jdbc:oracle:thin:@127.0.0.1:1521:dbname
- jdbc:mysql://localhost:3306/mydb
- jdbc:sqlserver://localhost:1433; DatabaseName=dbname
操作步骤
- 构建连接(搭桥)
- 注册驱动,寻找材质, class.forName(“…”)
- 确定对岸目标 , 建桥 Connection
- 执行操作(派个人过桥, 提着篮子,去拿数据)
- Statement (执行者)
- ResultSet(结果集)
- 释放连接(拆桥)
- connection.close();
Statement
- Statement 执行者类
- 使用executeQuery()执行select语句,返回结果放在ResultSet
- 使用executeUpdate()执行insert/update/delete,返回修改的行数
- 一个Statement对象一次只能执行一个命令
- ResultSet 结果对象
- next() 判断是否还有下一条记录
- getInt/getString/getDouble/……
- 可以按索引位置,可以按照列名
1 | //构建Java和数据库之间的桥梁介质 |
注意事项
- ResultSet不能多个做笛卡尔积连接
- ResultSet最好不要超过百条,否则极其影响性能
- ResultSet也不是一口气加载所有的select结果数据
- Connection 很昂贵,需要及时close
- Connection所用的jar包和数据库要匹配
3.JDBC高级操作
事务
- 数据库事务,Database Transaction。
-作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行 - 事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性
- 事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理
JDBC事务
- 关闭自动提交,实现多语句同一事务:
- connection.setAutoCommit(false);
- connection.commit(); 提交事务
- connection.rollback(); 回滚事务
- 保存点机制
- connection.setSavepoint()
- connection.rollback(Savepoint)
1 | conn.setAutoCommit(false); |
PreparedStatement
- Java提供PreparedStatement,更为安全执行SQL
- 和Statement区别是使用“?” 代替字符串拼接
- 使用setXXX(int,Object)的函数来实现对于?的替换
- 注:不需要考虑字符串的两侧单引号
- 参数赋值,清晰明了,拒绝拼接错误
1 | //构建Java和数据库之间的桥梁:URL,用户名,密码 |
- 提供addBatch批量更新功能
- Select语句一样用ResultSet接收结果
- 使用PreparedStatement的好处:
- 防止注入攻击
- 防止繁琐的字符串拼接和错误
- 直接设置对象而不需要转换为字符串
- PreparedStatement使用预编译速度相对Statement快很多
1 | Connection conn = DriverManager.getConnection(url, "root", "123456"); |
ResultSetMetaData
- ResultSet可以用来承载所有的select语句返回的结果集
- ResultSetMetaData来获取ResultSet返回的属性(如,每一行的名字类型等)
- getColumnCount(),返回结果的列数
- getColumnClassName(i),返回第i列的数据的Java类名
- getColumnTypeName(i),返回第i列的数据库类型名称
- getColumnType(i),返回第i列的SQL类型
- 使用ResultSetMetaData解析ResultSet
1 | //构建Java和数据库之间的桥梁:URL,用户名,密码 |
4.数据库连接池
享元模式
- 经典23个设计模式的一种,属于结构型模式。
- 一个系统中存在大量的相同的对象,由于这类对象的大量使用,会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量
数据库连接池
- 池Pool的概念
- 初始数、最大数、增量、超时时间等参数。
- 常用的数据库连接池
- DBCP (Apache, http://commons.apache.org/,性能较差)
- C3P0 (https://www.mchange.com/projects/c3p0/)
- Druid (Alibaba, https://github.com/alibaba/druid)
C3P0连接池
- 默认配置
1 | <default-config> <!-- 默认配置 --> |
- driverClass 驱动class,这里为mysql的驱动
- jdbcUrl jdbc链接
- user password数据库用户名密码
- initialPoolSize 初始数量:一开始创建多少条链接
- maxPoolSize 最大数:最多有多少条链接
- acquireIncrement 增量:用完每次增加多少个
- maxIdleTime最大空闲时间:超出的链接会被抛弃
1 | //从c3p0获取 |