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();}}
原文地址:https://www.cnblogs.com/yangzhi/p/3576563.html