亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

數據持久化

數據持久化就是 將內存中的數據模型轉換為存儲模型 ,以及 將存儲模型轉換為內存中的數據模型 的統稱。數據模型可以是任何數據結構或對象模型,存儲模型可以是關系模型、XML、二進制流等。

瞬時狀態

保存在內存的程序數據,程序退出,數據就消失了

持久狀態

保存在磁盤上的程序數據,程序退出后依然存在

數據持久化技術

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

JDBC框架

Driver 接口

java.sql.Driver接口是所有 JDBC 驅動程序需要實現的接口。這個接口是提供給數據庫廠商使用的,不同數據庫廠商提供不同的實現

在程序中不需要直接去訪問實現了 Driver 接口的類,而是由**驅動程序管理器類(java.sql.DriverManager)**去調用這些Driver實現

連接、操作數據庫步驟

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

一、獲取數據庫連接對象步驟

1、導入jar包

1、在項目中創建lib文件夾

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

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

2、注冊驅動(Java代碼中加載驅動類)

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

==Oracle的驅動==:
oracle.jdbc.driver.OracleDriver

==mySql的驅動==: com.mysql.jdbc.Driver

方式一:加載 JDBC 驅動需調用 Class 類的靜態方法 forName(),向其傳遞要加載的 JDBC 驅動的類名

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

方式二:DriverManager 類是驅動程序管理器類,負責管理驅動程序

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

通常不用顯式調用 DriverManager 類的 registerDriver() 方法來注冊驅動程序類的實例,原因:

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

2、該方法,會造成二次注冊

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

3、獲取連接對象

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

協議:JDBC URL中的協議總是jdbc

子協議:子協議用于標識一個數據庫驅動程序

子名稱:一種標識數據庫的方法。子名稱可以依不同的子協議而變化,用子名稱的目的是為 了定位數據庫提供足夠的信息。包含 主機名(對應服務端的ip地址),端口號,數據庫名

幾種常用數據庫的JDBC URL

對于 Oracle 數據庫連接,采用如下形式:

jdbc:oracle:thin:@localhost:1521:庫名

對于 SQLServer 數據庫連接,采用如下形式:

jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=庫名

對于 MYSQL 數據庫連接,采用如下形式:

jdbc:mysql://localhost:3306/庫名

二、執行sql語句

1、獲取Statement對象

Statement statement = conn.createStatement();

2、執行sql語句

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

Statement類方法分類

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

3、處理執行結果(ResultSet)

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

4、釋放資源

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

實現JDBC工具類

將獲取連接和關閉資源等公共、重復的代碼封裝成一個工具類

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對象    public static Connection getConnection(){        Connection connection = null;        try{            Class.forName(driver);            connection = DriverManager.getConnection(url,user,passWord);        }catch (Exception e){            e.printStackTrace();        }        return connection;    }    //關閉資源 -- 針對查詢    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();        }    }    //關閉資源 -- 針對增刪改    public static void close(Statement statement,Connection connection){        close(null,statement,connection);    }    //針對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;    }    //針對查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();            //獲取列數            int count = resultSetMetaData.getColumnCount();            //遍歷所有行            while (resultSet.next()){                T t = tClass.newInstance();                for (int i = 1;i <= count;i++){                    //獲取每一列列名                    String keyName = resultSetMetaData.getColumnLabel(i);                    //獲取每一列對應的值                    Object value = resultSet.getObject(keyName);                    //T中對應的屬性                    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 注入是利用某些系統沒有對用戶輸入的數據進行充分的檢查,而在 用戶輸入數據中注入非法的 SQL 語句段或命令,如下,從而利用系統的 SQL 引擎完成惡意行為的做法。

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

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

PreparedStatement類

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

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

PreparedStatement類和Statement的比較

1、代碼的可讀性和可維護性

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

3、PreparedStatement 可以防止 SQL 注入

4、如果拼接表名、列名、關鍵字,必須使用Statement,防止sql語句錯誤

ResultSet類

1、通過 調用 PreparedStatement 對象的 excuteQuery() 方法 創建該對象

2、代表結果集

3、ResultSet 返回的實際上就是一張數據表.,有一個指針指向數據表的第一條記錄的前面。

ResultSetMetaData 類

1、通過 調用ResultSet對象的getMetaData()方法 創建改對象

2、可用于 獲取關于 ResultSet 對象中列的類型和屬性信息的對象

常用方法

JDBC封裝Dao

**DAO (Data Access objects 數據存取對象)**是指位于業務邏輯和持久化數據之間實現對持久化數據的訪問。通俗來講,就是將數據庫操作都封裝起來。能夠是代碼的結構更加清晰化。

DAO 模式組成

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

分享到:
標簽:數據庫
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定