jdbc,orm映射、DAO模式、連接池

JDBC:Java Database connection
Java定義了一套接口沒有實現類
導jar包:jar包的本質就是一個壓縮包,java發明的一種壓縮格式 導入導出的機制
手動到jar包:
建lib文件:粘貼複製進去 lib包 --點擊modules查看jar包的導入情況在這裏插入圖片描述
1.建立網絡連接,數據庫連接
連接字符串 用戶名 密碼
jdbc:mysql://[ip地址]:[端口號]/[要連接的database名]

聲明最好放在外邊
Connection conn = null; conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/demo2useUnicode=true&characterEncoding=utf-8”,“root”,“xxx”);

//1.建立網絡連接,數據庫連接
    //連接字符串  用戶名  密碼
    //jdbc:mysql://[ip地址]:[端口號]/[要連接的database名]
    Connection conn = null;
    Statement sta = null;
    try {
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8","root","xxx");
        //2.從連接中獲得sql語句執行的對象
        sta =conn.createStatement();
        //3.定義一條sql語句
        String sql = "insert into sc values('0821101','c002',56)";
        //4.執行sql語句得到結果
        //此時的update不是指的數據庫的update語句,而是指的是能改變數據的語句
        //一個int的返回值代表着你這條語句影響了數據庫中多少行
        int count = sta.executeUpdate(sql);
        //5.處理結果
        if (count>0){
            System.out.println("數據插入成功");
        }else{
            System.out.println("數據插入失敗");
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }

ORM映射:ORM可以自動對Entity對象與數據庫中的Table進行字段與屬性的映射
是通過使用描述對象和數據庫之間映射的元數據,將面嚮對象語言程序中的對象自動持久化到關係數據庫中。本質上就是將數據從一種形式轉換到另外一種形式。
//增刪改查“ 只需改變sql”語句
//executeUpdate的返回值是int類型-------指示受影響的行數(即更新計數)
//executeQuery的返回值是resultSet類型------用於產生單個結果集的語句
orm映射理論****Object Relational Mapping,簡稱ORM

   //數據庫中的一條數據映射成一個java對象
   Course c = new course;
   c.setCno(rs.getString("Cno"));
   c.setCname(rs.getString("Cname"));
   c.setCredit(rs.getInt("Credit "));
   c.se6tSemester(rs.getInt("Semester"));
   //將這個對象存入到集合中
    courseList.add(c)

jdbc的步驟
1.打開連接
2.獲得sql語句執行對象
3.定義了一條spl語句
4.執行sql
5.處理結果集

簡單來說,按通常的系統設計,使用 JDBC 操作數據庫,業務處理邏輯和數據存取邏輯是混雜在一起的。 一般基本都是如下幾個步驟:

1、建立數據庫連接,獲得 Connection 對象。
2、根據用戶的輸入組裝查詢 SQL 語句。
3、根據 SQL 語句建立
Statement 對象 或者 PreparedStatement 對象。
4、用 Connection 對象執行 SQL語句,獲得結果集
ResultSet 對象。
5、然後一條一條讀取結果集 ResultSet 對象中的數據。
6、根據讀取到的數據,按特定的業務邏輯進行計算。
7、根據計算得到的結果再組裝更新 SQL 語句。
8、再使用 Connection 對象執行更新 SQL 語句,以更新數據庫中的數據。
7、最後依次關閉各個 Statement 對象和 Connection 對象

代碼分層**:DAO:datebase Access Object**
數據訪問對象是一個面向對象的數據庫接口,
列:deleteCourseByCno :根據Course表主鍵刪除一條數據
1.dao包
2.一個DAO類接口只操作一個表
3.創建一個子包impl
①刪除 int deleteCourseByCno(String cno);

public class CourseDAOImpl implements CourseDAO {
@Override
public int deleteCourseByCno(String cno) {
    Connection conn = null;
    Statement sta = null;
    int row = 0;
    try {
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8", "root", "xxxx");
        sta = conn.createStatement();
        String sql = "delete from course where cno ='" + cno + "'";
        row = sta.executeUpdate(sql);
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        if (sta != null) {
            try {
                sta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    return row;

}

②增加
int insertCourse(Course course);

String sql = "insert into course values('"+ course.getCno() +"','"+course.getCname() +"','" +
                +course.getCredit() + "','"+course.getSemester()+"')";

③修改
int updateCourseByCno(Course course);

        String sql = "update course set cname = '"+course.getCname()+"',credit = "+course.getCredit()+",semester="+course.getSemester() +" where cno ='"+course.getCno()+"'";

④查詢
List listCourse();

        String sql = "select * from course";

sql注入:是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
Statement有一個致命的bug叫sql注入:

    Connection conn = null;
    Statement sta = null;
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8", "root", "sr19961128");
    sta = conn.createStatement();
    ResultSet rs = sta.executeQuery(sql);

*PreparesStatement預編譯的sql語句執行載體:①操作方便②
使用?進行佔位

    String sql = "select * from s_user where username = ? and password = ?";
    PreparedStatement psta = conn.prepareStatement(sql);
    //執行sql之前給所有?設置值
    //第一個參數設置的是那個問號,這是從1開始ide
    psta.setString(1, "admin");
    psta.setString(2, "1234");
    ResultSet rs = psta.executeQuery();

conn.setAutocommit(false);//禁止自動提交

連接池
druid:阿里的產品,執行效率不是最高,功能多 jar包
從編程的角度來看,這和用戶的線程每當需要一個 JDBC 連接的時候調用DriverManager.getConnection() 是一樣的,採用連接池技術,可通過使用新的或已有的連接結束線程。
數據庫連接池的主要操作如下:
(1)建立數據庫連接池對象(服務器啓動)。
(2)按照事先指定的參數創建初始數量的數據庫連接(即:空閒連接數)。
(3)對於一個數據庫訪問請求,直接從連接池中得到一個連接。如果數據庫連接池對象中沒有空閒的連接,且連接數沒有達到最大(即:最大活躍連接數),創建一個新的數據庫連接。
(4)存取數據庫。
(5)關閉數據庫,釋放所有數據庫連接(此時的關閉數據庫連接,並非真正關閉,而是將其放入空閒隊列中。如實際空閒連接數大於初始空閒連接數則釋放連接)。
(6)釋放數據庫連接池對象(服務器停止、維護期間,釋放數據庫連接池對象,並釋放所有連接)。

    DruidDataSource druidDataSource = new DruidDataSource();
    //必須寫
    druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
    druidDataSource.setUrl("jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8&useSSL=false");
    druidDataSource.setUsername("root");
    druidDataSource.setPassword("xxxx");

    
    














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章