zoukankan      html  css  js  c++  java
  • jdbc基础

    readme

    课程回顾:MySQL

    1.聚集函数
        * count
        * sum
        * avg
        * max
        * min
    
    2.分组
        * 默认是一组,可以关键字group by 字段 分组。
        * 需要分组和聚集一起使用。
        * 在group by having 条件(后面可以使用聚集函数)
    
    3.小结
        * select ... from ... where ... group by ... having ... order by
    
    4.重置密码,数据库备份和恢复
    5.数据库的主键
        * 主键代表记录的唯一标识。
        * 关键字   primary key 
        * 特点
            * 唯一
            * 非空
            * 被引用
    
    6.主键的自增长
        * 关键字 auto_increment
        * int bigint
    
    7.唯一和非空
        * unique
        * not null
    
    8.外键
        * 作用:保存数据的完整性。
        * 关键字:foreign key (dno) references dept (did);foreign key (dno) references dept (did);
    
    9.关系(创建表的时候)
        * 一对多   :在多方的表中添加一个字段,声明成外键。指向一方表的主键。
        * 多对多   :创建中间表(把一个多对多拆成两个一对多),中间表至少2个字段,作为外键。指向一方表的主键。
        * 一对一   :主键对应 唯一外键对应
    
    10.多表的查询
        * 内链接
            * 普通内连接
                * inner join ... on
            * 隐式内连接
                * select ... from where 条件;
        * 外链接
            * 左链接
                * left outer join .. on
            * 右链接
                * right outer join ... on
    
    11.子查询
        * 一个语句有多个select关键字
    

    JDBC的第一天

    JDBC的简介和快速入门

    JDBC的简介

    1.MySQL驱动包(JDBC接口的实现类,就是一个jar包)。
    2.JDBC是SUN公司提出一套规范,就是一组接口。这写接口的实现类是由各个数据库的生产商提供的。
    3.JDBC的快速入门的开发有一些的开发步骤
    

    快速入门

    1.把MySQL驱动包导入到工程中。
    2.创建数据库和表结构,手动添加数据。查询的快速入门。
        create database day17;
        use day17;
        create table t_user(
            id int primary key auto_increment,
            username varchar(30),
            password varchar(30)
        );
        insert into t_user values (null,'美美','123');
        insert into t_user values (null,'聪聪','456');
        insert into t_user values (null,'aaa','789');
        insert into t_user values (null,'bbb','111');
    
    3.可以编写java代码。
    

    讲解类和接口

    DriverManage类

    1.注册驱动
        * DriverManager.registerDriver(new Driver());
        * 其实这个方法有两点不好
            * 过于依赖MySQL驱动包。
            * 注册驱动的代码实际上执行了2次。
        * 想使用一种方式解决上述两个问题。  
            * Class.forName("com.mysql.jdbc.Driver");
    
    2.获取链接对象
        * Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day17", "root", "root");
        * url           -- 数据库的链接地址 
            * jdbc:mysql://localhost:3306/day17
                * jdbc          :数据库之间传输数据的协议
                * mysql         :jdbc协议的子协议。
                * localhost     :服务器的地址
                * 3306          :默认的端口号
                * day17         :数据库的名称
            * 注意:如果你要链接你自己电脑上的数据库,简写的方式
                * jdbc:mysql:///day17
    
        * user          -- 用户名
        * password      -- 你的数据库的密码
    

    Connection对象(链接)

    1.创建执行SQL语句的对象
        * Statement createStatement()                       -- 获取执行SQL语句对象
        * PreparedStatement prepareStatement(String sql)    -- 获取执行SQL语句对象,预编译SQL语句,防止SQL注入
        * CallableStatement prepareCall(String sql)         -- 获取执行SQL语句对象,执行存储过程
    
    2.管理事物
        * 事物:一组逻辑上的操作。
        * void setAutoCommit(boolean autoCommit)            -- 设置事物自动提交
        * void commit()                                     -- 提交事物
        * void rollback()                                   -- 回滚事物
    

    Statement对象

    1.执行SQL语句
        * ResultSet executeQuery(String sql)        -- 执行查询语句(select语句)
        * int executeUpdate(String sql)             -- 执行增删改的操作(insert update delete)
        * boolean execute(String sql)               -- 执行任意的sql(如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false )
    
    2.执行批处理
        * 可以一批插入或者删除数据。(表格)
        * void addBatch(String sql)                 -- 把SQL语句添加批处理中
        * int[] executeBatch()                      -- 执行批处理
        * void clearBatch()                         -- 清除批处理
    

    ResultSet对象

    1.执行查询语句,才有结果集。
    2.游标的默认位置在第一行数据之前
    3.调用rs.next()方法,游标判断是否有下一行数据,如果有,移动到下一行。可以通过getXXX()方法获取该行的数据。
    4.游标默认只能向下移动,如果滚动,可以设置滚动的结果集。
    
    5.getXXX()  这些方法都是重载的int(字段的位置)   String(字段的名称)
    6.getObject()   获取任意类型的数据(强转)
    

    设置滚动的结果集(了解)

    1.如果想使用滚动结果集,需要该方法来生成Statement对象
        * Statement createStatement(int resultSetType, int resultSetConcurrency) 
            * resultSetType             -- 结果集类型
            * resultSetConcurrency      -- 结果集并发策略
    
    * 结果集的类型
        * TYPE_FORWARD_ONLY             -- 只能向下
        * TYPE_SCROLL_INSENSITIVE       -- 可以滚动,不能修改
        * TYPE_SCROLL_SENSITIVE         -- 可以滚动,又可以修改
    
    * 结果集并发策略
        * CONCUR_READ_ONLY              -- 只能读
        * CONCUR_UPDATABLE              -- 可以修改
    
    * 把类型和并发策略,组合。  
        * TYPE_FORWARD_ONLY             CONCUR_READ_ONLY    默认的结果集,只能向下,不能修改记录
        * TYPE_SCROLL_INSENSITIVE       CONCUR_READ_ONLY    可以滚动,不能修改记录
        * TYPE_SCROLL_SENSITIVE         CONCUR_UPDATABLE    可以滚动,也可以修改记录
    

    释放资源

    1.connection链接对象,晚创建早释放。
    2.释放标准的代码
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
    

    使用JDBC来完成增删改查的操作(必须会写)

    1.操作t_user的表,完成增删改查的功能。
    

    封装工具类(一直修改)(自己封装)

    1.封装的过程。
    

    介绍DAO模式

    DAO模式就是持久层的一种解决方案,封装对于数据源及其数据的单个操作,需要提供一组接口,供业务层访问,业务调用DAO的代码时候需要传递一个对象。
    

    重写登陆的案例

    1.搭建环境
    2.导入jar包(MySQL驱动包,BeanUtils包,JSTL的包)
    3.代码编写
    

    SQL注入的问题(漏洞)

    1.在文本框输入一些特殊的字符,在已知用户名的情况下,输入用户登陆进去。
    2.xxx ' or  ' 1=1   或者  xxx ' –  
    3.咱们编写的SQL语句    select * from t_user where username = '' and password = '';
        * select * from t_user where username = 'bbb ' or ' 1=1 ' and password = '任意';
        * select * from t_user where username = 'bbb ' -– ' and password = '';
    
    4.根本原因就是因为拼接了参数。
    5.解决这种问题
        * 前台校验
        * 后台的验证(使用PreparedStatement对象)
    6.PreparedStatement来完成操作
        * 编写SQL语句,SQ    L语句的参数使用?代替
        * 预编译SQL语句  conn.prepareStatement(sql)
        * 设置参数的真正的值 stmt.setString(1,值)     1:代表?的位置
        * 执行SQL(不用传入SQL语句)
    

    封装单个表的操作

    1.必须会写
    

    Text Blob大数据(了解)

    1.创建数据库的表结构
    create table mytext(
        id int primary key auto_increment,
        mydata MEDIUMTEXT
    );
    
    
    create table myblob(
        id int primary key auto_increment,
        mydata MEDIUMBLOB
    );
    

    批处理(了解)

    1.批量插入和批量删除。
    
    * void addBatch(String sql)                 -- 把SQL语句添加批处理中
    * int[] executeBatch()                      -- 执行批处理
    * void clearBatch()                         -- 清除批处理
    
    * insert into xxx values (null,"值");    如果使用Statement对象执行SQL语句。
    * insert into xxx values (null,?);      先发送SQL到服务器端,预编译。设置值。使用PreparedStatement对象
    
    
    create table mybatch(
        id int primary key auto_increment,
        name varchar(20)
    );
    

    作业

    1.注册功能重写
    
  • 相关阅读:
    【笔记】网易微专业-Web安全工程师-04.WEB安全实战-7.SQL回显注入
    【笔记】网易微专业-Web安全工程师-04.WEB安全实战-6.文件上传
    【笔记】网易微专业-Web安全工程师-04.WEB安全实战-5.文件包含
    【笔记】网易微专业-Web安全工程师-04.WEB安全实战-4.CSRF
    zoom和transform:scale的区别
    图片上黑色透明遮罩的实现
    如何实现两行文本增多显示省略号
    H5如何实现一行三列布局
    H5瀑布流如何实现
    H5一行显示两个正方形
  • 原文地址:https://www.cnblogs.com/chyxOne/p/9831537.html
Copyright © 2011-2022 走看看