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對象解析比較方便。