Java JDBC下执行SQL的不一样方式

Java JDBC简介

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

jdbc的驱动一般有四种类型mysql

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

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

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

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

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

    1.加载数据库驱动 服务器

    ​ 使用Class类的forName()静态方法来加载驱动(由各个数据库厂商本身实现) 网络

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

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

    ​ 对于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;
          }
    
        }   
        ```
    
        ​
相关文章
相关标签/搜索