傳統jdbc的實現步驟以及缺點分析

package com.itheima;
import com.itheima.domain.User;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
 * Hello world!
 */
public class App {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //----------------------------問題一 start  獲取連接不應該用一個創建一個 應該整個連接池 深化一點 連接池配置 也不應該整寫死
        //註冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        //獲取連接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/heima349_mybatis", "root", "123");
        //------------------------------問題一 end
        //------------------------------問題二 start  sql語句寫在了代碼中 不容易修改 最好放在配置文件中
        //準備sql 獲取prepareStatement
        PreparedStatement statement = connection.prepareStatement("select * from USER ");
        //------------------------------問題二 end sql語句寫在了代碼中 不容易修改 最好放在配置文件中
        //執行sql  //獲取 resultSet
        ResultSet resultSet = statement.executeQuery();
        //------------------------------問題三 得到結果集以後 操作太繁瑣 封裝 希望直接結果對象
        ///有關result獲取元信息的操作--------------------------------------start
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();
        System.out.println("多少列:"+columnCount);
        //在這個地方遍歷的時候 索引從1開始
        for (int i = 1; i <=columnCount; i++) {
            System.out.print("第"+i+"列---");
            String columnTypeName = metaData.getColumnTypeName(i);
            System.out.print("列類型名:"+columnTypeName);
            String columnName = metaData.getColumnName(i);
            System.out.print("列的名字:"+columnName);
            String columnClassName = metaData.getColumnClassName(i);
            System.out.println("列的所對應java類型名字:"+columnClassName);
        }
        ///有關result獲取元信息的操作--------------------------------------end
        List<User> users=new ArrayList<>();
        //處理結果
        while (resultSet.next()){
            User user=new User();
            Object id = resultSet.getObject("id");
            user.setId((Integer) id);
            Object username = resultSet.getObject("username");
            user.setUsername((String) username);
            Object gender = resultSet.getObject("gender");
            user.setGender((String) gender);
            Object birthday = resultSet.getObject("birthday");
            user.setBirthday((java.util.Date) birthday);
            Object address = resultSet.getObject("address");
            user.setAddress((String) address);
            users.add(user);
        }
        //關閉資源
        resultSet.close();
        statement.close();
        connection.close();
        //------------------------------問題三 得到結果集以後 操作太繁瑣
        System.out.println(users);
    }
}

domain實體類

package com.itheima.domain;
import java.util.Date;
public class User {
    private int id;
    private String username;
    private String gender;
    private Date birthday;
    private String address;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", gender='" + gender + '\'' +
                ", birthday=" + birthday +
                ", address='" + address + '\'' +
                '}';
    }
}
package com.itheima.domain;
public class Product {
    private int id;
    private String name;
    private double price;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

缺點總結:
1、數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。
2、Sql語句在代碼中硬編碼,造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變Java代碼。
3、使用preparedStatement向佔有位符號傳參數存在硬編碼,因爲sql語句的where條件不一定,可能多也可能少,修改sql還要修改代碼,系統不易維護。
4、對結果集解析存在硬編碼(查詢列名),sql變化導致解析代碼變化,系統不易維護,如果能將數據庫記錄封裝成pojo對象解析比較方便。

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