JavaWeb 之 14.JDBC基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013987258/article/details/83239215


**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 = '任意';   (and 和 or中,and的优先级高)
        * select * from t_user where username = 'bbb ' -– ' and password = '';
    
    4.根本原因就是因为拼接了参数。
    5.解决这种问题
        * 前台校验
        * 后台的验证(使用PreparedStatement对象
    6.PreparedStatement来完成操作
        * 编写SQL语句,SQL语句的参数使用?代替
        * 预编译SQL语句    conn.prepareStatement(sql)
        * 设置参数的真正的值    stmt.setString(1,值)        1:代表?的位置
        * 执行SQL(不用传入SQL语句)
        

**封装单个表的操作**

    1.必须会写
    

**Text Blob大数据(了解)**
    
    在实际开发中,程序需要把大文本 Text 或二进制数据 Blob保存到数据库。
    Text是mysql叫法,Oracle中叫Clob 

    基本概念:大数据也称之为LOB(Large Objects),LOB又分为:
    clob和blob
    clob用于存储大文本。Text
    blob用于存储二进制数据,例如图像、声音、二进制文等。

    对MySQL而言只有blob,而没有clob,mysql存储大文本采用的是Text,Text和blob分别又分为:
    TINYTEXT(255)、TEXT(64k)、MEDIUMTEXT(16M)和LONGTEXT(4G)
    TINYBLOB(255)、BLOB(64k)、MEDIUMBLOB(16M)和LONGBLOB(4G)

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

    create table myblob(
        id int primary key auto_increment,
        mydata MEDIUMBLOB
    );
    
    
**批处理(了解)**

    1.批量插入和批量删除。
    Statement对象中的:
    * 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)
    );

猜你喜欢

转载自blog.csdn.net/u013987258/article/details/83239215