zoukankan      html  css  js  c++  java
  • Document

    回顾:
    sql
        sql分类:
            DDL:
                对象:数据库和表
                关键词:create alter drop truncate
                创建数据库:create database day06;
                删除数据库: drop database day06;
                创建表:create table user(
                    id int primark key  auto_increment,
                    username varchar(20)
                );
                
                修改表:
                    alter table user rename to user10;
                    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 day07;
            USE day07;    
            
            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:///day07");
                        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值
            
            
            
            
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
        
    //////////////////////////////////
    上午回顾:
    jdbc:
        java语言操作数据库
        jdbc是oracle公司指定的一套规范,
        驱动:jdbc的实现类,由数据库厂商提供.
    jdbc操作步骤:
        1.导入驱动jar包
        2.注册驱动
        3.获取连接
        4.编写sql
        5.获取语句执行者
            PreparedStatement st=conn.prepareStatement(sql);
        6.设置参数
            st.setXxx(int 第几个问号,Object 实参);
        7.执行sql
            ResultSet rs=st.executeQuery();
            int i=st.executeUpdate();
        8.处理结果
            若是resultset
                while(rs.next()){
                    rs.getXxx(int|String)
                }
        9.释放资源
    ////////////////////////////////////////
    获取src目录下的properties格式的配置文件
        ResourceBundle bundle=ResourceBundle.getBundle("不带后缀名的文件名");
        String value = bundle.getString("key"); 
    ////////////////////////
    自定义连接池:
    增强方法:
        1.继承
        2.装饰者模式(静态代理)
        3.动态代理
    ///////////////
    装饰者模式(静态代理)
        1.装饰者和被装饰者实现同一个接口或者继承同一个类
        2.在装饰者中要有被装饰者的引用
        3.对需要增强的方法进行加强
        4.对不需要加强的方法调用原来方法
    ///////////////////
    常见连接池:
        dbcp:
        c3p0:★
            配置文件:
                名称:c3p0.properties或者 c3p0-config.xml
                位置:src下
            使用:
                new ComboPooledDataSource()
    ////////////////
    dbutils:
        工具类,封装了jdbc的操作.
        使用步骤:
            1.导入jar包
            2.创建queryrunner类
            3.编写sql
            4.执行sql
    queryrunner:操作sql语句
        构造器:
            new queryrunner()
        方法:
            query(..)
            update(..)
    ResultSetHandler:封装结果集
        BeanHandler
        BeanListHandler
        MapListHandler
        ScalarHandler
        
        
        
        
        
        
        
        
        
        
        
        
        
  • 相关阅读:
    UUID工具类
    jax-rs 标准以及 结合 resteasy的使用
    Mina.Net实现的断线重连
    Mina.Net实现的UDP协议消息收发Demo
    MySql 比Replace Into更适合的用法,外加SqlServer的方式。
    MySql【Insert Select Not Exist】判断记录再添加值的方案
    MySql中存储过程中的@变量总是无法执行,提示Parameter '@XXX' must be defined
    Go语言使用Beego的ORM插入Mysql后,时区不一致的解决方案
    Go语言中Path包用法
    C#(WPF和WinForm)在普通类中调用到主线程的方法,SynchronizationContext的用法。
  • 原文地址:https://www.cnblogs.com/chenyanlong/p/9955302.html
Copyright © 2011-2022 走看看