您的位置:首页 > 编程语言 > Java开发

[ java ] JDBC深入!

2013-02-11 22:40 197 查看

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();
        //key为user,password,不同的数据库的driver的key不是固定的
        //视乎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);
// 设置OUT和IN参数
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();}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: