标签:statement generic inpu pac 特定 @param user ons 工具
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驱动。
 
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等资源
 
连接数据库的工具类
    ```
    `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;
      }
    }   
    ```
    ?       
标签:statement generic inpu pac 特定 @param user ons 工具
原文地址:http://blog.51cto.com/13477015/2333220