通过使用JDBC,Java程序可以非常方便的操作各种主流数据库,由于Java语言的跨平台特性,所以使用JDBC编写的程序不仅可以实现跨数据库还可以跨平台,具备非常优秀的可移植性;程序使用JDBC API以统一的方式来连接不同的数据库,然后通过Statement对象来执行标准的SQL语句,并可以获得SQL语句访问数据库的结果,因此标准的SQL语句是JDBC编程的基础
JDBC基础
JDBC即Java Database Connectivity,它是一种可以执行SQL语句的Java API,它为数据库开发提供了标准的API,使用JDBC开发的数据库应用可以跨平台执行,而且可以跨数据库(全部使用标准的SQL),为了实现Java的这种特性,Java为不同的操作系统提供了不同的虚拟机,个数据库厂商也提供了相应的数据库驱动,通过驱动转换,使得使用相同的JDBC API编写的程序,在不同的数据库系统上运行
JDBC驱动程序
数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用
JDBC驱动有4种类型:
- 第一种:JDBC-ODBC桥,这是最早实现的JDBC驱动程序,它将JDBC API映射到ODBC API,Java8已经摒弃了
- 第二种:直接将JDBC API映射成数据库特定的客户端API,这种驱动包含特定数据库的本地代码,用于访问特定数据库的客户端
- 第三种:支持三层结构的JDBC访问方式,主要用于Applet阶段,通过Applet访问数据库
- 第四种:纯Java的,直接与数据库实例交互,它知道数据库使用的底层协议,也是目前最流行的
JDBC与ODBC
- 相对于ODBC而言,JDBC更加简单,ODBC中有几个命令需要配置很多复杂选项,JDBC则采用简单、直观的方式来管理数据库连接
- JDBC比ODBC安全性更高,更容易部署
SQL语句是对所有关系型数据库都通用的命令语句,而JDBC API只是执行SQL语句的工具,JDBC允许对不同的平台、不同的数据库采用相同的编程接口来执行SQL语句
除了标准的SQL语句之外,所有的数据库都会在标准的SQL语句基础上进行扩展,增加额外的功能,而如果想让数据库应用程序可以跨数据库运行,则应该尽量减少这些属于特定数据库的扩展
关系型数据库基本概念和MySQL基本命令
在数据库的发展史上,按时间顺序曾经出现过:
- 网状型数据库
- 层次型数据库
- 关系型数据库
- 面向对象数据库
严格来说,数据库知识存放数据的地方,对数据库的操作需要数据库管理系统的帮助,它就是Database Management System,简称DBMS,通常情况下说的数据库包含这两部分
DBMS是所有数据的知识库,它负责管理数据的存储、安全、一致性、并发、恢复和访问操作,DBMS有一个数据字典(系统表),用于存储它拥有的每个事物的相关信息,这种关于数据的数据也被称为元数据(metadata)
对于关系型数据库而言,最基本的数据存储单元是数据表,数据表是由行和列组成的表格,创建表时,通常需要指定该表包含多少列,此外还应该为每个数据表指定一个特殊列用于唯一标识,称之为主键列
命令行操作数据库
启动命令行,CD到命令行工具所在路径C:\Program Files\MySQL\MySQL Server 5.7\bin
,然后执行命令mysql -uroot -p -h 主机名 --default-character-set=utf8
回车输入密码,即可进入MySQL命令行模式,也可以直接开始菜单中的MySQL x.x Command Line
然后输入root密码进入
Microsoft Windows [版本 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.
C:\Program Files\MySQL\MySQL Server 5.7\bin>mysql -uroot -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.31-log MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
show databases;
查看当前所有数据库实例
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 rows in set (0.00 sec)
create database IF NOT EXISTS 数据库名;
创建数据库
mysql> create database IF NOT EXISTS davieyang;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| davieyang |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec)
drop database 数据库名;
删除数据库
mysql> drop database davieyang;
Query OK, 0 rows affected (0.06 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 rows in set (0.00 sec)
use 数据库名;
要具体在某个数据库实例中进行更细节的操作,则需要首先进入该数据库,然后查看当前进入的实例中有哪些数据表
mysql> create database IF NOT EXISTS davieyang;
Query OK, 1 row affected (0.00 sec)
mysql> use davieyang;
Database changed
mysql> show tables;
Empty set (0.00 sec)
desc 数据表名;
查看数据表结构
mysql> use mysql;
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
31 rows in set (0.00 sec)
mysql> desc user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | NO | | mysql_native_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint(5) unsigned | YES | | NULL | |
| account_locked | enum('N','Y') | NO | | N | |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
45 rows in set (0.02 sec)
MySQL存储机制
- MyISAM:这是MySQL早期默认的存储机制,对事物支持不是很好
- InnoDB:提供事务安全的存储机制,它通过建立行级锁来保证事务完整性,并以Oracle风格的共享锁来处理Select语句,系统默认启动InnoDB存储机制,如果不想用这个机制则启动时使用
skip-innodb
选项
如果使用5.0以上版本的MySQL数据库,通常无需指定数据库表的存储机制,默认是InnoDB,如果需要在建表时显示指定存储机制,则可在标准建表语句后添加
- ENGINE=MyISAM
- ENGINE=InnoDB