泛型类的使用
我们都知道泛型的使用可以提高使用集合框架的效率和安全性和易用性 例如:List<Account> list = newArrayList<Account>();他标注只能传入Account类型的数据,在进行迭代和使用时可以直接取出不用强制类型转换
For(Account account:list){
System.out.println(account.getName());
}
泛型类就是在类的头上加上泛型标志 public class DBHelp<T>{ }
T是一个占位符,代表可以传入所有类型,泛型类主要用于对类的公有化,提高类的内聚能力并降低其他类与该类的耦合程度和方便使用
例如:
DBHelp类的查询部分实例
public class DBHelp<T> {
privatefinal String DRIVER = "com.mysql.jdbc.Driver";
privatefinal String URL = "jdbc:mysql:///mydb";
privatefinal String USERNAME = "root";
privatefinal String PASSWORD = "root";
/**
* 获取数据库连接对象
* @return
*/
publicConnection getConnection() {
try{
Class.forName(DRIVER);
Connectionconn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
returnconn;
}catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
returnnull;
}
public TexecuteQueryForObject(String sql,RowMapper<T> rowMapper,Object... args) {
Connectionconn = null;
PreparedStatementstat = null;
ResultSetrs = null;
Tobj = null;
try{
conn= getConnection();
stat= conn.prepareStatement(sql);
for(int i = 0; i < args.length; i++) {
stat.setObject(i+1,args[i]);
}
rs= stat.executeQuery();
if(rs.next()){
obj= rowMapper.mapperRow(rs);
}
}catch (SQLException e) {
e.printStackTrace();
}finally {
close(rs,stat, conn);
}
returnobj;
}
publicList<T> executeQueryForList(String sql,RowMapper<T>rowMapper,Object... args) {
Connectionconn = null;
PreparedStatementstat = null;
ResultSetrs = null;
List<T>list = new ArrayList<T>();
try{
conn= getConnection();
stat= conn.prepareStatement(sql);
for(int i = 0; i < args.length; i++) {
stat.setObject(i+1,args[i]);
}
rs= stat.executeQuery();
while(rs.next()){
list.add(rowMapper.mapperRow(rs));
}
}catch (SQLException e) {
e.printStackTrace();
}finally {
close(rs,stat, conn);
}
returnlist;
}
}
RowMapper 接口
public interface RowMapper<T> {
public TmapperRow(ResultSet rs) throws SQLException;
}
我们可以创建一个DBHelp泛型类来专门处理数据库连接查询和修改数据,增删改都很好实现,但查询要返回数据,如果只操纵一个表还好些,如果操纵很多表因为不知道某一时间到底是用那个表,就要重写所有表的查询方法很不方便,使用泛型类不需知道传入的是哪个类,所以使用T表示未知类有T的地方都代表传入的某个类,我们都执行sql语句当返回一个ResultSet对象,我们建立一个RoeMapper接口用来映射行数据,在表的处理类中实现该接口,实现一行数据映射到一个表对应的Bean中,我们传入RowMapper接口将ResultSet实例传入RowMapper中有接口指向实现类知道,是由某个实现类实现了数据的封装和返回,在DBHelp中只需查询传入和返回数据,所以我们不需知道传入的是哪个类,只要它实现类RowMapper接口就可以查询数据。泛型类就是使用一个占位符来代替实际类。
UserDao实现
public class UserDao {
privateDBHelp<User> db = new DBHelp<User>();
publicvoid del(int id) {
Stringsql = "delete from t_user where id = ?";
db.executeSQL(sql,id);
}
publicList<User> findAll() {
Stringsql = "select id,username,password from t_user";
returndb.executeQueryForList(sql, new RowMapper<User>());
}
publicUser findById(int id) {
Stringsql = "select id,username,password from t_user where id = ?";
returndb.executeQueryForObject(sql, new UserRowMapper(), id);
}
//内部类
privateclass UserRowMapper implements RowMapper<User>{
@Override
publicUser mapperRow(ResultSet rs) throws SQLException {
Useruser = new User();
user.setId(rs.getInt("id"));
user.setUserName(rs.getString("username"));
user.setPassWord(rs.getString("passWord"));
returnuser;
}
}
}