日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

數(shù)據(jù)持久化

數(shù)據(jù)持久化就是 將內(nèi)存中的數(shù)據(jù)模型轉(zhuǎn)換為存儲(chǔ)模型 ,以及 將存儲(chǔ)模型轉(zhuǎn)換為內(nèi)存中的數(shù)據(jù)模型 的統(tǒng)稱。數(shù)據(jù)模型可以是任何數(shù)據(jù)結(jié)構(gòu)或?qū)ο竽P?,存?chǔ)模型可以是關(guān)系模型、XML、二進(jìn)制流等。

瞬時(shí)狀態(tài)

保存在內(nèi)存的程序數(shù)據(jù),程序退出,數(shù)據(jù)就消失了

持久狀態(tài)

保存在磁盤上的程序數(shù)據(jù),程序退出后依然存在

數(shù)據(jù)持久化技術(shù)

Hibernate、JPA、==JDBC(JAVA Datebase Connectivity)==等

JDBC框架

Driver 接口

java.sql.Driver接口是所有 JDBC 驅(qū)動(dòng)程序需要實(shí)現(xiàn)的接口。這個(gè)接口是提供給數(shù)據(jù)庫(kù)廠商使用的,不同數(shù)據(jù)庫(kù)廠商提供不同的實(shí)現(xiàn)

在程序中不需要直接去訪問實(shí)現(xiàn)了 Driver 接口的類,而是由**驅(qū)動(dòng)程序管理器類(java.sql.DriverManager)**去調(diào)用這些Driver實(shí)現(xiàn)

連接、操作數(shù)據(jù)庫(kù)步驟

Connection conn = null; Statement st=null; ResultSet rs = null; try { //獲得Connection //創(chuàng)建Statement //處理查詢結(jié)果ResultSet }catch(Exception e){     e.printStackTrance(); } finally {    //釋放資源ResultSet, Statement,Connection }

一、獲取數(shù)據(jù)庫(kù)連接對(duì)象步驟

1、導(dǎo)入jar包

1、在項(xiàng)目中創(chuàng)建lib文件夾

2、將jar文件放置到lib文件夾

3、集成到項(xiàng)目中,右鍵build(eclipse)、add as library(idea)

2、注冊(cè)驅(qū)動(dòng)(Java代碼中加載驅(qū)動(dòng)類)

將com.MySQL.jdbc包下的Driver類的字節(jié)碼文件從本地磁盤加載到方法區(qū)中

==Oracle的驅(qū)動(dòng)==:
oracle.jdbc.driver.OracleDriver

==mySql的驅(qū)動(dòng)==: com.mysql.jdbc.Driver

方式一:加載 JDBC 驅(qū)動(dòng)需調(diào)用 Class 類的靜態(tài)方法 forName(),向其傳遞要加載的 JDBC 驅(qū)動(dòng)的類名

//將com.mysql.jdbc包下的Driver類的字節(jié)碼文件從本地磁盤加載到方法區(qū)中Class.forname("com.mysql.jdbc.Driver")

方式二:DriverManager 類是驅(qū)動(dòng)程序管理器類,負(fù)責(zé)管理驅(qū)動(dòng)程序

DriverManager.registerDriver(com.mysql.jdbc.Driver);

通常不用顯式調(diào)用 DriverManager 類的 registerDriver() 方法來注冊(cè)驅(qū)動(dòng)程序類的實(shí)例,原因:

1、該方法,過于依賴jar包的存在

2、該方法,會(huì)造成二次注冊(cè)

3、使用Class.forname可以降低耦合性

3、獲取連接對(duì)象

//本機(jī)IP:localhost 本機(jī)端口號(hào):3306String url = "jdbc:mysql://IP地址:端口號(hào)/庫(kù)名?serverTimezone=Asia/Shanghai&characterEncoding=utf-8";String user = "用戶名";String password = "密碼";Connection conn = DriverManager.getConnection(url,user,passWord);

協(xié)議:JDBC URL中的協(xié)議總是jdbc

子協(xié)議:子協(xié)議用于標(biāo)識(shí)一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序

子名稱:一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法。子名稱可以依不同的子協(xié)議而變化,用子名稱的目的是為 了定位數(shù)據(jù)庫(kù)提供足夠的信息。包含 主機(jī)名(對(duì)應(yīng)服務(wù)端的ip地址),端口號(hào),數(shù)據(jù)庫(kù)名

幾種常用數(shù)據(jù)庫(kù)的JDBC URL

對(duì)于 Oracle 數(shù)據(jù)庫(kù)連接,采用如下形式:

jdbc:oracle:thin:@localhost:1521:庫(kù)名

對(duì)于 SQLServer 數(shù)據(jù)庫(kù)連接,采用如下形式:

jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=庫(kù)名

對(duì)于 MYSQL 數(shù)據(jù)庫(kù)連接,采用如下形式:

jdbc:mysql://localhost:3306/庫(kù)名

二、執(zhí)行sql語句

1、獲取Statement對(duì)象

Statement statement = conn.createStatement();

2、執(zhí)行sql語句

int result = statement.executeUpdate("sql語句字符串對(duì)象")

Statement類方法分類

  • int executeUpdate(sql);
    • 針對(duì)數(shù)據(jù)庫(kù)的增(insert into)、刪(delete from)、改(update set)操作
    • 返回值類型:實(shí)際影響的行數(shù)
  • ResultSet executeQuery(sql);
    • 針對(duì)數(shù)據(jù)庫(kù)的查詢(select from)操作
    • 返回值類型:一個(gè)結(jié)果集類型
  • boolean execute(sql);
    • 針對(duì)數(shù)據(jù)庫(kù)的增刪改查操作,一般我們不會(huì)使用,jdbc的底層代碼會(huì)使用
    • 如果執(zhí)行的sql語句是增刪改,返回false
    • 如果執(zhí)行的sql語句是查詢,返回true

3、處理執(zhí)行結(jié)果(ResultSet)

//使用Statement類的方法ResultSet executeQuery(String sql);獲得結(jié)果集類型的對(duì)象ResultSet set = statement.executeQuery(sql);while(set.next()){    //形參可以直接寫字段名,字段名不區(qū)分大小寫    String id = set.getInt("book_id");    //也可以寫字段索引,索引從1開始    String id = set.getInt(1);    }

4、釋放資源

resultSet.close();statement.close();connection.close();

實(shí)現(xiàn)JDBC工具類

將獲取連接和關(guān)閉資源等公共、重復(fù)的代碼封裝成一個(gè)工具類

import java.sql.*;public class JDBCUtil {    private static String driver;    private static String url;    private static String user;    private static String passWord;    //解析配置文件.properties    static {        try {             Properties properties = new Properties();            properties.load(new FileInputStream(".properties文件路徑"));            driver = (String) properties.get("driver");            url = (String) properties.get("url");            user = (String) properties.get("user");            passWord = (String) properties.get("passWord");        }catch (Exception e){            e.printStackTrace();        }    }    //獲得Connection對(duì)象    public static Connection getConnection(){        Connection connection = null;        try{            Class.forName(driver);            connection = DriverManager.getConnection(url,user,passWord);        }catch (Exception e){            e.printStackTrace();        }        return connection;    }    //關(guān)閉資源 -- 針對(duì)查詢    public static void close(ResultSet resultset,Statement statement,Connection connection){        try {            if (resultset != null) {                resultset.close();            }            if (statement != null) {                statement.close();            }            if (connection != null) {                connection.close();            }        }catch (Exception e){            e.printStackTrace();        }    }    //關(guān)閉資源 -- 針對(duì)增刪改    public static void close(Statement statement,Connection connection){        close(null,statement,connection);    }    //針對(duì)DML語句--增刪改    public static boolean executeUpdate(String sql,List<Object> list){        Connection connection = getConnection();        PreparedStatement pre = null;        try {            pre = connection.prepareStatement(sql);            for (int i = 0;i < list.size();i++){                pre.setObject(i + 1,list.get(i));            }            return (pre.executeUpdate() > 0)? true : false;        }catch (Exception e){            e.printStackTrace();        }finally {            close(pre,connection);        }        return false;    }    //針對(duì)查DQL語句    public static <T> List<T> executeQuery(String sql,List<Object> list,Class<T> tClass){        Connection connection = getConnection();        PreparedStatement statement = null;        ResultSet resultSet = null;        List<T> li = new ArrayList<>();        try {            statement = connection.prepareStatement(sql);            for (int i = 0;i < list.size();i++){                statement.setObject(i + 1,list.get(i));            }            resultSet = statement.executeQuery();            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();            //獲取列數(shù)            int count = resultSetMetaData.getColumnCount();            //遍歷所有行            while (resultSet.next()){                T t = tClass.newInstance();                for (int i = 1;i <= count;i++){                    //獲取每一列列名                    String keyName = resultSetMetaData.getColumnLabel(i);                    //獲取每一列對(duì)應(yīng)的值                    Object value = resultSet.getObject(keyName);                    //T中對(duì)應(yīng)的屬性                    Field key = tClass.getDeclaredField(keyName);                    key.setAccessible(true);                    key.set(t,value);                }                li.add(t);            }        }catch (Exception e){            e.printStackTrace();        }finally {            close(connection,statement,resultSet);        }        return li;    }}

封裝查詢返回值遍歷方式

List<Map> list = JDBCUtils.executeQuery(sql,new ArrayList());for (Map<String,Object> map : list){    for (Map.Entry<String,Object> entry : map.entrySet()){        String s = entry.getKey();        Object o = entry.getValue();        System.out.print(s + "=" + o + ",");    }    System.out.println();}

sql注入攻擊

SQL 注入是利用某些系統(tǒng)沒有對(duì)用戶輸入的數(shù)據(jù)進(jìn)行充分的檢查,而在 用戶輸入數(shù)據(jù)中注入非法的 SQL 語句段或命令,如下,從而利用系統(tǒng)的 SQL 引擎完成惡意行為的做法。

SELECT user, password FROM user_table WHERE user='a' OR 1 = ' AND password = ' OR '1' = '1'

對(duì)于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement ( 繼承于Statement ) 取代 Statement 就可以了

PreparedStatement類

1、可以通過 調(diào)用 Connection 對(duì)象的 preparedStatement() 方法 獲取 PreparedStatement 對(duì)象

2、PreparedStatement 接口是 Statement 的子接口,它表示一條 預(yù)編譯 過的 SQL 語句

PreparedStatement類和Statement的比較

1、代碼的可讀性和可維護(hù)性

2、PreparedStatement 能最大可能提高性能

3、PreparedStatement 可以防止 SQL 注入

4、如果拼接表名、列名、關(guān)鍵字,必須使用Statement,防止sql語句錯(cuò)誤

ResultSet類

1、通過 調(diào)用 PreparedStatement 對(duì)象的 excuteQuery() 方法 創(chuàng)建該對(duì)象

2、代表結(jié)果集

3、ResultSet 返回的實(shí)際上就是一張數(shù)據(jù)表.,有一個(gè)指針指向數(shù)據(jù)表的第一條記錄的前面。

ResultSetMetaData 類

1、通過 調(diào)用ResultSet對(duì)象的getMetaData()方法 創(chuàng)建改對(duì)象

2、可用于 獲取關(guān)于 ResultSet 對(duì)象中列的類型和屬性信息的對(duì)象

常用方法

JDBC封裝Dao

**DAO (Data Access objects 數(shù)據(jù)存取對(duì)象)**是指位于業(yè)務(wù)邏輯和持久化數(shù)據(jù)之間實(shí)現(xiàn)對(duì)持久化數(shù)據(jù)的訪問。通俗來講,就是將數(shù)據(jù)庫(kù)操作都封裝起來。能夠是代碼的結(jié)構(gòu)更加清晰化。

DAO 模式組成

  1. DAO接口 : 把對(duì)數(shù)據(jù)庫(kù)的所有操作定義成抽象方法,可以提供多種實(shí)現(xiàn)。
  2. DAO 實(shí)現(xiàn)類 : 針對(duì)不同數(shù)據(jù)庫(kù)給出DAO接口定義方法的具體實(shí)現(xiàn)。
  3. 實(shí)體類 :用于存放與傳輸對(duì)象數(shù)據(jù)。
  4. 數(shù)據(jù)庫(kù)連接和關(guān)閉工具類 : 避免了數(shù)據(jù)庫(kù)連接和關(guān)閉代碼的重復(fù)使用,方便修改

分享到:
標(biāo)簽:數(shù)據(jù)庫(kù)
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定