• mysql的JDBC连接


    程序是通过DriverManager注册驱动,所以加载之后可以直接使用DriverMannager
    mysql中的多态:
    不仅是赋值的时候使用了多态,返回的时候都是返回的借口(不是返回的子类对象),所以如果不使用多态需要强转通过Java代码去操作数据库

      JDBC ----- Java 数据库 连接 JDBC是java提供的数据库连接规范
      J ----- Java
      DB ----- DataBase
      C ----- Connectivity
    使用JDBC
    A.JDK 本身没有实现数据库连接的功能
      第三方实现了MySQL与Java的连接,并且打包成jar包
      我们要下载jar包,并且将jar包导入到当前项目

    B.获取连接   数据库连接的原理就是一个Socket
      在Eclipse的Java程序与MySQL之间创建一个管道

      注册驱动:Class.forName("com.mycql.jdbc.Driver") 最常用的方法
      获得连接:
          Connection con = DriverManager.getConnection(url,"账号","密码")
          这是个面向接口的编程,返回的是java中的父类Connection,创建的是mysql中实现类的对象
          url 作用:用来定位数据库
          jdbc:mysql://localhost:3306/database
          jdbc:mysql:   mysql数据库协议
          localhost     IP地址,定位一台电脑
          3306        端口号:定位MySQL程序
          database     定位MySQL的一个数据库
    C.在连接上创建代理对象
      Statement sta = con.createStatement();
        编写SQL语句并执行
        sta.executeXxx("SQL语句")
        处理执行结果
    D.释放资源 程序与外部交互都需要关闭资源,关闭资源之后数据库的数据才能进行其它操作
      关闭顺序,后创建的先关闭
      rs.close()
      sta.close()
      con.close()

    加载驱动的方式 将驱动类加载进内存
      1.Class.forName("驱动名")
      2.new Driver() 需要导包
      3.DriverManager.registerDriver(new Driver()) 需要导包
      4.System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver")

      2.3两种方式不常用
        原因1:
          类加载时,会自己使用方式3进行注册(Driver类中的静态代码块)
          方式2额外创建了一个无用对象
          方式3重复加载驱动
        原因2:
          常见的情况是,开发使用MySQL数据库,部署使用Oracle数据库
          如果是方式2.3,需要频繁改变导入的包名
          方式1可以将驱动名配置进配置文件 //返回的都是java中本身的接口规范,所以不需要导包

    Statement 执行代理对象的使用(用于代理固定了的SQL语句)
      A.ResultSet rs = Statement.executeQuery("select * form ...") 执行查询的语句,返回一个查询到的结果集
        ResultSet 封装了查询到的若干条数据
        
    用法:
        while(rs.next()){
          rs.getObject("字段名");
          rs.getObject(int indext); 字段索引,从第一行第一列开始
        }
          注意:Java中的索引一般从0开始,但是JDBC中的索引从1开始
    B.  int line = Statement.executeUpdate("insert into 表名 字段=值 where...")
          用于执行增删改操作的SQL语句,返回的是此操作改变了多少条数据
    C.  execute方法可以区别是查询还是修改语句
          返回值是true则是select语句,否则是修改语句

    PrepareStatement 是Statement的子类
      SQL语句的预处理对象
        在SQL语句中可以用 ? 作为占位符,之后补齐(站位符只能用于属性值的地方,会逐个分析传入字符,转义非法字符,去掉最外层单引号)
      1.获取执行对象
        PrepareStatement pst = con.prepareStatement(SQL语句)
      2.补齐占位符
        pst.setObject(int indext, value)
        Object的类型要和value的类型保持一致
      3.执行SQL语句
        pst.executeQuery()
        pst.executeUpdate()

      优点:
        A.功能更强大,比如可以插入一些特殊字符
        B.执行效率更高,因此称之为预定义的Statement (在获得连接的时候就已经准备执行了)

    注册驱动,获得连接,关闭资源代码重复,封装
    JDBCUtils
      public class JDBCUtils {
        //注册驱动只需要注册一次
          static {
            Class.forName("com.mysql.jdbc.Driver")
          }
        //封装获得连接
          public static Connection getCon(){
            Connection con = null;
              try {
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database",账户,密码);
              } catch (Exception e) {
              //发生了异常一定让程序停止,因为没有获得连接(抛运行时异常结束java虚拟机)
                e.printStackTrace();
                throw new RuntimeException();
              }
            return con;
          }

          public static void close(ResultSet rs,Statement sta,Connection con){
          //要打印自定义信息,在异常的构造方法中的有参构造,创建异常对象的时候就给出信息,catch到处理的时候打印
          //判断是不是不等于空,避免空指针,没有对象的时候不需要关闭,一定要释放资源,不然会影响数据的操作
            if(rs != null){
              try{
                rs.close();
              } catch (Exception e) {
                System.out.println(e.getMessage);
              }
            }
            sta.close();
            con.close();   //同理trycatch关闭资源
           }

        }

    JDK 中的 JDBC 设计
      A:JDBC 中大量的使用了多态
        全是接口,就是定义了规则,供各种数据库实现此规则,但都是接口层次,不用改源码
        Connection 使用
        Statement 使用
        ResultSet 使用
      B:真正的实现全在各种数据库自己封装的jar包中
        不使用多态的时候:
          1.程序一样运行
          2.缺点:更换jar包是,所有对应的导包实现都得修改
      
        多态体现在Jar包更换上,使用了多态,实现了一种可插拔设计
    接口相当于是一种规范,jar包中类实现了接口,遵守规范完成某种操作

  • 相关阅读:
    [bzoj1096][ZJOI2007]仓库建设
    [bzoj1010][HNOI2008]玩具装箱
    [bzoj2301][HAOI2011]Problem b
    [HDU1695]GCD
    [SDOI2006] 保安站岗
    [TJOI2007] 调整队形
    Luogu_1944 最长括号匹配
    [USACO07NOV] Milking Time
    [USACO13FEB] Tractor
    [模板] 一些要复习的模板
  • 原文地址:https://www.cnblogs.com/chonglchong/p/6731218.html
Copyright © 2020-2023  润新知