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;
          }
    
        }
        ```
    
        ?       

原文地址:http://blog.51cto.com/13477015/2333220

时间: 2024-10-04 02:50:13

Java JDBC下执行SQL的不同方式的相关文章

linux下执行sql脚本链接整理

linux下执行sql脚本        :http://blog.csdn.net/huoyunshen88/article/details/11556951

MySQL命令行下执行.sql脚本详解

本文主要介绍一个在MySQL命令行下执行脚本文件的例子,通过这个例子让我们来了解一下在命令行下MySQL是怎样执行脚本的吧.现在我们开始介绍这一过程. 1.首先编写sql脚本,保存为的:book.sql,内容如下: 1 use test; 2 3 create table book 4 5 ( 6 7 tisbn varchar(20) primary key, 8 9 tbname varchar(100), 10 11 tauthor varchar(30), 12 13 chubanshe

jdbc批量执行SQL insert 操作

package com.file; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; public class ResolvFile { public static String readFileContent(String filepath) { //1.读取每一行记录,保存到List中 ArrayList<String> records = new ArrayList&

mysql交互模式下执行sql文件

进入到mysql交互模式下, 创建库: create database my_database default charset utf8 collate utf8_general_ci; 进入自己的库: use my_database; 执行sql文件语句: source table.sql ; 注意事项:mysql交互模式需要在weixin.sql文件同级目录下打开. 原文地址:https://www.cnblogs.com/qxh-beijing2016/p/12512428.html

Linux和windows下执行sql脚本文件

利用 sqlplus 登录数据库之后 键入: @/全路径/文件名      即可执行*.sql 文件            例 假设有一个 test.sql 文件 所在路径是/home/oracle/ 现在要执行它              1 登录数据库            sqlplus system/manager              2 在提示符 SQL> 之后键入             SQL> @/home/oracle/test.sql; 利用 sqlplus 登录数据

Spark-Sql整合hive,在spark-sql命令和spark-shell命令下执行sql命令和整合调用hive

1.安装Hive 如果想创建一个数据库用户,并且为数据库赋值权限,可以参考:http://blog.csdn.net/tototuzuoquan/article/details/52785504 2.将配置好的hive-site.xml.core-site.xml.hdfs-site.xml放入$SPARK_HOME/conf目录下 [root@hadoop1 conf]# cd /home/tuzq/software/hive/apache-hive-1.2.1-bin [root@hadoo

Linux下执行SQL文件

最近在使用MySQL数据库时,想要执行一些sql文件,就想到了source命令. source介绍:source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令. 功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句. 用法:source filename 或 . filename 说明:source命令(从 C Shell 而来)是bash shell的内置命令;点命令(.),就是个点符号(从Bourne Shell而来)是source的另一名称. 有点跑

学习Java JDBC,看这篇就够了

JDBC (Java DB Connection)---Java数据库连接 JDBC是一种可用于执行SQL语句的JAVA API(ApplicationProgramming Interface应用程序设计接口).它由一些Java语言编写的类和界面组成. JDBC为数据库应用开发人员和数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯JAVA语言编写完整的数据库应用程序. JDBC代表JAVA数据库连接.它是一个软件层,允许开发者在JAVA中编写客户端/服务器应用. 一.

java:JDBC详解

JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. 简单的说,JDBC的意义在于在Java程序中执行SQL语句. 驱动程序的意义在于提供统一的接口并隐藏实现细节.驱动程序定义了数据库能做什么(what to do),比如上面提到的这四个步骤,数据库的制造商(例如Oracle)提供符合这些接口的实现(how to do),我们在编写Java程序中只需要调用驱动程序