• JDBC深入!


    http://blog.163.com/muyexin@126/blog/static/39968083201081910321513/

    1.1. 注册JDBC驱动程序

    1.  Class.forName("oracle.jdbc.driver.OracleDriver");< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

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

    3.  java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver com.FirstJDBC

     

    1.2. 创建数据库连接(获取Connection的方法)

    1.        通过DriverManager获取

    Connection conn = DriverManager.getConnection(url,username",password");

    1)   JDBC的URL=协议名+子协议名+数据源名。

    a 协议名总是jdbc

    b 子协议名由JDBC驱动程序的编写者决定。

    c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。

    2)   几种常见的数据库连接

    -------------------------------jdbc-odbc---------------

    驱动:sun.jdbc.odbc.JdbcOdbcDriver

    URL:jdbc:odbc:datasource_name

    -------------------------------oracle------------------

    驱动:oracle.jdbc.driver.OracleDriver

    URL:jdbc:oracle:thin:@<machine_name><:port>:dbname

    注:machine_name:数据库所在的机器的名称;

    port:端口号,默认是1521

    -------------------------------mysql-------------------

    驱动:org.gjt.mm.mysql.Driver

    or:   com.mysql.jdbc.Driver

    URL:jdbc:mysql://<machine_name><:port>/dbname

    注:machine_name:数据库所在的机器的名称;

    port:端口号,默认3306

    ---------------------------SQL Server------------------

    驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver

    URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>

    注:machine_name:数据库所在的机器的名称;

    port:端口号,默认是1433

    --------------------------DB2--------------------------

    驱动:com.ibm.db2.jdbc.app.DB2Driver

    URL:jdbc:db2://<machine_name><:port>/dbname

    注:machine_name:数据库所在的机器的名称;

    port:端口号,默认是5000

    -------------------------------------------------------

     

    2.        通过Driver直接获取(不推荐使用)

    public static Connection getConnection() {

            String url = "jdbc:mysql://localhost:3306/tarena";

            String userName = "narci";

            String password = "11";

            Properties user = new Properties();

            //keyuser,password,不同的数据库的driverkey不是固定的

            //视乎driver的实现者

            user.setProperty("user", userName);

            user.setProperty("password", password);

            Driver driver=null;

            Connection conn=null;

            try {

                driver = new com.mysql.jdbc.Driver();

                conn = driver.connect(url, user);

            } catch (Exception e) {

                e.printStackTrace();

            }

            return conn;

        }

     

    1.3. 创建SQL(存储过程)语句的对象

    2.3.1.             创建Statement对象

    1.   Statement stm = con.createStatement();

    2.   主要方法

    1)   执行查询SQL语句(返回结果集)

            ResultSet executeQuery(String sql) throws SQLException;

    2)   执行更新SQL语句(返回受影响的行数)

        int rows = executeUpdate(String sql) throws SQLException

    3)   万能执行SQL语句(如果第一个结果为 ResultSet对象,则返回true;如果其为更新计数或者不存在任何结果,则返回false)

            boolean flag=stmt.execute(sql);

            ResultSet rs=null;

            int rows=0;

            if(flag){

            rs=stmt.getResultSet();

            }

            else{

            rows=stmt.getUpdateCount();

            }  

    2.3.2.             PreparedStatement

    1.         用来处理SQL结构、关键部分相同的SQL语句

    2.         pstmt=conn.prepareStatement(sql);

    3.         例子

        String sql = "SELECT * FROM student WHERE stu_sex=?";

        //?代表一个占位符合,它的值是待定的。

        pstmt=conn.prepareStatement(sql);

        //下面的语句设置?的值

        //第一参数是?的索引位置

        //第二参数:把?的值设置成这个参数

        pstmt.setString(1,f");

        rs=pstmt.executeQuery();

     

        String sql = "INSERT INTO student(stu_name,stu_sex,stu_age,stu_desc,stu_grade)  VALUES(?,?,?,?,?)";

        pstmt=conn.prepareStatement(sql);

        pstmt.setString(1, "LILY");

        pstmt.setString(2, "F");

        pstmt.setInt(3, 23);

        pstmt.setString(4, "***");

        pstmt.setString(5, "sd0702");

        pstmt.executeUpdate();

     

    2.3.3.             CallableStatement

    1.         用来执行存储过程

    2.         CallableStatement cstmt=con.prepareCall(sql);

    3.         例子

    String sql = "CALL getTotalStudent(?,?)";

    CallableStatement cstmt=con.prepareCall(sql);

    // 设置OUTIN参数

    cstmt.registerOutParameter(1, java.sql.Types.INTEGER);

    cstmt.setString(2, "xxx");

    创建一个存储过程

    in:参数从Java程序传到数据库的存储过程

    out:反过来

     

    SQl语句中创建存储过程:

    1) delimiter //

    2)

    CREATE PROCEDURE getTotalStudent(OUT totalStudent integer(11),IN sex char(2))

    BEGIN

    SELECT count(*) INTO totalStudent FROM

    student

    WHERE stu_sex LIKE sex;

    END//

    3) delimiter ;

    2.3.4.             Statement接口的比较

    Statement接口的比较

                Statement        PreparedStatement    CallableStatement

    代码创建     客户端             客户端               服务器端

    代码存储     客户端             服务器端             服务器端

    语言        Java、SQL           Java、SQL            服务器端特定数据库语言

    可配置性     灵活                较差                 差

    可移植性     高                  高(支持)           差

    效率         低                 第一次低,以后高      高

     

    选择:没有最好,只有最合适!

    建议:可以移植性好首先考虑的条件!然后再考虑性能问题!  

    1.4. How to handle resultset

    1.   通过index获取字段的值

        String getString(int columnIndex) //int类型的参数

     

        SELECT * FROM student;//默认顺序按表里的定义顺序

        rs.getString(3);//stu_sex

        SELECT stu_name,stu_sex,stu_desc FROM student;

        rs.getString(3);//stud_desc

        columnIndex:select子句中该字段的索引位置

     

    2.  通过字段名获取字段的值。

        String getString(String columnName) //String类型的参数

        以 Java 编程语言中 String 的形式检索此 ResultSet 对象的当前行中指定列的值。

        rs.getString("stu_name");//stu_name

        rs.getInt("stu_id");//stu_id

    3.  Java类型到SQL类型的映射。

     

    1.5. 关闭JDBC资源

    1.   首先关闭记录集;

    2.   其次关闭Statement;

    3.   最后关闭连接对象。

    if(rs !=null){

    try{rs.close();}catch(SQLException e){e.printStackTrace();}}

               if(stm!=null){try{stm.close();}catch(SQLException e){e.printStackTrace();}}

               if(con!=null){try{con.close();}catch(SQLException e){e.printStackTrace();}}
  • 相关阅读:
    HorizontalScrollView水平滚动控件
    编解码学习笔记(十):Ogg系列
    449A
    要点Java17 String
    struts2复习(五)拦截器总结
    java的wait和notifyAll使用方法
    centos网速特别慢的最佳解决的方法
    一年成为Emacs高手(像神一样使用编辑器)
    c++ 操作注冊表
    python 多线程编程
  • 原文地址:https://www.cnblogs.com/yangzhi/p/3576563.html
Copyright © 2020-2023  润新知