泛型是一种类型参数。将数据的类型,当做一个参数。
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> {@Overridepublic void add(Integer integer) {}
}//情况2:子类是一个泛型类
public class MyCollectionImpl02<T> implements MyCollection<T> {@Overridepublic 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();@Overridepublic 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;}@Overridepublic void insert(Book book) {}@Overridepublic void delete(Book book) {}@Overridepublic Book select(int index) {return null;}@Overridepublic 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);
}