实训第三天
上午时间
主要讲了三个部分,1.jvm指令 2.数据持久化3.jdbc封装
-
jvm指令
这部分只要是一个初学者比较容易混淆的理解开始的,例如,a=a++ 和 a=++a这两者的区别,我刚开始的理解是第一个是先赋值后加加,第二个是先加加后赋值,老师纠正一下,这俩都是先加加,后赋值,只不过入栈的时间不同。最终显示的是在操作数栈顶的那个数。 -
数据持久化
这部分主要介绍了如何持久化,将数据放到文件等不会断电消失的媒介中,就等于实现了数据持久化。可以是数据库存储。 -
jdbc封装
这部分内容下午还有一节,综合在一起就是封装一个方法来实现增删改方法。其中用到了动态传参。
public static int updateExecute(String sql,Object… params){
Connection con = getConnection();
PreparedStatement ps=null;
int count = 0;
try {
ps = con.prepareStatement(sql);
if(params !=null){
for (int i = 0;i<params.length;i++){
ps.setObject(i+1,params[i]);
}
}
count = ps.executeUpdate();} catch (SQLException e) { e.printStackTrace(); }finally { closejdbc(con,ps); } return count;
}
这部分参数中有个Object… params,这个就是动态传参,动态传参的特点是每个函数最多有一个动态传参,而且每个动态传参必须位于参数列表的最后一个位置。动态传参数可以实现我们在参数位置传递任意个参数,此时就当params为一个数组,用法也和数组一样。
使用一个方法来封装查询方法,使其可以对任意类都可以查询。
有两种方法
第一种:
public static List queryExecute(String sql,RowMap rm,Object… params){
Connection con = getConnection();
List list = new ArrayList<>();
PreparedStatement ps=null;
ResultSet rs = null;
try {
ps = con.prepareStatement(sql);
if(params !=null){
for (int i = 0;i<params.length;i++){
ps.setObject(i+1,params[i]);
}
}
rs = ps.executeQuery();
while(rs.next()){
T t = rm.mapselect(rs);
list.add(t);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeJDBC(con,ps,rs);
}
return list;
}
这种方法使用了泛型T,动态传参,还有传递方法参数(其实现在1.8之前叫做匿名内部类,1.8之后叫做lamota表达式)
第二种方法:
public static List queryExecute(String sql,Class clz,Object… params){
List list = new ArrayList<>();
Connection con = getConnection();
ResultSet rs = null;
try {
PreparedStatement ps = con.prepareStatement(sql);
if(params != null){
for(int i=0 ; i< params.length;i++){
ps.setObject(i+1,params[i]);
}
}
rs = ps.executeQuery();
while(rs.next()){
T t = clz.newInstance();
Field[] fields = clz.getDeclaredFields();
for (Field field : fields){
field.setAccessible(true);
String column = field.getName();
if(field.isAnnotationPresent(Column.class)){
column = field.getAnnotation(Column.class).value();
}
field.set(t,rs.getObject(column));
}
list.add(t);
}} catch (SQLException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } return list;
}
这个方法使用到了类的反射,可以通过类的反射获得类的属性,属性可以设置,还有通过类的反射就可以调用无参构造创建一个对象。