我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > JDBC——学习笔记
总共48087条微博

动态微博

查看: 3164|回复: 7

JDBC——学习笔记

[复制链接]

3

主题

2

听众

73

金钱

二袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-07-06 15:16:57 |只看该作者 |倒序浏览
  JDBC 编程的步骤
        import java.sql.*;
    0.参数化
        String driverName = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/test"; //协议;库或服务器名称;服务器IP,端口
        String username = "root";
        String password = "";
        // Oracle的连接
        String driverName = "oracle.jdbc.driver.OracleDriver";
        String url = "jdbcracle:thin192.168.0.23:1521ra10g";
        // SQL Server 的连接
        String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
        String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=test";
        //以下这些都需要写在有异常的代码块里,所以需要提取出来。
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;       // 建议用PreparedStatement
    1.加载和注册数据库驱动
        Class.forName(driverName);//自动注册;需要把驱动的jar包导进来;需处理异常
            /*方法二:实例化具体的Driver驱动,这写法一般不用(不能参数化驱动名,不够灵活)
            Driver driver = new com.mysql.jdbc.Driver();
            DriverManager.registerDriver(driver); //将驱动交于DriverManager托管*/
            /*方法三:Dos运行时,java -Djdbc.drives = oracle.jdbc.driver.OracleDriver; --可多个 */
    2.连接数据库
        conn = DriverManager.getConnection(url, username, password);//需处理异常
        //Connection返回数据库连接,如:“com.mysql.jdbc.Connection@1ffb8dc”;连接不成功则返回 null
    3.创建Statement对象
        stmt = conn.createStatement();//需处理异常,返回其生成结果的对象
        /*为了类型安全和批量更新的效率,建议用PreparedStatement
         String sql = "insert into tableName values(?,?)"; // "?"占位符
         stmt = conn.prepareStatement(sql); */
    4.操作数据库,执行SQL语句
        String sql = "select * from tableName";//SQL语句里不需要写分号
        rs = stmt.executeQuery(sql); //executeQuery(sqlString) 查询 返回查询结果集
            /* String sql = "insert into tableName values(?,?)"; // "?"占位符
            int number = stmt.executeUpdate(sql);//更新,再返回int(更新、修改影响的条数)
            //executeUpdate(sql) 执行给定 SQL 语句,如 INSERT、UPDATE 或 DELETE 等不返回任何内容的语句*/
       //用PreparedStatement时,已经有语句: rs = stmt.executeQuery();
    5.处理数据(游标)
        StringBuffer sb = new StringBuffer(); //缓存;用它可提高读取速度。当然,不用也可以。
        ResultSetMetaData md = rs.getMetaData(); //ResultSetMetaData可获取列的类型和属性信息
        int col = md.getColumnCount(); //获取列的数目
        while(rs.next()){ //rs.next()使游标下移一位,返回boolean,没有下一个结果则返回false
            for(int i=1; i<=col;i++){ // index(JDBC 的下标从1开始)
                sb.append(md.getColumnName(i)+"="+rs.getString(i)+"  ");
            } sb.append("\n");
        }System.out.println(sb);
            //1.游标的初始位置在第一条记录的前面,使第一次调用next()后,刚好拿到第一个结果。
            //2.游标的最终位置在最后一条记录的后面(结果集的前面和后面留空,真正存在)
    6.释放资源,断开与数据库的连接
        //先判断是否有引用资源,再释放(释放空资源会抛异常);注意顺序
        if(rs!=null)try{rs.close();}catch(Exception e){e.printStackTrace();}
        if(stmt!=null)try{stmt.close();}catch(Exception e){e.printStackTrace();}
        if(conn!=null)try{conn.close();}catch(Exception e){e.printStackTrace();}
        //这些异常没法处理,处理只为方便调试。所以这些异常处理也只是打印。
        /*要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,
        因为ResultSet需要Statement和Connection连接时才可以用的;Statement也需要Connection才可用;
        结束Statement之后有可能其它的Statement还需要连接,因此不能先关闭Connection。ResultSet同理。*/
    步骤 1、2、6 每次都一样,可以重构。
       因为加载驱动是个一次性工作,所以可以采用静态初始化块来加载驱动;
       连接数据库的方法应该自己负责,获取数据库连接信息和驱动的信息,并处理相关异常;
       释放数据库资源的方法要考虑到ResultSet、Statement、Connection的不同情况,并处理相关异常。
       使用 preparedStatement 的例子:
/*************************************/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class test{
     public static void main(String[] args) {
            String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";
            String url = "jdbcdbc:URIAGE";
            String username = "root";
            String password = "root";
            Connection con = null;
            PreparedStatement stmt = null;
        try{
            Class.forName(driverName);
            con = DriverManager.getConnection(url,username,password);
            String query = "insert into tableName(col1,col2,col3) values (?,?,?)";
            stmt = con.prepareStatement(query);
            //在数组中增加数据
            String col1[] = {"10","20","30"};
            String col2[] = {"01","02","03"};
            int col3[] = {100,200,300};
            //添加数据
            for(int i=0; i<col1.length; i++){
                stmt.setString(1, col1);
                stmt.setString(2, col2);
                stmt.setInt(3, col3);
                stmt.executeUpdate();
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            if(stmt!=null)try{stmt.close();}catch(Exception e){e.printStackTrace();}
            if(con!=null)try{con.close();}catch(Exception e){e.printStackTrace();}
}}}
/*************************************/


科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

4

主题

0

听众

302

金钱

四袋长老

该用户从未签到

沙发
发表于 2016-09-26 15:56:06 |只看该作者
看看。学习学习。挺不错的
回复

使用道具 举报

2

主题

0

听众

107

金钱

三袋弟子

该用户从未签到

板凳
发表于 2016-10-21 18:56:17 |只看该作者
学习学习,感谢楼主
回复

使用道具 举报

gxyzm    

1

主题

0

听众

81

金钱

三袋弟子

该用户从未签到

地板
发表于 2016-10-28 17:28:03 |只看该作者
看看,挺不错的,感谢楼主
回复

使用道具 举报

1

主题

0

听众

133

金钱

三袋弟子

该用户从未签到

5#
发表于 2017-03-03 10:27:12 |只看该作者
谢谢楼主的分享!。。。
回复

使用道具 举报

1

主题

0

听众

72

金钱

二袋弟子

该用户从未签到

6#
发表于 2017-03-03 18:28:46 |只看该作者
写的很不错
回复

使用道具 举报

4

主题

0

听众

142

金钱

三袋弟子

该用户从未签到

7#
发表于 2017-04-28 18:05:54 |只看该作者
写的很好,赞一个
回复

使用道具 举报

5

主题

2

听众

214

金钱

三袋弟子

该用户从未签到

8#
发表于 2017-05-02 08:16:17 |只看该作者
学习了谢谢楼主
回复

使用道具 举报

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表