前文已经讲了对象关系库如何实现缓存提高性能
接下来讲的就是如何实现对象关系库了
对象关系库的功能就是把Java对象插入数据库中,又或者从数据库中查询数据转化成对象。
现在我们的SQLClass
已经缓存了过程所有的SQL语句,现在只需要把查询出来的数据转化成Java对象就可以了
前面我们讲解Template模式的时候谈到,复杂的流程可以拆分将部分流程作为参数传进去
例如Template模式中我们讲解到的查询数据中我们最关注的核心是对ResultSet的遍历,所以核心函数在于dbHelper.mapResultSet(String sql,Object[] params,SQLConsumer<ResultSet> consumer)
而现在我们既然能将数据库里面的数据已经看成了一个一个对象,我们一行一行遍历ResultSet的是否可以抽象成一个个遍历存储在数据库中的对象mapBeans(Class<T> clazz,SQLConsumer<T> consumer)
public class Database{
private DbHelper dbHelper;
private SQLCache sqlCache;
//遍历数据库下所有T类的对象
public <T> int mapBeans(Class<T> clazz,SQLConsumer<T> consumer)throws SQLException{
SQLClass<T> sqlClass=sqlCache.getSQLClass(class);
String sql=sqlClass.selectSQL();
return dbHelper.mapResultSet(sql,new Object[]{},
resultSet->{
T t=sqlClass.toBean(resultSet);
consumer.accept(t);
});
}
//查询数据库下所有T类的对象,返回链表集合
public <T> List<T> queryList(Class<T> clazz)throws SQLException{
List<T> list=new LinkedList<>();
mapBeans(class,list::add);
return list;
}
public <T> int insert(T bean,boolean hasPrimary)throws SQLException{
SQLClass<T> sqlClass=sqlCache.getSQLClass(bean.getClass());
String sql=sqlClass.inertSQL(hasPrimary);
Object[] params=sqlClass.insertParams(bean,hasPrimary);
return dbHelper.execute(sql,params);
}
//上面已经实现了如何对象从数据库中提取出来和如何插入数据库,其他的操作由于篇幅已经省略
}
现在我们实现的对象关系库实际上是一个非常简单的对象关系库
如果想要能够正式运用在项目中还需要一些思考和深入优化