029 JDBC 開發(fā)

博客地址:http://blog.csdn.net/heyiaiqing/article/details/74091637

1. 開發(fā)流程

// 注冊了兩次驅動程序,造成浪費彤灶,推薦使用反射
// DriverManager.registerDriver(new Driver());
// new Driver();
// 1. 注冊JDBC的驅動
Class.forName("com.mysql.jdbc.Driver");

// 2. 獲得數(shù)據(jù)庫連接枫攀,DriverManager類中的靜態(tài)方法
String url = "jdbc:mysql://localhost:3306/luoDatabase";
String userName = "Luo";
String password = "lingli520";
Connection connection = DriverManager.getConnection(url, userName, password);
System.out.println(connection);     // 返回的該接口的實現(xiàn)類

// 3. 獲得語句執(zhí)行平臺,通過數(shù)據(jù)庫連接對象蘸秘,獲取到SQL語句的執(zhí)行者對象
Statement statement = connection.createStatement();

// 4. 執(zhí)行SQL語句
statement.executeUpdate("INSERT INTO users(uId, uName,uAddress) VALUES (10,'luo','江西'),(11,'wangge','江西2'),(12,'Luo','江西3'),(13,'Luo_Luo','江西4');");

// 5. 結果處理

// 6. 釋放一堆資源
statement.close();  // 釋放執(zhí)行者對象
connection.close(); // 釋放連接對象

2. 查詢

// 查詢數(shù)據(jù)
ResultSet resultSet = statement.executeQuery("SELECT * FROM users;");

// 5. 結果處理
while (resultSet.next()) {
    System.out.println(resultSet.getInt("uId") + "\t" + resultSet.getString("uName") + "\t" + resultSet.getString("uAddress"));
}

// 6. 釋放一堆資源
resultSet.close();

3. SQL注入攻擊案例

statement.executeQuery("SELECT * FROM users where uName = '" + name + "' AND uPassword = '" + pwd + "';");
// 這個時候只需要輸入pwd的時候注入一些SQL代碼就能達到SQL注入攻擊的目的

4. 防止注入攻擊(采用占位符?)

采用PreparedStatement(實現(xiàn)SQL的預編譯,多次高效執(zhí)行SQL語句)

statement.executeQuery("SELECT * FROM users where uName = ? AND uPassword = ?;");

5. 工具類

public class JdbcUtils {
    private static Connection con;

    private JdbcUtils() {
    }

    static {
        try {
            // 1. 添加MySql驅動
            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://localhost:3306/luoDatabase";
            String userName = "Luo";
            String password = "lingli520";

            // 2. 獲取一個連接
            con = DriverManager.getConnection(url, userName, password);

        } catch (ClassNotFoundException | SQLException e) {
            throw new RuntimeException(e + "連接失敗");
        }

    }

    /**
     * 發(fā)起獲得一個連接
     *
     * @return 返回數(shù)據(jù)庫連接
     */
    public static Connection getConnection() {
        return con;
    }

    /**
     * 關閉資源類
     *
     * @param con   數(shù)據(jù)庫連接對象
     * @param state state
     * @param rs    結果集
     */
    public static void close(Connection con, Statement state, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (state != null) {
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

6. 配置文件的設置

# 1. 配置文件放在bin目錄下
# 2. 配置文件名字以properties為擴展名(database.properties)
# 3. 數(shù)據(jù)以鍵值對的形式存儲

7. 讀取配置文件的工具類

/*
 *  編寫數(shù)據(jù)庫連接的工具類,JDBC工具類
 *  獲取連接對象采用讀取配置文件方式
 *  讀取文件獲取連接,執(zhí)行一次,static{}
 */
public class JDBCUtilsConfig {
    private static Connection con ;
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;
    
    static{
        try{
            readConfig();
            Class.forName(driverClass);
            con = DriverManager.getConnection(url, username, password);
        }catch(Exception ex){
            throw new RuntimeException("數(shù)據(jù)庫連接失敗");
        }
    }
    
    private static void readConfig()throws Exception{
        InputStream in = JDBCUtilsConfig.class.getClassLoader().getResourceAsStream("database.properties");
         Properties pro = new Properties();
         pro.load(in);
         driverClass=pro.getProperty("driverClass");
         url = pro.getProperty("url");
         username = pro.getProperty("username");
         password = pro.getProperty("password");
    }
    
    /**
     * 獲取數(shù)據(jù)庫的連接對象
     */
    public static Connection getConnection(){
        return con;
    }
    
    /**
     * 關閉資源類
     *
     * @param con   數(shù)據(jù)庫連接對象
     * @param state state
     * @param rs    結果集
     */
    public static void close(Connection con, Statement state, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (state != null) {
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

總結

JDBC的代碼冗余很多膀曾,因此下一篇將介紹簡化版的Apache的DBUtils.
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晶框,一起剝皮案震驚了整個濱河市拐纱,隨后出現(xiàn)的幾起案子于毙,更是在濱河造成了極大的恐慌,老刑警劉巖搬泥,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桑寨,死亡現(xiàn)場離奇詭異,居然都是意外死亡忿檩,警方通過查閱死者的電腦和手機尉尾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來燥透,“玉大人沙咏,你說我怎么就攤上這事辨图。” “怎么了肢藐?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵故河,是天一觀的道長。 經(jīng)常有香客問我吆豹,道長鱼的,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任痘煤,我火速辦了婚禮凑阶,結果婚禮上,老公的妹妹穿的比我還像新娘速勇。我一直安慰自己晌砾,他們只是感情好坎拐,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布烦磁。 她就那樣靜靜地躺著,像睡著了一般哼勇。 火紅的嫁衣襯著肌膚如雪都伪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天积担,我揣著相機與錄音陨晶,去河邊找鬼。 笑死帝璧,一個胖子當著我的面吹牛先誉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播的烁,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼褐耳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渴庆?” 一聲冷哼從身側響起铃芦,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎襟雷,沒想到半個月后刃滓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡耸弄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年咧虎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片计呈。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡砰诵,死狀恐怖僚饭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胧砰,我是刑警寧澤鳍鸵,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站尉间,受9級特大地震影響偿乖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜哲嘲,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一贪薪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眠副,春花似錦画切、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娃弓,卻和暖如春典格,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背台丛。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工耍缴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挽霉。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓防嗡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侠坎。 傳聞我的和親對象是個殘疾皇子蚁趁,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評論 25 707
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • 轉自:http://blog.csdn.net/jackfrued/article/details/4493116...
    王帥199207閱讀 2,399評論 0 19
  • 水陸草木之花,可愛者甚蕃硅蹦。晉陶淵明獨愛菊荣德。自李唐來,世人甚愛牡丹童芹。予獨愛蓮之出淤泥而不染涮瞻,濯清漣而不妖,中通外直假褪,...
    香齋主人閱讀 740評論 0 0
  • 一個人的時候不怕孤獨署咽,兩個人的時候不怕辜負。 無論一個人還是兩個人,只要心態(tài)好宁否,那就是一種幸福窒升。 你來了更好,沒來...
    篤學青衿閱讀 148評論 0 0