JDBC入门学习

JDBC学习

JAVA Database Connectivity java 数据库连接

  • 为什么会出现JDBC

SUN公司提供的一种数据库访问规则、规范, 由于数据库种类较多,并且java语言使用比较广泛,sun公司就提供了一种规范,让其他的数据库提供商去实现底层的访问规则。 我们的java程序只要使用sun公司提供的jdbc驱动即可。

JDBC的步骤

  1. load the driver

    此时的意思是向DriverManager注册驱动

     try {
         Class.forName(driverClass);
     }
     catch(ClassNotFoundException e) {
         e.printStackTrace();
     }
    

    forName() throws ClassNotFoundException

    driverClass为相应的驱动类 eg:Oracle.jdbc.driver.OracleDriver

  1. connect to database

     try {
         conn = DriverManager.getConnection(url,user,password);
     }
     catch(SQLException e) {
         e.printStackTrace();
     }
    

    getConnection()方法抛出SQLException

  2. execute sql statement

     Statement stmt = null;
     
     stmt = conn.createStatement();
         
     String sql = "select * from dept";
     rs = stmt.executeQuery(sql);
    
  3. retrieve the data

     int deptno = 0;
     String dname = null;
     String loc = null;
         
     while(rs.next()) {
         deptno = rs.getInt("deptno");
         dname = rs.getString("dname");
         loc = rs.getString("loc");
         System.out.println("deptno = " + deptno +"  dname = " + dname + " loc = " + loc);
     }
    
  4. close the resource

     rs.close();
     stmt.close();
     conn.close();
    
  5. 程序整体

     public static void main(String[] args) {
         Connection connection = null;
         Statement statement = null;
         ResultSet result = null;
         
         try {
             //注册驱动
             Class.forName("com.mysql.jdbc.Driver");
             
             //建立连接
             connection = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "root");
             
             //创建语句
             statement = connection.createStatement();
             
             //执行查询,得到结果集
             String sql = "select * from t_stu";
             result = statement.executeQuery(sql);
             
             //遍历结果集
             while(result.next()) {
                 int id = result.getInt("id");
                 String name = result.getString("name");
                 int age = result.getInt("age");
                 
                 System.out.println("id = " + id + " name = " + name + " age = " + age);          
             }
         }catch(ClassNotFoundException e) {
             e.printStackTrace();
         } catch(SQLException e) {
             e.printStackTrace();
         } finally {
             JDBCUtil.closeResource(connection, statement, result);
         }           
     }
    

JDBC工具类的创建

因为有关JDBC的操作中经常性的会用到以上步骤,所以最好是写入包装类,等到使用时直接添加即可

工具类名称:JDBCUtil

  1. 配置文件的生成--new file--jdbc.properties

    需要的类有:java.util.Properities

    driverClass = com.mysql.jdbc.Driver
    url = jdbc:mysql://localhost/student
    user = root
    password = root
    
  2. 配置文件的使用

    static中使用

    static {
    //创建属性配置对象
    Properties properties = new Properties();

    //使用类加载器,读取src底下的资源文件
    InputStream iStream = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
        
    //导入输入流:
    try {
        properties.load(iStream);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    //读取属性
    driverClass = properties.getProperty("driverClass");
    url = properties.getProperty(url);
    name = properties.getProperty(name);
    password = properties.getProperty(password);
    

    }

  3. 将 load the driver 和 Connect to database 合并为getConne()方法

    public static Connection getConn() {
        Connection conn = null;
    
        //--load the driver
        try {
            Class.forName(driverClass);
        }
        catch(ClassNotFoundException e) {
            e.printStackTrace();
        }
        
        //--connect to database;
    
        try {
            conn = DriverManager.getConnection(url,user,password);
        }
        catch(SQLException e) {
            e.printStackTrace();
        }
        
        return conn;
}   
  1. 添加closeResource()方法

    主程序中finally中之执行closeResource()方法,进行资源释放

    public static void closeResource(ResultSet rs,Statement stmt,Connection conn){
        closeRs(rs);
        closeStmt(stmt);
        closeConn(conn);
    }
    
    public static void closeResource(PreparedStatement pstmt,Connection conn){
        closeStmt(pstmt);  //preparedStatement是statement的一个子类
        closeConn(conn);
    

    }

    static void closeRs(ResultSet rs) {
        try {
            if(rs != null)
                rs.close();         
        }
        catch(SQLException e) {
            e.printStackTrace();
        }
        finally {
            rs = null;
        }
    }
    
    static void closeStmt(Statement stmt) {
        try {
            if(stmt != null)
                stmt.close();
        }
        catch(SQLException e) {
            e.printStackTrace();
        }
        finally {
            stmt = null;
        }
    }
    
    static void closeConn(Connection conn) {
        try {
            if(conn != null)
                conn.close();
        }
        catch(SQLException e) {
            e.printStackTrace();
        }
        finally {
            conn = null;
        }
    }
    

    此时注意方法的重载

JDBC的DML使用

  1. 预备知识

    JUnit的使用:

    ①添加Junit的lib
    ②new Junit Test Case

  1. testQuery()
    --测试查询

     public void testQuery() {
         Connection conn = JDBCUtil.getConn();       
         Statement stmt = null;
         ResultSet rs = null;
     
         
         try {
             //execute sql statement
             stmt = conn.createStatement();
             
             String sql = "select * from dept";
             rs = stmt.executeQuery(sql);
    
             /*
                 注意:executeQuery()返回的是ResultSet
              */
             
             
             //retrieve the data             
             int deptno = 0;
             String dname = null;
             String loc = null;
             
             while(rs.next()) {
                 deptno = rs.getInt("deptno");
                 dname = rs.getString("dname");
                 loc = rs.getString("loc");
                 System.out.println("deptno = " + deptno +"  dname = " + dname + " loc = " + loc);
             }
             
         } catch (SQLException e) {
             e.printStackTrace();
         } finally {
             //close the resource
             JDBCUtil.closeResource(rs, stmt, conn);
         }       
     }
    
  2. testInsert()

     public void testInsert() {
         Connection conn = JDBCUtil.getConn();       
         Statement stmt = null;
    
         try {
             //execute sql statement
             stmt = conn.createStatement();
             
             String sql = "insert into dept values(50,'What','Shanxi')";
             int result = stmt.executeUpdate(sql);
             
             if(result == 0) {
                 System.out.println("添加失败");
             }
             else {
                 System.out.println("添加成功");
             }
         }catch(SQLException e) {
             e.printStackTrace();
         }finally {
             JDBCUtil.closeResource(stmt, conn);
         }
     }
    
  3. testInsert_2()--使用preparedStatement

     public void testInsert_2() {
         Connection conn = JDBCUtil.getConn();       
         PreparedStatement prestmt = null;
    
         try {
             //execute sql statement
             prestmt = conn.prepareStatement("insert into dept values(?,?,?)");
             prestmt.setInt(1, 55);
             prestmt.setString(2,"hahahaha");
             prestmt.setString(3, "henan");
             int result = prestmt.executeUpdate();   
             
             if(result == 0) {
                 System.out.println("添加失败");
             }
             else {
                 System.out.println("添加成功");
             }
             
         }catch(SQLException e) {
             e.printStackTrace();
         }finally {
             JDBCUtil.closeResource(prestmt, conn);   //此时运用到多态
         }
     }   
    
  4. testDelete()

    public void testDelete() {
        Connection conn = JDBCUtil.getConn();       
        Statement stmt = null;
    
        try {
            //execute sql statement
            stmt = conn.createStatement();
            
            String sql = "delete from dept where deptno = 55";
            int result = stmt.executeUpdate(sql);
            
            if(result == 0) {
                System.out.println("删除失败");
            }
            else {
                System.out.println("删除成功");
            }
        }catch(SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.closeResource(stmt, conn);
        }
    }
    
  5. testUpdate()

     @Test
     public void testUpdate() {
         Connection conn = JDBCUtil.getConn();       
         Statement stmt = null;
    
         try {
             //execute sql statement
             stmt = conn.createStatement();
             
             String sql = "update dept set dname = 'xixixixi' where deptno = 55";
             int result = stmt.executeUpdate(sql);
             
             if(result == 0) {
                 System.out.println("更新失败");
             }
             else {
                 System.out.println("更新成功");
             }
         }catch(SQLException e) {
             e.printStackTrace();
         }finally {
             JDBCUtil.closeResource(stmt, conn);
         }
     }
    

DAO模式

Data Access Object 访问数据对象

可以实现业务逻辑与数据库访问相分离


一般的DAO的封装由以下另个原则:

  1. 一个表对应一个dao接口,对应一个相应实现类。

  2. 对于DAO接口,必须由具体的类型定义。这样可以避免被错误地调用


一般步骤

  1. 创建相关表的接口--new Interface--DeptDao--此时例子是对dept表进行操作

    里面封装相应对于此表的操作:eg: query,delete,update,insert

     package com.anna.dao;
    
     public interface DeptDao {
         //查询所有
         public void findAll();  
     }
    
  2. 创建接口的实现类--一般与接口在不同包中

    ----继承接口

    ----实现接口中的抽象方法

     public class DeptDaoImpl implements DeptDao{
     
         public void findAll() {
    
             //Connect to database
             Connection conn = JDBCUtil.getConn();
             
             //execute sql statement
             Statement stmt= null;
             ResultSet rs = null;
             
             try {
                  stmt = conn.createStatement();
                  
                  String sql = "select * from dept";
                  rs = stmt.executeQuery(sql);
                  
                  while(rs.next()) {
                      int deptno = rs.getInt("deptno");
                      String dname = rs.getString("dname");
                      String loc = rs.getString("loc");
                      
                      System.out.println("deptno = " + deptno + "  dname = " + dname + "  loc = " + loc + "\n");
                  }
             }
             catch(SQLException e) {
                 e.printStackTrace();
             }finally {
                 JDBCUtil.closeResource(stmt,conn);
             }
         }
     }
    
  3. 利用JUnit测试相关方法

     public class TestDeptDaoImpl {
         
         @Test
         public void testFindAll() {
             DeptDao dd = new DeptDaoImpl();   //接口引用指向实现类
             dd.findAll();
         }
     }
    

Statement的安全问题

  1. Statement执行 ,拼接sql语句的。 先拼接sql语句,然后在一起执行。

    ---此时可能会导致错误

PreparedStatement的学习

由于statement本身存在的问题,引出了PreparedStatement

//execute sql statement
    PreparedStatement pstmt= null;      
    ResultSet rs = null;
    
    try {
         String sql = "select * from dept where deptno = ? and dname = ? and loc = ?"; 
         pstmt = conn.prepareStatement(sql);
         pstmt.setInt(1, deptno);
         pstmt.setString(2,dname);
         pstmt.setString(3,loc);
         
         rs = pstmt.executeQuery();          
         if(rs.next()) {
             System.out.println("验证成功");
         }
         else {
             System.out.println("验证失败");
         }
    }
    catch(SQLException e) {
        e.printStackTrace();
    }finally {
        JDBCUtil.closeResource(pstmt,conn);
    }

总结

  1. JDBC的学习

  2. JDBC工具类的创建

  3. JDBC的DML的实现

  4. DAO模式的了解

  5. PreparedStatement的学习

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容