黑马程序员技术交流社区

标题: 重点--数据库 [打印本页]

作者: 娱乐逗    时间: 2018-12-10 16:20
标题: 重点--数据库
重点--数据库


数据库基本概念
    数据库分类
        关系型
            mysql  开源免费的数据库,小型的数据库,已经被 Oracle 收购了。MySQL6.x 版本也开始收费
            oracle 收费的大型数据库,
            db2  IBM 公司的数据库产品,收费的。常应用在银行系统中
        非关系型
            redis
    mysql 6.0收费
   
    DBMS 数据库管理系统
   
    数据库结构
        数据库
            -->表(列)
                    -->数据
                    
    sql分类
        DDL(数据库和表的操作)
        DML(数据的增删改)
        DQL(数据的查询)
        DCL(DBA)
        
    数据类型
        VARCHAR(长度)
        CHAR(长度)
        TEXT
        DATE
        DATETIME
        TIMESTAMP    默认当前系统时间
        
        
    约束   
        主键      PRIMARY KEY   AUTO_INCREMENT自增长
        外键  FOREIGN KEY
        非空  NOT NULL
        唯一  UNIQUE
    多表的关系
        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 数据库名    -- 查看某个数据库的字符集
            ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称  -- 修改数据库的字符集
            SELECT DATABASE()   -- 查询当前正在使用的数据库名称
            USE 数据库名  -- 使用数据库
        
            CREATE TABLE 表名(列名 数据类型 约束,列名 数据类型 约束)   -- 创建表
            CREATE TABLE 表名 LIKE 被复制的表名;  -- 复制表
            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    -- 修改表字符集
            ALTER TABLE 表名 RENAME 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 列名 distinct FROM 表名  -- 去除重复
        多表
            内连接
                隐式
                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 条件
            子查询
                查询嵌套查询
                    条件:        单行单列,多行单列
                    虚拟表        多行多列
   
    事务
        
        开启事务 :START TRANSACTION;
        提交:COMMIT;
        回滚:ROLLBACK;
   
        四大特性
            原子: 是不可分割的最小操作单位,要么同时成功,要么同时失败。
            持久:当事务提交或回滚后,数据库会持久化的保存数据。
            一致:事务操作前后,数据总量不变
            隔离:多个事务之间。相互独立。
        
        隔离级别(脏读,不可重复读,虚读,幻读)
            1. read uncommitted:读未提交
                * 产生的问题:脏读、不可重复读、幻读
            2. read committed:读已提交 (Oracle)
                * 产生的问题:不可重复读、幻读
            3. repeatable read:可重复读 (MySQL默认)
                * 产生的问题:幻读
            4. serializable:串行化
                * 可以解决所有的问题
            默认隔离级别
                MYSQL --> 3
                ORACLE --> 2
            * 注意:隔离级别从小到大安全性越来越高,但是效率越来越低
            * 数据库查询隔离级别:
                * select @@tx_isolation;
            * 数据库设置隔离级别:
                * set global transaction isolation level  级别字符串;
        
   
jdbc

    概念
        一套接口(java提供的规范)    -->        要求厂商自己实现操作各自数据库的 驱动
        面向接口编程

    0.导入驱动jar包
    1.注册驱动  Class.forName("com.mysql.jdbc.Driver");
    2.获取连接  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
    3.创建sql和执行sql的对象   String sql = "update account set balance = 500 where id = 1"; Statement stmt = conn.createStatement();
    4.执行sql获取结果   int count = stmt.executeUpdate(sql);
    5.处理结果   System.out.println(count);
    6.释放资源  close
    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:
                在关闭之前做非空判断!!!
[Java] 纯文本查看 复制代码
package cn.itheima.jdbc.domain;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
    private static DataSource ds;

    static {

        try {
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getCoonnection() throws SQLException {
        return ds.getConnection();
    }

    public static void close(Statement stat,Connection conn){
        if (stat != null){
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(ResultSet re,Statement stat, Connection conn){
        if (re != null){
            try {
                re.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stat != null){
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static DataSource getDataSource(){
        return ds;
    }
}


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),[具体参数]);








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2