继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java JDBC下执行SQL的不同方式

holdtom
关注TA
已关注
手记 1703
粉丝 240
获赞 991


Java JDBC简介

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

jdbc的驱动通常有四种类型


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

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

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

本地协议驱动 这种类型的驱动使用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;

      }

    }   

    ```

           

©著作权归作者所有:来自51CTO博客作者万和IT教育的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP