java篇之JDBC原理和使用方法

Posted ym77

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java篇之JDBC原理和使用方法相关的知识,希望对你有一定的参考价值。

JDBC学过但又属于很容易忘记的那种,每次要用到,都要看下连接模式。每次找又很费时间,总之好麻烦呀呀呀,所以写篇博客,总结下原理和常用接口,要是又忘了可以直接来博客上看,嘿嘿。

  一、什么是JDBC

  1、JDBC全称是 Java DataBase Connectivity,可以为多种关系型数据库DBMS提供统一的访问方式,主要目的是用Java来操作数据库。

  2、JDBC API主要负责三个功能:(1)与数据库建立连接(2)发送SQL语句给数据库(3)数据库将结果返回

  技术图片

具体过程大致是这样子的:

技术图片

  3、实现方法:(1)DriverManager:管理jdbc驱动(2)Connection 连接数据库(3)Statement(PreparedStatement)增删改查 CallableStatement 调用数据库的存储过程和存储函数 (4)ResultSet 结果集

  4、实现步骤:(1)导入驱动,加载具体驱动类(2)与数据库建立连接(3)执行SQL语句(4)返回结果

  5、常见数据库 oracle,mysql,SQLServer的加载驱动

      oracle---具体驱动类:oracle.jdbc.OracleDriver     连接字符串:jdbc:oracle:thin:@localhost(ip地址):1521:ORCL

      mysql---具体驱动类:com.mysql.jdbc.Driver    连接字符串:jdbc:mysql://localhost(ip地址):3306/数据库实名

      SQLServer---具体驱动类:com.microsoft.sqlserver.jdbc.SQLServerDriver     连接字符串:jdbc.microsoft.sqlserver:localhost(ip地址):1433;数据库实名

  6、举个实例(以mysql数据库为例)实现对数据库增删改 查

建一个JDBCDemo

public class JDBCDemo 
      private  String driver="com.mysql.jdbc.Driver";
      private  String  url="jdbc:mysql://localhost:3306/test";
      private  String username="root";
      private  String password="root";
      Connection conn=null;
      Statement statement=null;
      ResultSet set=null;
      public void updateSql()
          try
              //加载驱动类
              Class.forName(driver);
              //与数据库建立连接
              conn= DriverManager.getConnection(url,username,password);
              //发送SQL语句
              statement=conn.createStatement();
              //插入数据
              String sql="insert into user(username,password) values(‘114‘,‘1234‘)";
              //修改数据
              //String sql="update user set password=‘1232‘ where id=2"
              //删除数据
              //String sql= "delete from user where id=2";
              //sql语句结果,一般进行 增删改 的SQL语句用excuteUpdate
              int count=statement.executeUpdate(sql);
              if(count>0)
                  System.out.println("操作成功");
              else
                  System.out.println("操作失败");
              
          catch(ClassNotFoundException e)
              e.printStackTrace();
          catch (SQLException e)
              e.printStackTrace();
          catch (Exception e)
              e.printStackTrace();
          finally 
              try 
                  if (statement == null) //用判断来防止statement空异常
                      statement.close();
                  
                  if (conn == null) 
                      conn.close();
                  
              catch (SQLException e)
                  e.printStackTrace();
          

          
      
      public  void querySql()
          try
              //加载驱动类
              Class.forName(driver);
              //与数据库建立连接
              conn= DriverManager.getConnection(url,username,password);
              //发送SQL语句
              statement=conn.createStatement();
              String sql="select * from user where username=‘111‘ and password=‘1234‘ ";
              //返回结果集
              set=statement.executeQuery(sql);
             while(set.next())
//用两种方式获取值,一种是根据列名,一种是所在的列数 String name
=set.getString("username"); String pass=set.getString("password"); //String name=set.getString(2); // String pass=set.getString(3); System.out.println(name+","+pass); catch(ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace(); catch (Exception e) e.printStackTrace(); finally try if (statement == null) //用判断来防止statement空异常 statement.close(); if (conn == null) conn.close(); catch (SQLException e) e.printStackTrace();

上述代码主要使用Statement方式发送SQL,还有preparedStatement方式。他们之间有相同点,但是又不是一样,下面就来比较下Statement和PreparedStatement

  二、Statement与PreparedStatement的比较

Statement:(1)产生方式:Connection.createStatement()(2)增删改 executeUpdate()(3)查询 executeQuery()(4)一般将SQL语句放在executeUpdate()中

PreparedStatement:(1)产生方式:Connection.prepareStatement()(2)增删改 executeUpdate()(3)查询 executeQuery()(4)一系列SetXXX方法(5)将SQL放在Connection.PrepareStatement(SQL)(6)需要预编译

查看PreparedStatement的源码 ,可知PreparedStatement继承Statement,Statement里有的方法PreparedStatement都有,但是PreparedStatement还有很多SetXXX方法

技术图片

技术图片

 用代码直观的体现两者的区别:

 技术图片

除了这部分之外,其他和上述代码一样,多了一步预编译。

  三、PreparedStatement较Statement的优势

(1)编码更加简洁灵活:在PreparedStatement中SQL语句后的查询条件,插入的值可以用占位符(?)来表示,不用像Statement一样写具体的值,只需要调用PreparedStatement中的SetXXX方法赋值即可。

(2)提高性能:如果要执行一条SQL语句100回,Statement需要connection,createStatement(sql)语句编译SQL100次,PreparedStatemnet只需要编译SQL语句一回(即connection.PreparedStatement(sql)),重复执行100次preparedStatement.executeQuery();减少编译SQL次数,提高性能。

(3)安全性高,可以有效防止SQL注入的风险:Statement存在SQL注入的风险,PreparedStatement可以防止SQL注入的风险。

 

以上是关于java篇之JDBC原理和使用方法的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程系列基础篇之 synchronized关键字

ShardingSphere系列之Sharding JDBC实现原理

ShardingSphere系列之Sharding JDBC实现原理

ShardingSphere系列之Sharding JDBC实现原理

Java虚拟机解析篇之---内存模型

Java软件开发 | 高并发编程篇之——安全访问的集合