JAVA语言之Java JDBC下执行SQL的不同方式
小标 2019-03-04 来源 : 阅读 707 评论 0

摘要:本文主要向大家介绍了JAVA语言之Java JDBC下执行SQL的不同方式,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之Java JDBC下执行SQL的不同方式,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

JAVA语言之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频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程