数据库设计
数据库设计概念
- 数据库设计就是根据业务 系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。
- 建立数据库中的表结构以及表与表之间的关联关系的过程。
- 有哪些表?表里有哪些字段?表和表之间有什么关系?
数据库设计的步骤
- 需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么)
- 逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
- 物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
- 维护设计(1. 对新的需求进行建表;2. 表优化)
JDBC
概述
概念
- JDBC就是使用Java语言操作关系型数据库的一套API
- 全称:( Java DataBase Connectivity ) Java数据库连接
本质
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC) 编程,真正执行的代码是驱动jar包中的实现类
好处
- 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变
DriverManager
用来获取连接
类 | 静态方法 |
Connection | getconnection (string url, String user, string password) |
1. url: 连接路径
语法:jdbc:mysq://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2....
- 如果连接的是本机mysq|服务器,并且mysq|服务默认端口是3306,则url可以简写为:jdbc:mysq///数据库名称?参数键值对
- 以参数键值对的方式配置useSSL=false参数,禁用安全连接方式,解决警告提示
2. user: 用户名
3. password: 密码
Connection
用来获取执行SQL的对象、管理事务
获取执行SQL的对象
方法 | 说明 |
Statement createStatement() | 普通执行SQL对象 |
PreparedStatement prepareStatement(sq|) | 预编译SQL的执行SQL对象:防止SQL注入 |
CallableStatement prepareCall(sq|) | 执行存储过程的对象(不常用) |
事务管理
MySQL事务管理
BEGIN; / START TRANSACTION; | 开启事务 |
COMMIT; | 提交事务 |
ROLL BACK; | 回滚事务 |
MySQL默认自动提交事务
JDBC事务管理:Connection接口中定义了3个对应的方法
方法 | 说明 |
setAutoCommit(boolean autoCommit) | 开启事务。true为自动提交事务; false为手动提交事务,即为开启事务 |
commit() | 提交事务 |
rollback() | 回滚事务 |
Statement
用来执行SQL语句
方法 | 说明 |
int executeUpdate(sql) | 执行DML、DDL语句。返回值:(1) DML语句影响的行数(2) DDL语句执行后,执行成功也可能返回0 |
ResultSet executeQuery(sql) | 执行DQL语句。返回值:ResultSet 结果集对象 |
ResultSet
用来封装DQL查询语句的结果
boolean next()
判断当前行是否为有效行,并将光标从当前位置向前移动一行。
返回值:true为有效行,当前行有数据;false为无效行,当前行没有数据
XXX getXxx(参数)
获取数据
XXX: 数据类型;如: int getlnt(参数); String getString(参数)
参数:int为列的编号,从1开始;String为列的名称
PreparedStatement
可以用来预编译SQL语句并执行预防SQL注入问题。
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
防SQL注入
1.获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
2.设置参数值(给?赋值)
PreparedStatement对象: setXxx(参数1, 参数2)
Xxx:数据类型;如setInt (参数1,参数2)
参数:
参数1:?的位置编号,从1开始
参数2:?的值
3.执行SQL
executeUpdate(); / executeQuery(); 不需要再传递sql
预编译
PreparedStatement预编译功能开启:useServerPrepStmts = trud
配置MySQL执行日志(重启mysq|服务后生效)
PreparedStatement 原理:
1.在获取PreparedStatement对象时, 将sq|语句发送给mysq|服务器进行检查,编译(这些步骤很耗时)
2.执行时就不用再进行这些步骤了 ,速度更快
3.如果sq|模板一样,则只需要进行一次检查、编译
数据库连接池
简介
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引|起的数据库连接遗漏
好处:资源重用、提升系统响应速度、避免数据库连接遗漏。
实现
标准接口: DataSource
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
功能:获取连接
Connection getConnection()
常见的数据库连接池: .
DBCP
C3P0
Druid
Druid(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀,是Java语言最好的数据库连接池之一
1、导入jar包
2、定义配置文件
3、加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
4、获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
5、获取数据库连接
Connection connection = dataSource.getConnection();
Druid 基本配置参数介绍*
- name :数据源名称
如果存在多个数据源,监控的时候可以通过名字来区分开来
如果没有配置,将会生成一个名字,格式是"DataSource-"+System.identityHashCode(this)
- jdbcUrl :连接数据库的 url,不同数据库不一样
- username :连接数据库的用户名
- password :连接数据库的密码
- driverClassName :数据库驱动类
可配可不配,如果不配置 druid 会根据 url 自动识别 dbType,然后选择相应的 driverClassName(建议配置下)
- initialSize :初始化时建立物理连接的个数,初始化发生在显示调用 init 方法,或者第一次 getConnection 时
- maxActive :最大连接池数量
- maxIdle :已经不再使用,配置了也没效果
- minIdle :最小连接池数量
- maxWait :获取连接时最大等待时间,单位毫秒
配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降(可以通过配置 useUnfairLock=true 使用非公平锁)
- poolPreparedStatements :是否缓存 preparedStatement,即 PsCache
PSCache 对支持游标的数据库性能提升巨大,比如说 oracle,而 mysql 则建议关闭
- maxOpenPreparedStatements :要启用 PSCache,必须配置大于0
当大于 0 时,poolPreparedStatements 自动触发修改为 true
在 Druid 中,不会存在 Oracle 下 PSCache 占用内存过多的问题,可以把这个数值配置大一点,比如 100
- validationQuery :用来检测连接是否有效的 sql,要求是一个查询语句
如果 validationQuery 为null,testOnBorrow、testOnReturn 、testWhileIdle 都不会起作用
- testOnBorrow :申请连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能
- testOnReturn :归还连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能
- testWhileIdle :建议配置为 true,不影响性能,并且保证安全性
申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunMills,执行 validationQuery 检测连接是否有效
-
timeBetweenEvictionRunMillis :间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
- Destory 线程会检测连接的间隔时间
- testWhileIdle 的判断依据(详见 testWhileIdele 属性的说明)
- numTestsPerEvictionRun :废弃,一个 DruidDataSource 只支持一个 EvicationRun
- minEvictableIdleTimeMillis :一个连接在池中最小生存的时间,单位是毫秒
- connectionInitSqls :物理连接初始化的时候执行 sql
- exceptionSorter :当数据库抛出一些不可恢复的异常时,抛弃连接
- filters :通过别名的方式配置扩展插件,属性类型是字符串
常用的插件有:监控统计用的 filter(stat:监控统计,log:4:日志记录,wall:防御sql注入)
- proxyFilters :类型是 List<com.alibaba.druid,filter.Filter>,如果同时配置 filter 和 proxyFilters,是组合关系(并非)