美文网首页
Java - JDBC

Java - JDBC

作者: sunboximeng | 来源:发表于2018-06-26 01:06 被阅读9次

通过JDBC可以实现Java程序对后端数据库的访问。一般分为建立连接、操作、断开连接三步。

JDBC是java定义的一组访问数据库的接口,使得程序员可以把数据库当做抽象工具来使用。各个数据库厂商去实现这套接口,提供数据库驱动jar包(接口实现类)。

使用JDBC进行增删改查(6步,DJ666)
  • 导 jar 包(钱包里装钱)
  • 注册驱动(老司机 Driver 心动)
    JDBC中的Driver接口是驱动程序的抽象,是每个驱动程序类必须实现的接口。
    Class.forName(“com.mysql.jdbc.Driver");
    类一加载,就会把自己注册到 DriverManager 类中:
    static {
      try {  
          java.sql.DriverManager.registerDriver(new Driver()); //真的有老司机哦
      } catch (SQLException E) {
          throw new RuntimeException("Can't register driver!");
      }
    }
    
  • 连接数据库(要联系方式)
    JDBC中的 DriverManager 类(并不是接口)用于管理驱动,从而连接数据库。
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/数据库名","root","root");
    选中数据库即可,SQL语句中的 from 会选中表名。
    Connection是数据库连接对象,类似于网络编程中的socket类、IO流中的File类,都是用地址建立连接
    有了连接之后就可以:获取语句对象、管理事务。
  • 获得语句对象,执行SQL(撩妹)
    Statement stmt = conn.createStatement();
    增删改:int count = stmt.executeUpdate("update account set balance = 500 where id = 1");
    查询:ResultSet rs = stmt.executeQuery("select * from account");
    注意:此处的SQL语句并不加分号!
    解决SQL注入问题(向DB注入SQL语句)
    PreparedStatement pstmt = conn.prepareStatement(String sql); 传参传的早,因为要拿去做预处理。执行查询的时候不用再传参了。
    需要给SQL语句中的占位符赋值:
    pstmt.setXxx(参数编号,参数值),Xxx表示参数的类型。
  • 处理结果(一起去看电影)
    结果集有next方法,用于遍历,每次一行。遍历的实现类似于迭代器,毕竟没有index。

    while(rs.next()){
      //获取数据,一次获取一个字段,并不是一行数据。与Scanner的next方法类似。
      //代码是写死的,不用的表具有不同的字段
      int id = rs.getInt(1);
      String name = rs.getString("name");
      double balance = rs.getDouble(3);
    
      System.out.println(id + "---" + name + "---" + balance);
    }
    

    把表映射为类,把查询结果装到集合里面:

    Emp emp = null;
    list = new ArrayList<Emp>();
    while(rs.next()){
      //获取数据
      int id = rs.getInt("id");
      String ename = rs.getString("ename");
      int job_id = rs.getInt("job_id");
      
      // 创建emp对象,并赋值
      emp = new Emp();
      emp.setId(id);
      emp.setEname(ename);
      emp.setJob_id(job_id);
    
      //装载集合
      list.add(emp);
    }
    

    缺点:代码是写死的(不同表,字段不同),仍然有简化空间。

  • 关闭资源(防止营养跟不上)
    并不是那么容易关闭的,用finally保证一定关闭资源,但是对象不一定存在。

    finally{
      try{
          if(rs != null)
              rs.close();
    
          if(stmt != null)
              stmt.close();
    
          if(conn != null)
              conn.close();
      }catch(SQLException){
        //ignore
     }
    }
    

JDBCUtils

以上6步中除操作SQL的2步外都是固定的,所以抽取成为一个工具类。

很有趣:设计模式里面,为了应对变化,所以把变化的代码封装成一个类,以便替换。在继承里面,是把不变的东西做抽取,然后封装,避免代码重复,工具类同理。

  • 导包、注册驱动
    注册驱动放在静态代码块儿中,保证只执行一次。(有点像单例模式)
    为了代码的灵活性,利用 ClassLoader 获取配置文件路径,然后利用 Properties 进行读取,从而注册驱动。

    //ClassLoader 类加载器获取src路径下的文件的路径
    ClassLoader classLoader = JDBCUtils.class.getClassLoader();
    URL res  = classLoader.getResource("jdbc.properties");
    String path = res.getPath();
    

    为什么要获取文件路径,直接利用类加载器获得流不完了么。
    利用properties读取文件不会了?Java IO流

  • 获得连接

  • 释放资源
    释放资源的方法是重载的,因为增删改 和 查的返回值不一样。

JDBC控制事务

使用 Connection 对象管理事务。在上面的代码中,添加以下代码:

  • 开启事务(也就是关闭自动提交):connection.setAutoCommit(false);
  • 提交事务:SQL语句之后。connection.commit();
  • 回滚事务:catch中进行回滚。先检查非空,conn.rollback();

相关文章

网友评论

      本文标题:Java - JDBC

      本文链接:https://www.haomeiwen.com/subject/ewbuyftx.html