记录一下工作学习过程中的一些经验总结,为了避免以后遗忘,先写一部分,等积累到一定的内容的时候,再做一个整理总结,这周的内容主要有以下几点:
- 泛型数组无法创建
- sql语句的书写顺序与解析顺序
- where与having的区别
- E-R关系图
- ResultSet的滚动结果集
连接池的Close的装饰着模式的方法增强
泛型数组无法创建
以前一直知道Java中的数组是不能使用泛型的,一直也没有深究过原因,今天写一下这个原因。假如数组可以使用泛型,那么由于java泛型的类型擦除和数组的协变,下面的代码将会编译通过:
List<String>[] stringLists=new List<String>[1];
List<Integer> intList = Arrays.asList(40);
Object[] objects = stringLists;
objects[0]=intList;
String s=stringLists[0].get(0);
由于泛型的类型擦除,List< Integer>,List< String >与List在运行期并没有区别,所以List< String >放入List< Integer >并不会产生ArrayStoreException异常。但是String s=stringLists[0].get(0);将会抛出ClassCastException异常。如果允许创建泛型数组,就绕过了泛型的编译时的类型检查,将List< Integer >放入List [ ],并在实际存的是Integer的对象转为String时抛出异常。所以Java中为了避免这个问题,就直接会在编译时就 报错。
- sql语句的书写顺序与解析顺序
书写顺序: s…f…w…g…h…o
解析顺序: from…on…outer…where…group by….having…select …distinct…order by where与having的区别
1) where是分组前筛选, having是分组后筛选
2) where后不可以跟聚合函数, having可以跟聚合函数
3) 如果出现使用where进行筛选和使用having进行筛选结果的一样的, 使用 where 效率会更高一些。E-R关系图
描述数据库各种对象之间的关系的一种数据模型。
在ER图中有如下四个成分:
矩形框:表示实体,在框中记入实体名。
菱形框:表示联系,在框中记入联系名。
椭圆形框:表示实体或联系的属性,将属性名记入框中。对于主属性名,则在其名称下划一下划线。
连线:实体与属性之间;实体与联系之间;联系与属性之间用直线相连,并在直线上标注联系的类型。(对于一对一联系,要在两个实体连线方向各写1; 对于一对多联系,要在一的一方写1,多的一方写N;对于多对多关系,则要在两个实体连线方向各写N,M。)ResultSet的滚动结果集
ResultSet滚动结果集可以使结果集中的结果进行滚动,可以想象 ResultSet有一个指针,默认指向表第一行的上面,每次使用next(),指针向下一行移动,默认这个指针是不能来回滚动的,但是用滚动的结果集就可以让这个指针来回滚动,从而取得纪录next()、previous(),回到第一行first(),同时还支持要去的ResultSet中的第几行absolute(int n),以及移动到相对当前行的第几行relative(int n)。具体使用方法,可以查看API,需要注意的一点是,滚动类型的设置。连接池的Close的装饰着模式的方法增强
使用连接池时,每次归还连接池都使用的是close方法,但是很明显,如果每次归还连接都是关闭资源的话,那么连接池的连接总是在不断的被取出,新的连接总是不断的被连接池创建,创建连接池的就相当于没有作用,所以每次归还连接是不会关闭资源的,那么我们每次调用的close方法又是怎么一回事呢?最近查资料,发现原来我们使用的close方法是经过方法增强的。通过工作之余查找资料,自己写了一个简单版的,通过装饰者模式方法增强方式增强close方法的连接池的实现,这里贴上主要部分代码:
首先是装饰者:
public class MyDataSource implements DataSource{
// 创建一个List集合用于存放多个连接对象.
private List<Connection> list = new ArrayList<Connection>();
// 在程序开始的时候,初始化几个连接,将连接存放到list中.
public MyDataSource() {
// 初始化3个连接:
for(int i=1;i<=3;i++){
Connection conn = JDBCUtils.getConnection();
list.add(conn);
}
}
// 获得连接的方法:
public Connection getConnection() throws SQLException {
if(list.size() <= 0){
for(int i=1;i<=3;i++){
Connection conn = JDBCUtils.getConnection();
list.add(conn);
}
}
Connection conn = list.remove(0);
MyConnection myConn = new MyConnection(conn, list);
return myConn;
}
}
然后是被装饰者:
public class MyConnection implements Connection{
private Connection conn;
private List<Connection> list;
public MyConnection(Connection conn,List<Connection> list) {
this.conn = conn;
this.list = list;
}
@Override
public void close() throws SQLException {
list.add(conn);
}
@Override
public boolean isWrapperFor(Class<?> arg0) throws SQLException {
return conn.isWrapperFor(arg0);
}
}