JDBC

梦想与她 提交于 2020-02-28 10:37:24

JDBC

  1. 概述

    1. JDBC是Java Data Base Connectivity(java连接数据库)
    2. JDBC接口的实现类——实现各大数据库厂商的java程序员负责编写sun公司制定的jdbc街口的实现类
    3. JDBC接口规范解决了java程序员与不同数据库用不同方法的难题
    4. 连接数据库的驱动,各大数据库厂商白镍车的jdbc接口
  2. 原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x3UuIPmJ-1582712096189)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225111144423.png)]

  1. 核心对象

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D0glmvIV-1582712067731)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225111544754.png)]

  2. JDBC的实现

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m6e9slwN-1582712067731)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225111959761.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILnEccMZ-1582712067731)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225112126154.png)]

  3. 步骤

    1. 导入驱动jar包
    	1. 复制jar到项目的lib目录下
    	2. 右键-->add as Library
    	
    2. 注册驱动
    	Class.forName("com.mysql.jdbc.Driver");
    	
    3. 获取数据库连接对象 Connection
    	conn = **DriverManager.getConnection(**"jdbc:mysql://localhost:3306/xinzhi","root","root");
    	
    4. 定义sql
    	String sql = "SELECT gb.gb_name , gb.fk_jt_id , gb.pk_gb_id from gb";
    	
    5. 获取执行sql语句的对象 Statement
    	sta = conn.createStatement();
    	
    6. 执行sql,接收返回结果
    	rs = sta.executeQuery(sql);
    	
    7. 处理结果
    8. 释放资源
    	rs.close();
      	sta.close();
       	conn.close();
    
  4. 获取连接

    默认格式
    Connection conn = null;
    Statement sta = null;
    ResultSet rs = null;
    
    加载驱动类
    Class.forName("com.mysql.jdbc.Driver");
    
    连接某个数据库
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/xinzhi","root","root");
    
    新建一个SQL对象
    sta = conn.createStatement();
    
    SQL的执行语句
    String sql = "SELECT gb.gb_name , gb.fk_jt_id , gb.pk_gb_id from gb";
    
    执行SQL的结果并赋值给rs
    rs = sta.executeQuery(sql);
    
    循坏全部数据
    while (rs.next()){
        Gb gb = new Gb();
        gb.setPkGbId(rs.getInt("pk_gb_id"));
        gb.setGbName(rs.getString("gb_name"));
        gb.setFkJtId(rs.getInt("fk_jt_id"));
        gbs.add(gb);
      }
      
    关闭流
    try{
      /* 先开的后关 */
       rs.close();
       sta.close();
       conn.close();
    }catch (SQLException e) {
      e.printStackTrace();
    }
    
  5. 详解

    1. DriverManager:驱动管理对象

      注册驱动:告诉程序该使用哪个驱动包
      	Class.forName("com.mysql.jdbc.Driver");
      	通过查看源码发现:在com.mysql.jdbc.Driver中存在静态代码块
      获取数据库连接
      	conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/xinzhi","root","root");
      	参数:
      	* url:指定连接的路径、
      		* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
      		* 例子:jdbc:mysql://localhost:3306/xinzhi
      	* user:用户名
      	* password:密码
      
    2. Connection:数据库连接对象

      获取sql的对象:
      	* Statement CreateStatement()
      	* PreparedStatement preparedStatement(String sql)
      管理事务:
      	* 开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为flase,即开启事务
      	* 提交事务:commit()
      	* 回滚事务:rollback()
      
    3. Statement:执行sql的对象

      boolean execute(String sql):可以执行任意的sql 了解
      int executeUpdate(String sql):执行DML(inser、update、delete)语句、DDL(create、alter、drop)语句
      	sta = conn.createStatement();
      	sta.executeUpdate(sql);
      
    4. ResultSet:结果集对象

      * rs.next()方法:游标向下移动一行,判断当前行是否是最后一行(是否有数据)如果是,返回true,不是返回false
      * rs.getInt(参数):获取数据类型
      	* getInt()、getString()
      	* 参数:
      		1. int:整数类型:getInt(1);
      		2. String:字符串类型:getString("name")
      	* 使用步骤:
      	 	1. 游标向下移动一行
      	 	2. 判断是否有数据
      	 	3. 获取数据
      	 	
      * 练习
      	*定义一个方法,查询user表的数据将其封装为对象,然后装载集合,返回
      		1. 定义user类
      		2. 定义方法 public List<user> findAll(){}
      		3. 实现方法 select * from user;
      
    5. PreparedStatement:执行sql的对象

      1. sql注入问题:在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接,会造成安全问题

        1. 输入用户随便,输入密码:a’or’a’='a
        2. sql:select * from user where username = ‘asdasd’ and userpwd = ‘a’or’a’=‘a’
      2. 解决sql注入问题:使用PrepareStatement对象来解决

      3. 预编译的SQL:参数使用占位符

      4. 步骤:

        conn = JDBC_Utils.getConnection();
        //            2. 定义SQL
        String sql = "select * from user where username = ? and userpwd = ?";
        //            3. 获取执行sql的对象
        pstm = conn.prepareStatement(sql);
        //            4. 给?赋值
        pstm.setString(1,username);
        pstm.setString(2,userpwd);
        //            5. 执行sql语句,不需要传递sql
        rs = pstm.executeQuery();
        //            6. 判断 如果有下一行返回true
        return rs.next();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally {
                    JDBC_Utils.close(rs,pstm,conn);
                }
        
  6. dao层:

    • 为数据交互层,只负责和数据库链接,执行sql,得到结果,返回结果。
  7. service层:

    • 只负责业务逻辑的处理,业务逻辑为,功能模块的一些数据处理,或者是一些错误的排查判断。
  8. 抽取JDBC工具类

    ** 目的:简化书写

    ** 分析:

    1. 注册驱动

    2. 抽取一个方法获取连接对象

      配置文件
      jdbc.properties
      url=
      user=
      passwprd=
      
    3. 抽取一个方法释放资源

  9. 概念

    Java DataBase Connectivity Java数据库连接,Java语言操作数据库
    JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
    	* 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功,返回值>0执行成功,反之失败
    	* ResultSet executeQuery(sql):执行sql
    
  10. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvUuiprU-1582712067732)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225183020626.png)]

  11. dao模式:分层开发

    
    
  12. JDBC控制事务

    1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败

    2. 操作:

      1. 开启事务
      2. 提交事务
      3. 回滚事务
    3. 使用Connection对象管理事务

      1. 开启事务:在执行sql之前开启事务

        setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
        conn.setAutoCommit(false);
        
      2. 提交事务:操作完毕提交事务

        conn.commit();
        
      3. 回滚事务:在catch中回滚事务

        if (conn != null) {
        	conn.rollback();
         }
        
  13. 练习

    • 需求

      通过键盘录入用户名密码
      判断用户是否登录成功
      
  14. 内容

    1. 数据连接池

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ziCDVNdJ-1582712067733)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200226173608419.png)]

      概念:其实就是一个容器(集合),存放数据库连接的容器
      	当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,会将对象归还给容器。
      好处:
      	1. 节约资源
      	2. 用户访问高效
      实现:
      	1. 标准接口:DataSource javax.sql包下的
      		1. 方法:
      			* 获取连接:getConnection()
      			* 归还连接:如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接
      	2. 一般不去实现它,由数据库厂商来实现
      		1. C3P0:数据库连接池技术
      		2. Druid:数据库连接池实现技术,由阿里巴巴提供的
      
    2. Spring JDBC:JDBC Template

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!