A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lc1992 初级黑马   /  2018-12-10 17:25  /  535 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                                                                                      数据库知识
一 数据库基本概念
数据库分类
  关系型
   mysql
   oracle
   db2
  非关系型
   redis
mysql 6.0收费

DBMS 数据库管理系统

数据库结构
  数据库
   -->表(列)
     -->数据
     
sql分类
  DDL(数据库和表的操作)
  DML(数据的增删改)
  DQL(数据的查询)
  DCL(DBA)
  
数据类型
  VARCHAR(长度)
  CHAR(长度)
  TEXT
  DATE
  DATETIME
  TIMESTAMP 默认当前系统时间
  
  
约束
  主键 AUTO_INCREMENT
  外键
  非空
  唯一
多表的关系
  1对1
   
  1对多
   多创建外键指向一主键
  多对多
   中间表2列作为(外键/联合主键)分别指向其他2个主表的主键

     
MYSQL
安装卸载
net start mysql
net stop mysql

netstat -ano | findStr "3306"
taskkill /F /PID mysql的进程id
sqlyog工具使用
--------------------------------------------
DDL
  数据库
   CREATE DATABASE 数据库名 CHARACTER SET utf8
   DROP DATABASE 数据库名
   SHOW DATABASES
   SHOW CREATE DATABASE 数据库名
   SELECT DATABASE()
   USE 数据库名
  表
   CREATE TABLE 表名(列名 数据类型 约束,列名 数据类型 约束)
   DROP TABLE 表名
   SHOW CREATE TABLE 表名
   SHOW TABLES
   DESC 表名
   ALTER TABLE 表名 ADD 列名 数据类型 约束
   ALTER TABLE 表名 DROP 列名
   ALTER TABLE 表名 MODIFY 列名 数据类型 约束
   ALTER TABLE 表名 CHANGE 列名 新列名 数据类型 约束
   ALTER TABLE 表名 CHARACTER SET utf8
   RENAME TABLE 表名 TO 新表名
   TRUNCATE TABLE 表名
DML
  INSERT INTO 表名(列名...) VALUES(值...)
  DELETE FROM 表名 WHERE 条件
  UPDATE 表名 SET 列名 = 值 WHERE 条件
DQL
  单表
   SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 条件 ORDER BY 列名 ASC/DESC LIMIT 索引,多少条 --
  多表
   内连接
    隐式
    SELECT 列名 FROM 表名1,表名2 WHERE 关联条件 AND 条件
    显式
    SELECT 列名 FROM 表名1 JOIN 表名2 ON 关联条件 WHERE 条件
   外链接
    SELECT 列名 FROM 表名1 LEFT JOIN 表名2 ON 关联条件 WHERE 条件
    SELECT 列名 FROM 表名1 RIGHT JOIN 表名2 ON 关联条件 WHERE 条件
   子查询
    查询嵌套查询
     条件:  单行单列,多行单列
     虚拟表  多行多列
         关联条件  从表.外键=主表.主键
多表查询:
* 查询语法:
        select
                列名列表
        from
                表名列表
        where....
* 笛卡尔积:
        * 有两个集合A,B .取这两个集合的所有组成情况。
        * 要完成多表查询,需要消除无用的数据
* 多表查询的分类:
        1. 内连接查询:
                1. 隐式内连接:使用where条件消除无用数据
                2. 显式内连接:
                        * 语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件                        * 例如:                                * SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;                                        * SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;                      3. 内连接查询:                        1. 从哪些表中查询数据                        2. 条件是什么                        3. 查询哪些字段             4. 外链接查询:                      1. 左外连接:                        * 语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;                        * 查询的是左表所有数据以及其交集部分。                        * 例子:                                -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称                                SELECT         t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;                     2. 右外连接:                        * 语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;                        * 查询的是右表所有数据以及其交集部分。                        * 例子:                                SELECT         * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;        3. 子查询:                * 概念:查询中嵌套查询,称嵌套查询为子查询。                * 子查询不同情况                        1. 子查询的结果是单行单列的:                                * 子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =                                *                                 -- 查询员工工资小于平均工资的人                                SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);                        2. 子查询的结果是多行单列的:                                * 子查询可以作为条件,使用运算符in来判断                                -- 查询'财务部'和'市场部'所有的员工信息                                SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部';                                SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;                                -- 子查询                                SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');                        3. 子查询的结果是多行多列的:                                * 子查询可以作为一张虚拟表参与查询                                -- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息                                -- 子查询                                SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2                                WHERE t1.id = t2.dept_id;                                                                -- 普通内连接                                SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` >  '2011-11-11'


事务
  
  START TRANSACTION;
  COMMIT;
  ROLLBACK;

  四大特性
   原子
   持久
   一致
   隔离
  隔离级别
  read_uncommitted  脏读,不可重复读,虚读,幻读(效率高,但是非常不安全)
  read_committed(oracle) 不可重复读,虚读,幻读
  repeatable_read(mysql) 虚读,幻读
  ser...     没有问题,但是效率太低
  

jdbc
概念
  一套接口(java提供的规范) -->  要求厂商自己实现操作各自数据库的 驱动
  面向接口编程
1.注册驱动
2.获取连接
3.创建sql和执行sql的对象
4.执行sql获取结果
5.处理结果
6.释放资源

ps:
  1.ResultSet的遍历
   while(rs.next()){
    rs.getObejct(1);
    rs.getObejct("列名")
   }
  2.sql注入
   使用 PrepareStatement 配合占位符  ?
   pst.executeQuery() --> 没有参数
   pst.executeUpdate() --> 没有参数
  3.事务
   conn.setAutoCommit(false);
   conn.commit()
   conn.rollback();
  
  
连接池
C3P0
  接入步骤:
   1.导jar
    1.c3p0  2个
    2.mysql驱动
   2.导入配置文件(src目录下)
    c3p0-config.xml
   3.使用
    DataSource dataSource = new ComboPooledDataSource();
    Connection con = dataSource.getConnection();
  
DRUID(德鲁伊)
  接入步骤
    1.导jar
     1.druid
     2.mysql驱动
    2.导入配置文件(src)
     druid.properties
    3.使用
     Properties pro = new Properties();
     pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"))
     DataSource dataSource = DruidDataSourceFactory.createDataSoure(pro)
     Connection con = dataSource.getConnection();
     
     
JdbcUtils实现思路
  1.获取数据源(连接池) DataSource
  2.获取连接对象    Connection
  3.释放资源    重载

  思路:
   1,2:
    DataSource在类加载的时候就应该初始化,为了保证对象能够及时创建,在 static{} 静态代码块中创建的对象
     Properties pro = new Properties();
     pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"))
     dataSource = DruidDataSourceFactory.createDataSoure(pro)
   
    提供返回数据源的方法 getDataSource()   ---> return dataSource
    提供返回连接   getConnection()   ---> return dataSource.getConnection()
   
   3:
    在关闭之前做非空判断!!!

JdbcTemplate
SPRING (基于jdbc来简化数据库的操作)

!!!如果有占位符需要传入参数

DataSource dataSource = new ComboPooledDataSource();
JdbcTemplate template = new JdbcTemplate(dataSource);
  
增删改
  template.update("sql",[具体参数]);
  
查询
  单条结果
   Map<String,Object> map = template.queryForMap("sql",[具体参数]);
   Bean bean = template.queryForObject("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);
  多条结果
   List<Map<String,Object>> list = template.queryForList("sql",[具体参数]);
   List<Bean> list = template.query("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马