Java JDBC下执行SQL的不同方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java JDBC下执行SQL的不同方式相关的知识,希望对你有一定的参考价值。

Java JDBC简介

? 数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用,使用Java JDBC API进行编程,可以为多种关系数据库提供统一访问。

jdbc的驱动通常有四种类型

?

  1. JDBC-ODPC桥: 它将JDBC API映射到ODPC API。再让JDBC-ODPC调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll)

  2. 本地API驱动 直接将JDBC API映射成数据库特定的客户端API,即通过客户端加载数据库厂商提供的本地代码库(

  3. 网络协议驱动 这种类型的驱动给客户端提供了一个网络API,客户端上的JDBC驱动程序使用套接字(Socket)来调用服务器上的中间件程序,后者在将其请求转化为所需的具体API调用。

  4. 本地协议驱动 这种类型的驱动使用Socket,直接在客户端和数据库间通信。它是一种直接与数据库实例交互的JDBC 这种驱动是智能的,它知道数据库使用的底层协议,也是目前最主流使用的JDBC驱动。
     

    JDBC编程(连接数据库)步骤

    1.加载数据库驱动

    ? 使用Class类的forName()静态方法来加载驱动(由各个数据库厂商自己实现)

    ? 对于oracle数据库而言数据库驱动类对应的字符串:oracle.jdbc.driver.OracleDriver

    ? Class.forName("oracle.jdbc.driver.OracleDriver");

    ? 对于mysql数据库而言数据库驱动类对应的字符串:com.mysql.jdbc.Driver

    ? Class.forName("com.mysql.jdbc.Driver");

    2.获取Connection对象

    ? DriverManager类提供getConnection(String url, String user, String pass);

    ? url: 数据库连接字符串

    ? user: 用户名

    ? pass: 密码

    ? Mysql:

    ? url: jdbc:mysql://hostname:port/databasename

    ? oracle

    ? url: jdbc:oracle:thin:@hostname:port:databasename

    3.通过Connection对象创建Statement对象

    ? Connection创建Statement对象的常用方法有如下2个

    ? createStatement(String sql):创建基本的Statement对象

    ? prepareStatement(String sql): 根据传入的SQL语句创建预编译的Statement对象

    4.使用Statement执行SQL语句

    ? execute(): 可以执行任何SQL语句,但比较麻烦

    ? executeUpdate(): 主要用于执行DML和DDL语句。执行DML语句返回受SQL影响的行数,执行DDL语句返回

    ? executeQuery(): 只能执行查询语句,执行后返回代表查询结果的ResultSet对象,该对象里保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象来取出查询结果。

    ? ResultSet对象主要提供了如 下方法

    ? 移动记录指针的方法

    ? next()

    ? previous()

    ? first()

    ? last()

    ? 获取指针指向的某行的"特定的列值"

    ? getInt()

    ? getString()     

    ? getObject()

    ? ...

    ? 该方法既可以使用列索引作为参数,也可以使用列名作为参数

    5.回收数据库资源 包括关闭ResultSet、Statement、Connection等资源
     

    下面以oracle为理,写一个jdbc增加删除修改的工具类

    连接数据库的工具类

        ```
        `package net.wanhe.util;
    
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.IOException;
        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.util.Properties;
    
        /**
    
        - 数据的连接以及关闭
    
        - 
    
        - @author Administrator
          *
           */
          public class JDBCUtil {
          private static String driverName;
          private static String url;
          private static String user;
          private static String password;
          /**
    
          - 静态初始化,初始化一次
            */
            static {
            try {
                Properties p = new Properties();
                // 配置文件放置在工程的下面
                p.load(new FileInputStream("jdbc.properties"));
    
            ```
             driverName = p.getProperty("driverName");
             url = p.getProperty("url");
             user = p.getProperty("user");
             password = p.getProperty("password");
            // 加载驱动
            Class.forName(driverName);
            ```
    
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
            /**
    
          - 获取数据库的连接对象(Connection对象)
            */
            public static Connection getConnection(){
            Connection conn=null;
            try {
                conn=DriverManager.getConnection(url, user, password);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return conn;
            }
            /**
    
          - 关闭数据库
            */
            public static void close(Connection conn,PreparedStatement ps,ResultSet rs){
            try {
                if(rs!=null){
                    rs.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                if(ps!=null){
                    ps.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
    
        }`
        ```
    
        映射的接口
    
        ```
        `package net.wanhe.jdbc;
    
        import java.sql.ResultSet;
    
        public interface RowMapper<T> {
            /**
             * 数据库中表的一条数据对应的一个对象
             */
            T rowMapper(ResultSet rs);
        }`
        ```
    
        BaseDao的工具类
    
        ```
        package net.wanhe.jdbc;
    
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.ResultSetMetaData;
        import java.sql.SQLException;
        import java.util.ArrayList;
        import java.util.List;
    
        import org.apache.commons.beanutils.BeanUtils;
    
        public class BaseDao<T> {
    
        Class clazz;
    
            /**
             * 获取泛型信息
             */
            public BaseDao(){
                 try {
                    clazz=ReflectionUtil.getGenericSuper(this.getClass());
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            /**
             * 增加,删除,修改
             */
            public void update(String sql,Object...parameterValues){
                //建立连接
                Connection conn=JDBCUtil.getConnection();
                PreparedStatement ps=null;
                try {
                    //获取预处理对象
                    ps=conn.prepareStatement(sql);
                    //给占位符赋值
                    setParameters(ps, parameterValues);
                    //执行sql语句
                    ps.executeUpdate();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally{
                    JDBCUtil.close(conn, ps,null);
                }
    
            }
    
            /**
    
        - 给占位符赋值
        - @param ps
        - @param parameterValues
        - @throws SQLException
          */
          private void setParameters(PreparedStatement ps, Object... parameterValues) throws SQLException {
          for(int i=0;i<parameterValues.length;i++){
            ps.setObject(i+1, parameterValues[i]);
          }
          }
          /**
        - 增加,返回自增长的值
        - @param sql
        - @param parameterValues
        - @return
          */
          public int insert(String sql,Object...parameterValues){
          //建立连接
          Connection conn=JDBCUtil.getConnection();
          PreparedStatement ps=null;
          ResultSet rs=null;
          int pk=0;
          try {
            //获取预处理对象
            ps=conn.prepareStatement(sql,new String[]{"id"});
            //给占位符赋值
            setParameters(ps, parameterValues);
            //执行sql语句
            ps.executeUpdate();
            rs=ps.getGeneratedKeys();
            if(rs.next()){
                pk=rs.getInt(1);
            }
    
          } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }finally{
            JDBCUtil.close(conn, ps,null);
          }
           return pk;
          }
    
            /**
    
        - 查询
        - @param sql
        - @return
          */
          public List<T> query(String sql,RowMapper rm,Object...parameterValues){
          List<T> list=new ArrayList<T>();
          Connection conn=null;
          PreparedStatement ps=null;
          ResultSet rs=null;
          try {
            conn=JDBCUtil.getConnection();
            ps=conn.prepareStatement(sql);
            setParameters(ps, parameterValues);
            rs=ps.executeQuery();
            while(rs.next()){
                T t=(T) rm.rowMapper(rs);
                list.add(t);
            }
          } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }finally{
            JDBCUtil.close(conn, ps, rs);
          }
           return list;
          }
    
        }   
        ```
    
        ?       

以上是关于Java JDBC下执行SQL的不同方式的主要内容,如果未能解决你的问题,请参考以下文章

3JDBC-API

Java基础--JDBC

请问为啥我的这几行代码总报sql异常?明明在mysql下执行的很好,但到jdbc下执行就不行

Hive数据仓库--Java代码JDBC方式访问Hive中表的数据

java 连接mysql数据库怎么连接

java 事务