美文网首页
2018-05-29数据库基础

2018-05-29数据库基础

作者: ROC_XU的日记本 | 来源:发表于2018-05-29 19:35 被阅读0次

    Mysql


    sql分类:

    DDL:

    对象:数据库和表

    关键词:create 、alter 、drop 、truncate

    创建数据库:create database xp;

    删除数据库: drop database xp;

    创建表:create table user(

    id int primark key  auto_increment,

    username varchar(20)

    );

    修改表:

    alter table user rename to user1;

    alter table user add password varchar(20);

    alter table user change password pwd varchar(20);

    alter table user modify pwd int;

    alter table user drop pwd;

    删除表:

    drop table user;

    常用的命令:

    use day06;

    show tables;

    desc user;

    show create table user;

    DML(数据操作语言):

    对象:记录()

    关键词:insert update delete

    插入:

    insert into user values(字段值1,字段值2,...);-- 所有的字段

    insert into user(字段1,字段2....) values(字段值1,字段值2);-- 插入指定的字段

    更新:

    update user set 字段=字段值1,字段2=字段值2 where 条件;

    删除:

    delete from user where 条件;

    扩展:

    以后开发中很少使用delete,数据无价,删除有物理和逻辑(常用),

    逻辑删除一般会在表中添加一个字段(isdel:若值为1,代表删除了;若为0代表没有删除),

    此时的删除操作变成了更新操作.

    DQL:

    select ... from 表名 where 条件 group by 分组字段 having 条件 order by 排序字段;

    执行顺序:

    1.确定数据来自那张表  from

    2.是否需要筛选  where

    3.是否需要分组 group by

    4.分组后是否需要筛选 having

    5.是否需要排序 order by

    6.确定显示那些数据. select

    DCL:用户 权限 事务☆

    auto_increment 自增

    truncate 干掉表,重新创建 和delete的区别

    数据类型:

    int 和 varchar(size):可变长度

    date time  datetime timestamp


    多表的操作:

    表与表之间的关系:

    一对多:

    在多表的一方添加一个外键,外键的名称一般是主表名称_id,外键的类型和主表的主键的类型保持一致

    为了保证数据的有效性和完整性,

    需要在多表上添加外键约束

    格式:

    alter table 多表 add [constraint [外键的名称]] foreign key(外键名称) references 主表名称(主键);

    多对多:

    添加一张中间表,存放两张表的主键,就可以将多对多拆分成两个一对多了

    为了保证数据的有效性和完整性,

    需要在中间表添加两个外键约束

    一对一:(了解)

    1.两个实体合二为一(字段比较少)

    2.将一张表的主键添加外键约束即可

    多表的查询:

    内连接:

    显式:

    select a.*,b.* from a join b on 条件;

    隐式:

    select a.*,b.* from a,b where 条件;

    外连接:

    左外连接:

    select a.*,b.* from a left join b on 条件;

    以a为主,展示所有数据,根据条件关联查询b表,满足条件则展示,不满足的话以null显示

    子查询:

    一个查询依赖于另一个查询.

    案例1-通过jdbc完成单表的curd操作:

    需求:

    对分类表完成操作.

    技术分析:

    jdbc


    jdbc:

    java操作数据库.jdbc是oracle公司指定的一套规范(一套接口)

    驱动:jdbc的实现类.由数据库厂商提供.

    我们就可以通过一套规范操作不同的数据库了(多态)

    jdbc作用:

    连接数据库

    发送sql语句

    处理结果

    jdbc操作步骤:★

    1.数据库和表

    2.创建一个项目

    3.导入驱动jar包

    4.编码:

    注册驱动

    获取连接

    编写sql

    创建预编译的语句执行者

    设置参数

    执行sql

    处理结果

    释放资源

    初始化数据库和表:

    CREATE DATABASE xp;

    USE xp;

    create table category(

    cid varchar(20) primary key,

    cname varchar(20)

    );

    insert into category values('c001','电器');

    insert into category values('c002','服饰');

    insert into category values('c003','化妆品');

    insert into category values('c004','书籍');

    IDE打开之后

    1.修改字符集 utf-8

    2.新建 java项目

    3.使用的jdk为自己的jdk 不用使用内置

    使用junit单元测试

    要求:

    1.方法是public void xxx(){}

    2.在方法上添加 @Test

    3.在@Test 按下 ctrl+1(快速锁定错误)

    4.在方法上右键 run as  -->junit 就可以执行方法了.

    jdbc-api详解:

    所有的包 都是 java.sql 或者 javax.sql

    DriverManager:管理了一组jdbc的操作 类

    常用方法:

    了解:注册驱动

    static void registerDriver(Driver driver) :

    通过查看 com.mysql.jdbc.Driver的源码 有如下代码

    static {

    try {

    java.sql.DriverManager.registerDriver(new Driver());//这段代码我们已经写过

    } catch (SQLException E) {

    throw new RuntimeException("Can't register driver!");

    }

    }

    驱动注册了两次.我们只需要将静态代码块执行一次,类被加载到内存中会执行静态代码块,并且只执行一次.

    现在只需要将类加载到内存中即可:

    方式1:

    ★Class.forName("全限定名");//包名+类名  com.mysql.jdbc.Driver

    方式2:

    类名.class;

    方式3:

    对象.getClass();

    掌握:获取连接

    static Connection getConnection(String url, String user, String password)

    参数1:告诉我们连接什么类型的数据库及连接那个数据库

    协议:数据库类型:子协议 参数

    mysql: jdbc:mysql://localhost:3306/数据库名称

    oracle: jdbc:oracle:thin@localhost:1521@实例

    参数2:账户名 root

    参数3:密码

    (了解)Driver:java.sql 接口 驱动

    Connection:连接 接口

    常用方法:

    获取语句执行者:

    (了解)Statement createStatement() :获取普通的语句执行者  会出现sql注入问题

    ★PreparedStatement prepareStatement(String sql) :获取预编译语句执行者

    (了解)CallableStatement prepareCall(String sql):获取调用存储过程的语句执行者

    了解:

    setAutoCommit(false) :手动开启事务

    commit():提交事务

    rollback():事务回滚

    Statement:语句执行者 接口

    PreparedStatement:预编译语句执行者 接口

    常用方法:

    设置参数:

    setXxx(int 第几个问号,Object 实际参数);

    常见的方法:

    setInt

    setString

    setObject

    执行sql:

    ResultSet executeQuery() :执行 r 语句 返回值:结果集

    int executeUpdate() :执行cud 语句 返回值:影响的行数

    ResultSet:结果集 接口

    执行查询语句之后返回的结果

    常用方法:

    boolean next():判断是否有下一条记录,若有返回true且将光标移到下一行,若没有呢则返回false

    光标一开始处于第一条记录的上面

    获取具体内容

    getXxx(int|string)

    若参数为int :第几列

    若参数为string:列名(字段名)

    例如:

    获取cname的内容可以通过

    getString(2)

    getString("cname")

    常用方法:

    getInt

    getString 也可以获取int值

    getObject 可以获取任意


    常见的配置文件格式:

    1.properties

    里面内容的格式 key=value

    2.xml

    若我们的配置文件为properties,并且放在src目录下.

    我们可以通过 ResourceBundle工具快速获取里面的配置信息

    使用步骤:

    1.获取ResourceBundle 对象:

    static ResourceBundle getBundle("文件名称不带后缀名")

    2.通过ResourceBundle 对象获取配置信息

    String getString(String key) :通过执行key获取指定的value


    案例2-通过连接池(数据源)优化我们的操作.

    需求:

    使用jdbc的时候,没操作一次都需要获取连接(创建)用完之后把连接释放掉了(销毁),通过连接池来优化curd操作.

    技术分析:

    连接池


    连接池概述:

    管理数据库的连接,

    作用:

    提高项目的性能.

    就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.

    所有的连接池必须实现一个接口 javax.sql.DataSource接口

    获取连接方法:

    Connection getConnection()

    归还连接的方法就是以前的释放资源的方法.调用connection.close();

    自定义一个连接池(理解思想)

    常用连接池:

    DBCP

    C3P0


    增前方法

    1.继承

    2.装饰者模式(静态代理)

    3.动态代理


    装饰者模式:★★★

    使用步骤:

    1.装饰者和被装饰者实现同一个接口或者继承同一个类

    2.装饰者中要有被装饰者的引用

    3.对需要增强的方法进行加强

    4.对不需要加强的方法调用原来方法


    常用的连接池:

    DBCP:(理解)

    apache组织

    使用步骤:

    1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)

    2.使用api

    a.硬编码

    //创建连接池

    BasicDataSource ds = new BasicDataSource();

    //配置信息

    ds.setDriverClassName("com.mysql.jdbc.Driver");

    ds.setUrl("jdbc:mysql:///xp");

    ds.setUsername("root");

    ds.setPassword("1234");

    b.配置文件

    实现编写一个properties文件

    //存放配置文件

    Properties prop = new Properties();

    prop.load(new FileInputStream("src/dbcp.properties"));

    //设置

    //prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");

    //创建连接池

    DataSource ds = new BasicDataSourceFactory().createDataSource(prop);

    C3P0:(★)

    hibernate和spring使用

    有自动回收空闲连接的功能.

    使用步骤:

    1.导入jar包(c3p0-0.9.1.2.jar)

    2.使用api

    a.硬编码(不推荐)

    new ComboPooledDataSource()

    b.配置文件

    配置文件的名称:c3p0.properties 或者 c3p0-config.xml

    配置文件的路径:src下

    编码只需要一句话

    new ComboPooledDataSource()//使用默认的配置

    new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不到,使用默认的配置


    案例3-使用dbutils完成curd操作

    技术分析:

    dbutils

    dbutils:

    是apache组织的一个工具类,jdbc的框架,更方便我们使用

    使用步骤:

    1.导入jar包(commons-dbutils-1.4.jar)

    2.创建一个queryrunner类

    queryrunner作用:操作sql语句

    构造方法:

    new QueryRunner(Datasource ds);

    3.编写sql

    4.执行sql

    query(..):执行r操作

    update(...):执行cud操作


    核心类或接口

    QueryRunner:类名

    作用:操作sql语句

    构造器:

    new QueryRunner(Datasource ds);

    注意:

    底层帮我们创建连接,创建语句执行者 ,释放资源.

    常用方法:

    query(..):

    update(..):

    DbUtils:释放资源,控制事务 类

    closeQuietly(conn):内部处理了异常

    commitAndClose(Connection conn):提交事务并释放连接

    ....

    ResultSetHandler:封装结果集 接口

    ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler

    (了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回

    (了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回

    ★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回

    ★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.

    (了解)ColumnListHandler, 将查询结果的指定一列放入list中返回

    (了解)MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回

    ★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回

    ★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值


    相关文章

      网友评论

          本文标题:2018-05-29数据库基础

          本文链接:https://www.haomeiwen.com/subject/tanajftx.html