JDBC、SQL、Mysql三者的关系是:JDBC用于连接数据库,SQL语句用于对数据库进行增删改查等操作,肯定是需要先连接数据库,才能对其进行操作。Mysql只是数据库中的一种,还有Oracle、DB2等数据库可选择。
小编私以为,JDBC的作用原理和JVM类似,都是通过变换自身来适应不同的场景。
JDBC的应用 |
(1)JDBC连接数据库的步骤
具体步骤如下的a~f,具体实现如代码截图所示。
- a、加载数据库驱动,运用的是Class类的forName()静态方法来加载驱动。对,你没看错,这就是用的java反射。
- b、通过DriverManager获取数据库连接。
- c、通过Connection对象创建Statement对象。
- d、使用Statement执行sql语句。
- e、操作结果集
- f、回收数据库资源
对其中的关键字解释如下: - connection:建立与物理数据库的连接
- statement:是java执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的sql语句。
- ResultSet:当查询数据库的时候,将查询结果放在ResultSet类的对象——rs中。rs叫作ResultSet结果集
运行结果如下:
(2)连接池
以上是对一个对象连接数据库步骤的解读,如果多个对象频繁打开关闭连接,会极大地浪费资源。为了解决这个问题,研究出了连接池。连接池的使用策略如下。
当应用程序启动时,系统建立足够的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库连接时,无须重新打开连接,而是从连接池中取出已有的使用,使用完后不再关闭数据库连接,而是直接将连接归还给连接池。
现在介绍2种常用的连接池:
- DBCP:tomcat的连接池就是用的这个
- C3PO:Hibernate中使用这个
既然连接池这么好,那我们说说具体要怎么用。以DBCP连接池为例。
//使用DBCP来获得数据库的连接
BasicDataSource ds=new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/javaee");
ds.setUsername("root");
ds.setPassword("pass");
//设置连接池的属性
ds.setInitialSieze(5);
ds.setMaxActive(20);
ds.setMinIdle(2);
//通过数据源获取数据库连接
Connection conn=ds.getConnection();
//用完后释放
conn.close();
我们可用set方法对其属性进行设置:
• 初始连接数
• 最大连接数
• 最小连接数
• 每次增加的容量
sql语句 |
(1)DDL
DDL是操作数据库对象的语句,包括create、drop、alter。数据库里不仅仅包括数据表,还有约束,索引,视图等。常见的数据库对象如下表所示。
对象名称 | 对应关键字 | 描述 |
---|---|---|
表 | table | 存储数据的逻辑单元,包括列(字段)和行(记录) |
数据字典 | 存放数据库相关信息的表,包括数据项,数据存储等。开发人员只能查看,不能修改 | |
约束 | constraint | 执行数据校验的规则,以保证数据完整性 |
视图 | view | 一个或多个数据表里的数据的逻辑显示 |
索引 | index | 用于提高查询性能,相当于书的目录 |
函数 | function | 用于执行一个特定的计算,具有一个返回值 |
存储过程 | procedure | 用于完成一次完整的业务处理,无返回值 |
触发器 | trigger | 相当于事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理 |
- 表
表中有行和列。一列有一种数据类型,mysql支持的列类型有:
列类型 | 说明 |
---|---|
tinyint、smallint、mediumint 、int(integer) 、bigint | 1字节、2字节、3字节、4字节、8字节整数 |
float、double | 单精度、双精度浮点类型 |
decimal(dec) | 精度小数类型,相比于float、double不会产生精度丢失问题 |
date | 日期类型,不能保存时间 |
time | 时间类型,不能保存日期 |
datetime | 日期、时间类型 |
timestamp | 时间戳类型 |
year | 年类型 |
char | 定长字符串类型 |
varchar | 可变字符串类型 |
binary | 定长二进制字符串类型,以二进制形式保存字符串 |
varbinary | 可变长度二进制字符串类型 |
tinyblob、blob、mediumblob、longblob | 1/2/3/4字节的二进制大对象,可用于存储图片,音乐等,分别存储225B/64KB/16MB/4GB大小的文本 |
enum(‘value1’,value2",…) | 枚举类型,该列的值只能是括号里的值之一 |
set(‘value1’,‘value2’,…) | 集合类型,该列的值可以是括号里多个值的其中几个 |
- 约束:
约束是在表上强制执行的数据校验规则,比如如果我们在主键上添加一个非空约束,那如果添加的主键值为空的话,就会报错,从而添加不进去。更详细可参看<对数据库约束的总结博客>
- 索引:
索引用于加速对表的查询,其使用快速路径访问的方法来快速定位数据,从而减少了磁盘的IO。
//创建索引
create index emp_name_index on employee(name);
//删除索引
drop index emp_name_index on employee;
值得一提的是,索引并不是“万能药”。如果经常对一个表中的数据进行查询,则适合对相应的字段添加索引。如果对一个表中的数据经常进行增删改,则不要添加索引。因为每次改动完数据后,还需对索引进行重新整理,这也是消耗资源的。
- 视图
视图是一条被命名的sql查询语句。
//创建视图
create or replace view view_test
as
select teacher_id,teacher_name from teacher;
//删除视图
drop view view_test;
可使用with check option子句来限制不能对此视图进行修改。
(2)DML
DDL用于操作数据库对象,DML用于操作数据表里的数据。包括insert into(插入),update(修改),delete from(删除)。
//插入
insert into teacher(name)
values('小明');
//修改
update teacher
set name='小红'
where id>1;
//删除
delete from teacher
where id>1;
(3)DCL
数据控制语言,用来设置或更改数据库用户角色权限的语句。关键字有grant、revoke等。较少用到。
查询语句 |
本文只讲述了JDBC的应用和sql,还有查询语句和事务没提及,在以下博客中进行了总结:
查询语句***
事务 ***