首頁  >  文章  >  Java  >  有關JDBC的簡單實例分享

有關JDBC的簡單實例分享

巴扎黑
巴扎黑原創
2017-07-17 16:13:391556瀏覽

前言:安裝好資料庫之後,我們寫的java程式是無法直接使用資料庫的,而JDBC(Java Database Connectivity,即java資料庫連線)是java語言裡用來規範客戶端程式存取資料庫的API,有了它,我們就可以向各種關係型資料庫發送SQL語句,從而實現對資料庫的增刪改查等操作。

準備工作:

1.資料庫:這裡以MySQL為例,建立一個Person表,四個欄位分別為:自增主鍵id、姓名name、性別gender、年齡age

 1 DROP TABLE IF EXISTS `person`; 2 CREATE TABLE `person` ( 3   `id` int(11) NOT NULL AUTO_INCREMENT, 4   `name` varchar(11) DEFAULT NULL, 5   `gender` varchar(11) DEFAULT NULL, 6   `age` int(11) DEFAULT NULL, 7   PRIMARY KEY (`id`) 8 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 9 10 INSERT INTO `person` VALUES ('1', '小明', '男', '18');11 INSERT INTO `person` VALUES ('2', '小芳', '女', '19');12 INSERT INTO `person` VALUES ('3', '小刚', '男', '20');13 INSERT INTO `person` VALUES ('4', '小丽', '女', '21');

 

2.資料庫驅動程式jar套件:這裡使用的是mysql-connector-java-5.1.42-bin.jar

#3 .在eclipse中導入驅動包:右鍵項目點擊Builder Path----Configure Builder Path----Add External JARs----找到jar包位置選擇打開----Ok,可以開始搞事情了!

圖示如下:

先完整示範一段簡單的JDBC操作流程。

 

 1 package com.jdbc.demo; 2  3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8  9 //一段完整的jdbc操作过程,后面会详细介绍,为了代码视图简洁,异常均抛出。10 public class Demo {11     12     public static void main(String[] args) throws ClassNotFoundException, SQLException {13         //第1步,注册加载驱动类14         Class.forName("com.mysql.jdbc.Driver");15         //第2步,获取数据库连接,方法中3个参数依次为:16         //url:就是你要连接的数据库的地址,不同的数据库格式会有差异17         //user:就是数据库的用户名,例如MySQL的root18         //password:数据库连接密码19         String url = "jdbc:mysql://127.0.0.1/hb?characterEncoding=utf-8";20         String user = "root";21         String password = "123123";22         Connection conn = DriverManager.getConnection(url, user, password);23         //第3步,构造语句集对象,为了简要直观,这里使用Statement,不过实际开发建议用PreparedStatement24         String sql = "select * from person";25         Statement stmt = conn.createStatement();26         //第4步,提交SQL语句,这是是查询,所以调用executeQuery方法,会返回一个集合,我们可以遍历输出其中信息;27         //如果是增删改,不同于数据库中的3种SQL语句,这里都是调用executeUpdate方法,返回的是int值28         ResultSet rs = stmt.executeQuery(sql);29         //第5步(可选),处理结果,在这里我们输出Person表中所有人名30         while(rs.next()) {31             String name = rs.getString("name");32             System.out.println(name);33         }34         //第6步,关闭相关对象,这里为ResultSet,Statement,Connection35         //注意!关闭顺序和声明顺序相反!依次如下36         rs.close();37         stmt.close();38         conn.close();39         40     }41 42 }

程式運作結果如下:

 相關API介紹

java. sql.Connection:

  與資料庫的連接,注意導包不要導錯,因為導入MySQL驅動後,在com.mysql.jdbc下也有個Connection,如果導成這個會出錯;

  連線由JDBC管理階層的DriverManager類別呼叫getConnection方法取得,方法中後兩個參數較簡單,一個使用者名稱一個密碼,第一個參數url格式則與各資料庫有關

  # MySQL: jdbc:mysql://<:port>/,預設連接埠3306,如果伺服器使用預設連接埠port可以省略,可以在URL中新增額外的連線屬性jdbc :mysql://:/?property1=value1&property2=value2;

    ORACLE:bc:oracle:thinc:oracle:thin:< ;<:port>:

java,sql.Statement 和java.sql.PreparedStatement

  語句對象,用於提交SQL語句;

##  Statement通常用於執行靜態SQL語句,statement.excute(sql)即可提交;

  PreparedStatement可以執行動態SQL語句,允許參數化查詢,而且效能更好,還可以有效避免SQL注入式攻擊,後面範例都使用PreparedStatement

  

 

java.sql.ResultSet:

  指定SQL語句(通常為查詢)執行傳回的原始結果集,在實際開發我們通常會重新封裝結果,以便於呼叫

#實體類別Person

 

 1 package com.jdbc.entity; 2 //实体类Person,属性与数据库中字段对应 3 public class Person { 4     private Integer id; 5     private String name; 6     private String gender; 7     private Integer age; 8     public Integer getId() { 9         return id;10     }11     public void setId(Integer id) {12         this.id = id;13     }14     public String getName() {15         return name;16     }17     public void setName(String name) {18         this.name = name;19     }20     public String getGender() {21         return gender;22     }23     public void setGender(String gender) {24         this.gender = gender;25     }26     public Integer getAge() {27         return age;28     }29     public void setAge(Integer age) {30         this.age = age;31     }32     @Override33     public String toString() {34         return "Person [id=" + id + ", name=" + name + ", gender=" + gender35                 + ", age=" + age + "]";36     }37     38 }
 

#JdbcUtil工具類別供載入驅動類別、取得連線、關閉物件

package com.jdbc.demo;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JdbcUtil {private static String driver = "com.mysql.jdbc.Driver";private static String url = "jdbc:mysql://127.0.0.1/hb?characterEncoding=utf-8";private static String username = "root";private static String password = "hjh123";//静态代码块中注册加载驱动类static {try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }//封装获取连接方法public static Connection getConnection() {try {return DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }return null;
    }//封装关闭对象方法public static void close(ResultSet rs, Statement statement, Connection conn) {if (rs != null) {try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }if (statement != null) {try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }if (conn != null) {try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    
}

簡易封裝一個DAO類別實作Person表的增刪改查

 

  1 package com.jdbc.demo;  2   3 import java.sql.Connection;  4 import java.sql.PreparedStatement;  5 import java.sql.ResultSet;  6 import java.sql.SQLException;  7 import java.util.ArrayList;  8 import java.util.List;  9  10 import com.jdbc.entity.Person; 11  12  13 //封装Person表的增删改查方法 14 public class PersonDaoImpl { 15     //这里的问号?是占位符,用于给将要传递的参数占位置,实现了动态SQL语句的执行 16     //添加一条记录的SQL语句,第一个参数由于数据表中是主键自增,这里可以用null 17     private static final String SQL_ADD = "insert into person values(null,?,?,?)"; 18     //删除,指定id的记录 19     private static final String SQL_DEL = "delete from person where id = ?"; 20     //修改,指定id的记录 21     private static final String SQL_UPD = "update person set name = ?,gender = ?,age = ? where id = ?"; 22     //查询,指定id记录 23     private static final String SQL_ID = "select * from person where id = ?"; 24     //查询,所有记录 25     private static final String SQL_ALL = "select * from person"; 26      27     //添加一条记录 28     public boolean add(Person p) { 29         Connection conn = JdbcUtil.getConnection(); 30         PreparedStatement ps = null; 31         try { 32             ps = conn.prepareStatement(SQL_ADD); 33             //把我们传入的person对象的属性值分作为占位符的值传入,数组各值顺序对应占位符字段顺序 34             Object[] params = {p.getName(),p.getGender(),p.getAge()}; 35             int len = params.length; 36             for(int i = 0;i < len;i++) { 37                 //!!!这里比较特殊,很多下标都是从0开始,例如数组, 38                 //!!!但是这个setObject方法第一个索引参数是从1开始 39                 ps.setObject(i+1, params[i]); 40             } 41             //这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数 42             //之前的Statement.excute方法要传入SQL语句字符串参数, 43             //但是用了PreparedStatement就不用传参数了,因为在前面我们已经预定义处理了 44             int line = ps.executeUpdate(); 45             if (line > 0) { 46                 System.out.println("添加成功,受影响记录数为"+line); 47                 return true;//结束,但是后面finally区代码会执行 48             } 49         } catch (SQLException e) { 50             e.printStackTrace(); 51         } finally { 52             //关闭相关对象 53             JdbcUtil.close(null, ps, conn); 54         } 55         System.out.println("添加失败"); 56         return false; 57     } 58     //删除一条记录 59     public boolean delete(int id) { 60         Connection conn = JdbcUtil.getConnection(); 61         PreparedStatement ps = null; 62         try { 63             ps = conn.prepareStatement(SQL_DEL); 64             ps.setInt(1, id); 65             //这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数 66             int line = ps.executeUpdate(); 67             if (line > 0) { 68                 System.out.println("删除成功,受影响记录数为"+line); 69                 return true;//结束,但是后面finally区代码会执行 70             } 71         } catch (SQLException e) { 72             e.printStackTrace(); 73         } finally { 74             //关闭相关对象 75             JdbcUtil.close(null, ps, conn); 76         } 77         System.out.println("删除失败"); 78         return false; 79     } 80     //修改一条记录 81     public boolean update(Person p) { 82         Connection conn = JdbcUtil.getConnection(); 83         PreparedStatement ps = null; 84         try { 85             ps = conn.prepareStatement(SQL_UPD); 86             //把我们传入的person对象的属性值分作为占位符的值传入 87             Object[] params = {p.getName(),p.getGender(),p.getAge(),p.getId()}; 88             int len = params.length; 89             for(int i = 0;i < len;i++) { 90                 //!!!这里比较特殊,很多下标都是从0开始,例如数组, 91                 //!!!但是这个setObject方法第一个索引参数是从1开始 92                 ps.setObject(i+1, params[i]); 93             } 94             //这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数 95             int line = ps.executeUpdate(); 96             if (line > 0) { 97                 System.out.println("修改成功,受影响记录数为"+line); 98                 return true;//结束,但是后面finally区代码会执行 99             }100         } catch (SQLException e) {101             e.printStackTrace();102         } finally {103             //关闭相关对象104             JdbcUtil.close(null, ps, conn);105         }106         System.out.println("修改失败");107         return false;108     }109     //获取一条记录,这里返回的不再是布尔值,而是一个对应数据表中一条记录的Person对象110     public Person findById(int id) {111         Connection conn = JdbcUtil.getConnection();112         PreparedStatement ps = null;113         ResultSet rs = null;114         try {115             ps = conn.prepareStatement(SQL_ID);116             ps.setInt(1, id);117             //返回结果集,这里是查询指定id,所以结果集中应该最多只有一条记录118             rs = ps.executeQuery();119             if(rs.next()) {120                 Person p = new Person();121                 p.setId(id);122                 //这里的Result的getObject方法,参数为数据表中字段名,可以获取对应字段值123                 p.setName(rs.getString("name"));124                 p.setGender(rs.getString("gender"));125                 p.setAge(rs.getInt("age"));126                 return p;//返回p对象,结束127             }128         } catch (SQLException e) {129             e.printStackTrace();130         } finally {131             //关闭相关对象132             JdbcUtil.close(rs, ps, conn);133         }134         return null;135     }136     //获取所有记录,返回结果集不便操作,故封装到一个List中作为方法返回值137         public List<Person> findAll() {138             Connection conn = JdbcUtil.getConnection();139             PreparedStatement ps = null;140             ResultSet rs = null;141             List<Person> list = new ArrayList<>();142             try {143                 ps = conn.prepareStatement(SQL_ALL);144                 //返回结果集145                 rs = ps.executeQuery();146                 while(rs.next()) {147                     //创建一个Person对象148                     Person p = new Person();149                     //这里的Result的getObject方法,参数为数据表中字段名,可以获取对应字段值150                     p.setId(rs.getInt("id"));151                     p.setName(rs.getString("name"));152                     p.setGender(rs.getString("gender"));153                     p.setAge(rs.getInt("age"));154                     list.add(p);//添加至集合155                 }156                 return list;157             } catch (SQLException e) {158                 e.printStackTrace();159             } finally {160                 //关闭相关对象161                 JdbcUtil.close(rs, ps, conn);162             }163             return null;164         }165 }

 小結

JDBC作業資料庫步驟概述如下:

1.註冊載入驅動類別

2.取得連接######3.建立語句物件######4.執行SQL語句(excute)######5(可選).處理結果######6.關閉相關物件(注意順序:依序為ResultSet、Statement/PreparedStatement、Connction)#############上述過程能基本完整實作對一個資料表的操作,但是只能針對固定的單一資料表,利用泛型、反射等技術,可對dao層程式碼進行抽取與封裝,並加入SQL語句實現聯表查詢,使得程式更具通用性和靈活性,對任意的資料表都適用。在實際開發過程中,有框架已經封裝了JDBC,如hibernate和mybatis,可以透過底層的JDBC操作進一步學習。 ###

以上是有關JDBC的簡單實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn