JDBC(JAVA DataBase connectivity)-java数据库连接
为什么会出现JDBC
-
SUN公司提供的一种数据库访问规则、规范,由于数据库种类较多,并且java语言使用比较广泛,sun公司就提供了一种规范,让其它的数据库提供商去实现底层的访问。java程序只要使用java提供的JDBC驱动就能访问数据库
JAVA连接数据库的基本步骤(JDBC使用基本步骤)
//1.注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //2.建立连接 //DriverManager.getConnection("jdbc:mysql://localhost/studnet?user=monty&password=greatsqldb"); java.sql.Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root"); //3.创建Statement对象,和数据库打交道需要此对象 Statement st = connection.createStatement(); //4.执行sql,得到结果 String sql="select * from t_stu"; ResultSet rs = st.executeQuery(sql); //5.查询到的数据库数据进行遍历输出 while(rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println("id="+id+"name="+name+"age="+age); } //关闭数据库操作对象 rs.close(); st.close(); conn.close();
-
JDBC通过配置文件连接数据库
//属性配置文件jdbc.properties driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost/student name=root password=root //创建一个配置属性对象 Properties properties=new Properties(); //InputStream is=new FileInputStream("jdbc.properties"); //使用类加载器获取src下的资源文件 InputStream is=MainTest.class.getClassLoader().getResourceAsStream("jdbc.properties"); //导入输入流 properties.load(is); //读取属性 String driverClass=properties.getProperty("driverClass"); String name=properties.getProperty("name"); String url=properties.getProperty("url"); String password=properties.getProperty("password"); Class.forName(driverClass); java.sql.Connection connection = DriverManager.getConnection(url, name, password);
预处理sql语句,propertiesStatement
-
MYSQL
-
MYSQL免安装版配置
下载MYSQL解压
-
在MYSQL安装目录根目录下新建my.ini文件
[mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=E:\BriskTools\mysql-5.7.24-winx64 # 设置mysql数据库的数据的存放目录 datadir=E:\BriskTools\mysql-5.7.24-winx64\data # 允许最大连接数 max_connections=200 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB
配置环境变量,cmd安装mysql服务,登录mysql
-
数据库概述
- 数据库就是一个文件系统,只不过我们需要通过命令来操作这个文件系统
- 数据库是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库
- 数据库是长期存储在计算机内、有组织的、可共享的数据集合.数据库中的数据指的是以一定的数据模型组织、描述和存储在一起、具有尽可能小的冗余度、较高的数据独立性和易扩展的特点并可在一定范围内位多个用户共享、
-
数据库的作用
- 存储数据,数据的仓库,带有访问权限限制不同人可以有不同操作
- 应用页面操作的大多是后台数据,从数据库取到后台数据进行封装,然后交给前端去展现
-
常见的数据库
-
关系型数据库(主要是用来描述实体与实体之间的关系)
- mysql:sun公司收购了mysql,sun公司被oracle收购了
- oracle
- db2
- sqlServer:windpws、政府网站多用
NOSQL类型的非关系数据库:mongodb、redis
-
-
E-R图即实体-联系图
定义:是指提供了表示实体型、属性和联系的方法,用来描述现实世界的概念模型。E-R方法:是“实体-联系方法”(Entity-Relationship Approach)的简称。它是描述现实世界概念结构模型的有效方法。
-
基本要素
- 实体型:方框
- 属性:椭圆
- 联系:菱形
-
MYSQL数据库服务器
- MYSQL数据库:数据库管理软件
- 服务器:就是一台电脑,这台电脑安装相关的服务器软件,这些软件会监听不同的端口号,根据用户访问的端口号,提供不同服务
-
MYSQL的安装和卸载
-
卸载
- 控制面板卸载mysql
- 删除mysql安装目录的所有文件
- 删除mysql数据存放文件:c:\ProgramData\MySql
-
安装
- 免安装版
- 安装版
-
-
MYSQL的SQL语句
- SQL:结构化查询语言(Structured Query Language)
- DDL:数据定义语言,定义数据库、数据表的结构:create、drop(删除)、alter(修改)
- DML:数据库操纵语言,主要用来操作数据:insert()、update、delete
- DCL:数据库控制语言,定义访问权限,取消访问权限,安全设置:grant
- DQL:数据库查询语言:select、from、where
-
数据库的CRUD的操作
数据库登录:mysql -u root -p
创建数据库:create database day06 | create database day06_1 character set utf8;
-
表操作
- 查看表的定义:show create table student.
- 查看表结构:desc student.
- 添加列:alter table student add 列名 列的类型 列的约束(alter table student add chengji int not null)
- 修改列:alter table student modify sex varchar(2);
- 修改列名:alter table student change sex gender varchar(2);
- 删除列:ater table student drop chengji;
- 修改表名:rename table student to xuesheng;
- 修改表字符集:alter table student character set gbk;
- 删除表:drop table student;
- 数据库约束:primary key(主键)、unique(唯一)、not null
-
表中数据操作
插入数据:insert into student (id,name,sex) values(1,'zhangsan','男');
批量插入:insert into student (1,'lisi','男'),(2,'zhaoliu','男')
查看数据:select * from student;
删除数据:delete from student where id=2;
更新表:update student set name='李四' where id=8;
-
查询表:select distinct price from product; (distinct 去重)
- select ,price1.5 from product;(运算查询)
- elect ,price1.5 as 折后价 from product;
- 查询可以使用where大于和小于:select * from product where price >10 and price <100;
- 查询还可以使用between关键字:select * from product where price between 100 and 10;
- 查询逻辑运算符的应用:and ,or, not
- select * from product where pname like '%饼%'
- select * from product where pname like '_熊%';
- select * from product where cno in(1,4,5);
- 查询所有按价格排序:select * from product order by price;
- select * from product order by price desc; (asc-升序,desc-降序)
- sum():求和--select sum(price) from product;
- avg():求平均值--select avg(price) from product;
- count():统计数量--select count(*) from product;
- select * from product where price >(select avg(price) from product);//条件语句后面不能跟函数所以这么写
- 查询结果分组:select cno,count(*) from product group by cno;
- 分组统计平均值,并且平均值大于60:select cno,avg(price) from product group by cno having avg(price) > 60;
- sql编写顺序(S..F..W..G..H..O):select .. from .. where .. group by .. having .. order by
- sql执行顺序:F .. W .. G .. H .. S .. O
- max():最大值
- min():最小值
truncate和delete 和drop的区别(面试题)
delete是DML,执行时从加where会删除指定行,不加where会逐行全部删除,可以回滚需要commit
truncate是DDL,会隐式提交,不能回滚,没有日志,执行很快,删除表所有数据
drop是DDL,会隐式提交,不能回滚,会删除表结构及所有数据,并释放全部空间
-
总结
-
1、在速度上,一般来说,drop> truncate > delete。(数据少delete高效,数据多truncate高效)
2、在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。
3、如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;
如果想删除表,当然用drop;
如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;
如果和事务有关,或者想触发trigger,还是用delete;
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
-
SQL多表操作
多表之间关系如何维护
-
外键约束:forerign key
- alert table product add foreign key(cno) references category(cid);
-
数据库建表建库原则
通常一个项目建一个数据库
-
建表原则
一对多:在多的一方添加一个外键指向一的一方的主键
多对多:多建一张中间表,将多对多的关系拆成一对多的关系,中间表至少要有两个外键,分别对应原来的表
-
一对一(不多用,拆表操作可能用,将个人常用信息和不常有信息拆分,减少表的臃肿)
- 将一对一情况当作是一对多,在任意一张表添加一个外键,并且这个外键要唯一,指向另一张表
- 直接将两张表合并成一张表
- 将两张表建立连接,让两张表主键相等
主键约束:默认不能为空,必须唯一,外键都是指向另外一张表的主键,一张表只有一个主键
唯一约束:必须唯一,可以为空,唯一约束不可以作为其它表的外键,一张表可以有多个唯一约束
多表查询
-
交叉连接查询,笛卡尔积
- select * from product ,category where cno=cid;
-
内链接查询:查询出两张表交集数据
- 隐式内连接(在查询出结果的基础上做where条件过滤):select * from product p,category c where p.cno=c.cid;
- 显示内连接(带着条件去查询结果,执行效率高):select * from product p INNER JOIN category c ON p.cno=c.cid;
-
左外连接:会将左表数据都查询出来,如果右表没有对应的用null代替
- select * from product p left outer join category c ON p.cno=c.cid;
-
右外连接:会将右表所有数据都查询出来,左表没有对应数据用null代替
- select * from product p right outer join category c ON p.cno=c.cid;
分页查询
- select * from product limit (页数-1)*每页条数 ,每页条数
子查询
select * from product where cno=(select cid from category where cname='手机数码');
select pname,(select cname from category c where p.cno=c.cid) as 商品分类名称 from product p;
select * from emp where sal=(select max(sal) from emp);
-
单行子查询(> < >= <= = <>)
- 查询出高于10号部门的平均工资的员工信息
-
多行子查询(in not any all)
- 查询出比10号部门任何员工薪资高的员工信息
-
多列子查询(实际使用较少)
- 和10号部门同名同工作信息的员工
-
select 接子查询
- 获取员工的名字和部门的名字
-
from后面接子查询
- 查询emp表中的经理信息
-
where接子查询
- 薪资高于10号部门平均工资的所有员工信息
-
having后面接子查询
- 有哪些部门的平均工资高于30号部门的平均工资