.top和网站,公司邮箱满了怎么处理,阿里云怎么创建网站,北京建立网站数据库分为关系型数据库和非关系型数据库#xff0c;我们要学的MySQL数据库是关系型数据库。
Mysql的介绍这里不做赘述#xff0c;网上一大片#xff0c;这里直接步入正题#xff01;#xff01;#xff01;
一、SQL语言
SQL语言是一种结构化查询语言#xff08;Stru…数据库分为关系型数据库和非关系型数据库我们要学的MySQL数据库是关系型数据库。
Mysql的介绍这里不做赘述网上一大片这里直接步入正题
一、SQL语言
SQL语言是一种结构化查询语言Structured Query Language结构化查询语言是关系型数据库标准语言其特点是简单灵活功能强大。 SQL包含6个部分 数据查询语言DQL 其语句也称为“数据检索语句”用以从表中获得数据确定数据怎样在应用程序给出。保留字SELECT是DQL也是所有SQL用得最多的动词其他DQL常用的保留字有WHEREORDER BYGROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。数据操作语言DML 其语句包括动词INSERTUPDATE和DELETE。它们分别用于添加修改和删除表中的行。也称为动作查询语言。事务处理语言TPL 它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTIONCOMMIT和ROLLBACK。数据控制语言DCL 它的语句通过GRANT或REVOKE获得许可确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。数据定义语言DDL 其语句包括动词CREATE和DROP。在数据库中创建新表或删除表CREAT TABLE 或 DROP TABLE为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。指针控制语言CCL 它的语句像DECLARE CURSORFETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。 我们使用过程中主要使用数据查询语言DQL数据定义语言DDL和数据操作语言DML
1、数据定义语言DDL
对象数据库和表 关键字create、alter、drop、truncate删除当前表再新建一个一模一样的表结构 创建数据库create database 库名; 删除数据库drop database 库名; 切换数据库use 库名; 创建表create table 表名( 字段名 类型(大小) 关系描述); 查看数据库里存在的表show tables; 修改表alter table 表名 约束; 删除表drop table 表名 ; 查看生成表的sql语句show create table 表名 ; 查看表结构desc 表名;
例
#注意在MySQL数据库里写可以不带;,但是在DOS命令下写必须带。
create database school; #建库
drop database school; #删库
use school; #用库
create table student( #建表id int(4) primary key auto_increment,name varchar(20),socre int(3),
);
show tables;
alter table student rename studentplus; #修改表名 rename
alter table student add password varchar(20); #添加字段 add
alter table student change password pwd varchar(20);
alter table student modify pwd int;
alter table student drop pwd;
drop table student;
show create table student;
desc student;2、数据操纵语言DML
对象纪录(行) 关键词insert 、update 、delete 插入insert into 表名 values(全属性); (插入所有的字段)
insert into 表名(属性1,属性2) values (属性1,属性2); (插入指定的字段) 更新update 表名 set 属性1 ‘值’,属性2 ‘值’ where 主键(通常) 值; 删除delete from 表名 where 主键(通常) 值; 注意 truncate和delete的区别truncate是删除表再重新创建这个表。属于DDLdelete是一条一条删除表中的数据属于DML。 insert into student values(01,Tonny,90);
insert into student(name,score) values (Keby,98),(somenne,78);
update student set name Tonn,score 99 where id 01;
delete from student where id 01;3、数据查询语言DQL
select ... from student where 条件 group by 分组字段 having 条件 order by 排序字段 #最复杂不过如此执行顺序from -- where -- group by -- having -- order by
3.1、条件查询
简单条件运算符 !
逻辑运算符 || ! and or not 用于连接条件表达式
模糊查询:like、between and、in、not in、is null
3.2、排序查询
语法order by 子句 order by 排序字段1 排序方式1 排序字段2 排序方式2…排序方式 ASC升序默认的。DESC降序。注意 如果有多个排序条件则当前边的条件值一样时才会判断第二条件。
3.3、聚合函数
将一列数据作为一个整体进行纵向的计算。
count计算个数 一般选择非空的列主键 select count(id) from 表名max计算最大值min计算最小值sum计算和avg计算平均值
注意聚合函数的计算排除null值。
3.4、分组查询
语法group by 分组字段注意 分组之后查询的字段分组字段、聚合函数where 和 having 的区别 where 在分组之前进行限定如果不满足条件则不参与分组。having在分组之后进行限定如果不满足结果则不会被查询出来where 后不可以跟聚合函数having可以进行聚合函数的判断。
注意
例如
#所有字段查询
select * from student;
#带条件查询
SELECT * FROM student WHERE id 1;
SELECT * FROM student WHERE name like %on%; #模糊查询
select count(id) from student;
# 综合
SELECT *,AVG(score) FROM student WHERE id 1 GROUP BY id HAVING AVG(score)20 ORDER BY id DESC;4、高级查询
4.1、嵌套查询
嵌套查询也叫子查询是把内层的查询结果作为外层的查询条件,并且可以多层嵌套。
语法格式
select 字段名列表 from 表名 where 字段名 运算符(select 字段名 from 表名 where 条件) # select * ...就是查询全部**注意**外层的where的条件必须和内层的select查询的字段名一样个数也一样。
4.2、多表查询
语法格式
select 字段名列表 from 表一,表二 where 条件;但是这种查询很容易出现笛卡尔积为了避免我们可以将条件尽量细致化。 笛卡尔积 1.什么是笛卡尔积两个集合的乘积产生一个 新的集合。表示两个集合所有的可能的组合情况 2.笛卡尔积和关系笛卡尔积中去掉没有意义 或不存在的组合就是关系规范的二维表 笛卡尔积的匹配规则面试常考点 记录多的表的每一天记录去匹配另一张表的所有记录。两张表的记录条数相同时则后表的每一条记录去匹配前表。
4.3、连接查询
内连接 inner join外连接 1. 左连接 left join 2. 右连接 right join
语法格式
select 字段名列表 from 表1 连接方式 join 表2 on 表1.字段表2.字段;左连接left join 以左表为基准匹配右表的所有内容不够的显示NULL 右连接right join 以右表为基准去匹配左表的内容不够的显示NULL
4.4、联合查询
联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表从而实现将两个表的查询组合在一起使用为此为UNINO或UNION ALL
联合查询将多个查询的结果合并到一起纵向合并字段数不变多个查询的记录数合并.
select 语句1
union[union 选项]
select 语句2
union|[union 选项]
select 语句n
//all表示无论重复都输出
//distinct: 去重(整个重复)默认的
select *from addr
union all
select *from addr;
二、主外键
1、主外键的定义
主关键字(primary key ): 简称主键它是表中的一个字段它的值用于唯一地标识表中的某一条记录。
外关键字(foreign key) : 简称外键是用于建立或加强两个表数据之间的链接的一列。
如果公共关键字在一个关系中是主关键字那么这个公共关键字被称为另一个关系的外键。由此可见外键表示了两个关系之间的相关联系。 以另一个关系的外键作主关键字的表被称为主表(父表具有此外键的表被称为主表的从表子表。 外键又称作外关键字。
2、主外键的区别
主键 定义唯一标识一条记录不能有重复的不允许为空。 作用用来保证数据完整性 个数只有一个
外键 定义表的外键是另一个表的主键外键可以有重复的可以是空值。 作用用来和其他表建立联系。 个数一个表可以有许多外键。
3、创建主外键
3.1、创建主键
# 创建学生表加主键方法一
create table student(sid char(4) primary key,# 设置主键sname char(20),sage int,ssex char(2)
);# 创建课程表加主键方法二
create table course(cid char(4),cname char(8),primary key(cid)
);3.2、创建外键
# 创建成绩表设置外键
create table score(sid char(4),cid char(4),score int(3),foreign key(sid)references student(sid),foreign key(cid)references course(cid),
)4、增删主外键
4.1、增删主键
alter table 表名 drop primary key;# 删除主键
alter table 表名 add primary key (列名);# 现有列上添加主键4.2、增删外键
alter table 子表名 add [constraint fk_son]foreign key(子表的外键名称)references 父表名(父表的主键名称); #添加外键约束。fk_sno为外键ID名若不添加系统会自动配一个。
alter table 子表名 drop foreign key fk_sno; #删除外键约束。fk_sno为外键ID名, 若不知可查询建表明细 注外键一般不在正常工作中使用一般使用的都是虚拟外键即有外键功能不真正设置表外键。 三、JDBC
前言
在JDK1.0刚开始发布时并没有跟着发布一个连接数据库的API那么那时的开发人员如果想要连接到数据库的话该怎么做呢那时的通常做法是使用另一个数据库驱动管理器——ODBC。
ODBCOpen Database Connectivity 开放数据库互连提供了一种标准的API应用程序编程接口方法来访问数据库管理系统DBMS。
这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持用户可以直接将SQL语句送给ODBC。
ODBC的设计者们努力使它具有最大的独立性和开放性与具体的编程语言无关与具体的数据库系统无关与具体的操作系统无关。
虽然使用ODBC的确是让Java开发人员也可以在应用中连接上数据库了但由于ODBC毕竟并非是为Java而准备的ODBC自身是使用C语言开发标准接口也是对于C语言而言。因此那时的Java开发人员如果需要使用ODBC则不得不在Java程序中添加C语言的ODBC函数调用使得许多Java自身的特性无法充分发挥比如平台无关性、面向对象特性等。
因此在众多开发人员的强烈需求下JDBC 1.0 随JDK1.1发布了。
众所周知JDBC技术的实施需要六个步骤我们一个个分析
1、注册驱动
首先我们需要使用配置文件配置数据库连接信息用properties文件
jdbc.urljdbc:mysql://localhost:3309/pbip?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue
jdbc.drivercom.mysql.cj.jdbc.Driver
jdbc.usernameroot
jdbc.passwordroot在连接数据库之前首先要加载想要连接的数据库的驱动到JVMJava虚拟机 这通过java.lang.Class类的静态方法forName(String className)实现。 代码如下: /*** 注册驱动*/private void driver(){try {Class.forName(properties.getProperty(jdbc.driver));}catch (ClassNotFoundException e){e.printStackTrace();}}2、建立连接
•要连接数据库需要向java.sql.DriverManager请求并获得Connection对象该对象就代表一个数据库的连接。 •使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。 代码如下: /*** 建立连接*/private Connection conn;public void conn(){try {conn DriverManager.getConnection(properties.getProperty(jdbc.url),properties.getProperty(jdbc.username),properties.getProperty(jdbc.password));}catch (SQLException e){e.printStackTrace();}}3、创建PreparedStatement对象
4、执行sql
•要执行SQL语句必须获得java.sql.Statement实例Statement实例分为以下3种类型 1、执行静态SQL语句。通常通过Statement实例实现。 2、执行动态SQL语句。通常通过PreparedStatement实例实现。 3、执行数据库存储过程。通常通过CallableStatement实例实现。
具体的实现方式 private PreparedStatement ps;/*** pst对象* param sql* param values*/public void getPst(String sql,Object...values){ //不定参数---数组try {ps conn.prepareStatement(sql);for (int i 0;ivalues.length;i){ps.setObject(i1,values[i]);}}catch (SQLException e){e.printStackTrace();}}
5、处理结果ResultSet
两种情况 1、执行更新返回的是本次操作影响到的记录数。 2、执行查询返回的结果是一个ResultSet对象。 • ResultSet包含符合SQL语句中条件的所有行并且它通过一套get方法提供了对这些 行中数据的访问。 • 使用结果集ResultSet对象的访问方法获取数据 //增删改public void executeUpdate(){try {ps.executeUpdate();} catch (SQLException throwables) {throwables.printStackTrace();}}//查public ResultSet executeQuery(){try {rs ps.executeQuery();} catch (SQLException throwables) {throwables.printStackTrace();}return rs;}6、关闭连接 /*** 关闭连接*/public void close(){try {if(rs!null){rs.close();}if(ps!null){ps.close();}if(conn!null){conn.close();}} catch (SQLException throwables) {throwables.printStackTrace();}}测试代码
public class JdbcTest {JdbcUtil jdbcUtil JdbcUtil.getInstance();Testpublic void jdbcTest() throws Exception{jdbcUtil.conn();String sql SELECT * FROM category_tab;jdbcUtil.getPst(sql);ResultSet rs jdbcUtil.executeQuery();while (rs.next()){System.out.println(rs.getInt(1)-rs.getString(2)rs.getString(3));}}
}这是JDBC最为简单的交互数据库的方式我们一般项目中还需要用到其他配置一般不再手写sql而是放在mapper中后续学习mybatis中的时候就会知道。
四、datasourse——Druid
DRUID是阿里巴巴开源平台上一个数据库连接池实现它结合了C3P0、DBCP、PROXOOL等DB池的优点同时加入了日志监控可以很好的监控DB池连接和SQL的执行情况可以说是针对监控而生的DB连接池(据说是目前最好的连接池。
1、配置参数
和其它连接池一样DRUID的DataSource类为com.alibaba.druid.pool.DruidDataSource基本配置参数如下主要介绍几个非常常用的
配置缺省值说明name配置这个属性的意义在于如果存在多个数据源监控的时候可以通过名字来区分开来。 如果没有配置将会生成一个名字格式是“DataSource-” System.identityHashCode(this)jdbcUrl连接数据库的url不同数据库不一样。例如 mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:10.20.149.85:1521:ocnautousername连接数据库的用户名password连接数据库的密码。driverClassName根据url自动识别这一项可配可不配如果不配置druid会根据url自动识别dbType然后选择相应的driverClassName(建议配置下)initialSize0初始化时建立物理连接的个数。初始化发生在显示调用init方法或者第一次getConnection时maxActive8最大连接池数量………
2、使用方法
2.1、属性文件配置
druid.urljdbc:mysql://localhost:3306/blog?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue
druid.usernameroot
druid.passwordroot
druid.driverClassNamecom.mysql.cj.jdbc.Driver2.2、xml文件配置
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;/*** 使用druid作为数据源*/
public class MyDateSource extends UnpooledDataSourceFactory {public MyDateSource(){this.dataSource new DruidDataSource();}
}configuration!-- properties文件--properties resourceconfig/druid.properties/!--实体类地址--typeAliasespackage namecom.dyit.mybatis.domain.entity//typeAliases!--数据库配置--environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC /dataSource typecom.dyit.mybatis.druid.util.MyDateSourceproperty namedriverClassName value${druid.driverClassName} /property nameurl value${druid.url} /property nameusername value${druid.username} /property namepassword value${druid.password} //dataSource/environment/environmentsmappersmapper resourcemapper/Car.mapper.xml //mappers
/configuration2.3、书写实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.type.Alias;Data
AllArgsConstructor
NoArgsConstructor
Alias(Car)
public class Car {private Integer id;private String color;private Double price;
}package com.dyit.mybatis.druid.mapper;import com.dyit.mybatis.domain.entity.Car;import java.util.List;public interface ICarMapper {void save(Car car);void delete(int id);void update(Car car);ListCar findAll();
}mapper namespacecom.dyit.mybatis.druid.mapper.ICarMapper !--表和类的映射关系--resultMap idCarMapper typeCarid propertyid columncar_id/ !--主键--result propertycolor columncar_color/result propertyprice columncar_price//resultMapinsert idsaveinsert INTO car_tab(car_color,car_price) values (#{color},#{price})/insertdelete iddeletedelete from car_tab where car_id #{id}/deleteupdate idupdateupdate car_tab set car_color #{color} where car_id #{id}/updateselect idfindAll resultMapCarMapperselect * from car_tab/select
/mapper2.4、测试代码
Testpublic void testSelect()throws Exception{Reader reader Resources.getResourceAsReader(mybatisConfiguration.xml);SqlSessionFactory sessionFactory new SqlSessionFactoryBuilder().build(reader);SqlSession sqlSession sessionFactory.openSession();ICarMapper mapper sqlSession.getMapper(ICarMapper.class);ListCar all mapper.findAll();sqlSession.commit();sqlSession.close();}这是最简易和原始的方法我们可以封装SqlSession一系列操作使用更加方便
public class MybatisUtil {private static MybatisUtil instance;private SqlSessionFactory SessionFactory;private MybatisUtil(String fileName){init(fileName);}public void init(String fileName){try{SessionFactory new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(fileName));}catch (Exception e){LogUtil.INSTANCE.debug(MybatisUtil.class,e);}}public static MybatisUtil getInstance(String fileName){if (instance null){instance new MybatisUtil(fileName);}return instance;}public SqlSession OpenSession(){SqlSession sqlSession SessionFactory.openSession();return sqlSession;}public void sessionClose(SqlSession sqlSession){sqlSession.commit();sqlSession.close();}
}Test//插入一辆车public void testSave2() {SqlSession sqlSession m.OpenSession();ICarMapper mapper sqlSession.getMapper(ICarMapper.class);mapper.save2(银白色,4000000.00,阿斯顿马丁);m.sessionClose(sqlSession);}以上就是他们的全部使用方法当然不是唯一的。 为什么用datasourse而不用JDBC直连 DriverManager 在java类中创建/关闭连接时会妨碍应用程序性能而且创建连接到关闭连接的步骤重复发生浪费资源。不支持连接池。 数据源 由于不在类中创建/关闭连接因此它们可以提高应用程序性能它们由应用程序服务器管理并且可以在运行时获取。它提供了一个创建连接池的工具。有助于企业应用程序