泛型是一種型別引數。將資料的型別,當做一個引數。
1. 泛型的作用
- 在建立集合物件的時候,限定集合儲存元素的型別;
- 在編譯的時候,就進行型別檢查;
2. 泛型的使用規則
- 如果不指定泛型,預設是Object型別
- 泛型擦除:泛型應用於程式碼編譯期,程式執行的後,泛型就被擦除了。即執行期,泛型被擦除。
- 同時指定多個泛型<E1,E2,E3,....>
- 靜態方法中,不能使用泛型類或泛型介面。
- 泛型方法,可以是靜態的。 因為方法被呼叫時,才確定泛型引數的型別
- 泛型陣列:
E[] elements = (E[])new Object[capacity];
3. 泛型的分類
- 泛型類
類中的某個屬性,在定義的時候,不能確定是什麼型別,可以使用泛型表示該屬性的型別 - 泛型介面
介面中的方法引數型別 或 返回值型別,不確定的時候,使用泛型替代 - 泛型方法
類上面沒有泛型,但是方法上指定了泛型。一般用於工具類,不能例項化物件
方法的引數型別或返回值型別,不能確定的時候,使用泛型代替
4. 萬用字元的使用
萬用字元用於指定泛型的範圍(上限和下限)
-
? 任意型別
List<?>:只能寫入null值。
-
<? super 型別>:當前型別或當前型別的父型別
-
<? extends 型別>:當前型別或當前型別的子類
5. 應用例項
泛型介面的使用
//泛型介面
public interface MyCollection<T> {
void add(T t);
}
//情況1:子類定義是,直接指定泛型的具體型別
public class MyCollectionImpl01 implements MyCollection<Integer> {
@Override
public void add(Integer integer) {
}
}
//情況2:子類是一個泛型類
public class MyCollectionImpl02<T> implements MyCollection<T> {
@Override
public void add(T t) {
}
}
泛型方法的使用
/**
* 列印不同型別的集合
*/
public <E> void printAll(E e){
if(e instanceof Collection){
((Collection) e).forEach(System.out::println);
}else if( e instanceof Map){
Set set = ((Map) e).entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()){
Map.Entry next = (Map.Entry) iterator.next();
System.out.println(next.getKey()+" "+next.getValue());
}
}else{
System.out.println(e);
}
}
查詢所有的記錄
引入依賴
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
JavaBean實體類
public class Book{
private Integer id;
private String bookName;
private String author;
private Double price;
JDBC 工具類
/**
* 工具類:獲取MySQL資料庫連線
*/
public class JDBCUtil {
private static final String DRIVER = "com.mysql.jdbc.Driver";
//資料庫連線引數
private static final String URL = "jdbc:mysql://localhost/db_day525";
private static final String NAME = "root";
private static final String PASSWORD = "admin";
//註冊驅動(僅註冊1次)
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//資料庫連線
public static Connection getConnection() {
try {
return DriverManager.getConnection(URL, NAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//釋放資源
public static void close(Connection conn, Statement stmt) {
close(conn, stmt, null);//方法重用
}
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
Dao層
泛型介面
/**
* Dao層泛型介面:通用的CURD方法
*/
public interface Dao<T> {
/**
* 新增一條記錄
* @param t
*/
void insert(T t);
/**
* 刪除一條記錄
* @param t
*/
void delete(T t);
/**
*查詢所有資料
*/
List<T> selectAll() throws SQLException;
/**
* 查詢一個資料:根據id
*/
T select(int index);
/**
* 修改一條記錄:根據id
*/
void update(int index, T t);
}
實現類
public class BookDaoImpl implements Dao<Book> {
Connection conn = JDBCUtil.getConnection();
@Override
public List<Book> selectAll() throws SQLException {
List<Book> list = new ArrayList<>();
String sql = "select book_id as id,book_name as bookName,author,price from t_book";
PreparedStatement preStatement = conn.prepareStatement(sql);
ResultSet resultSet = preStatement.executeQuery();
while(resultSet.next()){
int bookId = resultSet.getInt(1);
String bookName = resultSet.getString(2);
String author = resultSet.getString(3);
Double price = resultSet.getDouble(4);
list.add(new Book(bookId,bookName,author,price));
}
return list;
}
@Override
public void insert(Book book) {}
@Override
public void delete(Book book) {}
@Override
public Book select(int index) {return null;}
@Override
public void update(int index, Book book) {}
}
測試
public static void main(String[] args) throws SQLException {
Dao dao = new BookDaoImpl();
List list = dao.selectAll();
list.forEach(System.out::print);
}