java代码重构.docx
- 文档编号:25969257
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:22
- 大小:18.43KB
java代码重构.docx
《java代码重构.docx》由会员分享,可在线阅读,更多相关《java代码重构.docx(22页珍藏版)》请在冰豆网上搜索。
java代码重构
java代码重构
平时我们写的代码虽然满足了需求但往往不利于项目的开发与维护,以下面的JDBC代码为例
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
18px;">//增加学生信息 @Override publicvoidsave(Studentstu){ Stringsql="INSERTINTOt_student(name,age)VALUES(? ? )"; Connectionconn=null; Statementst=null; try{ //1.加载注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取数据库连接 conn=DriverManager.getConnection("jdbc: mysql: ///jdbcdemo","root","root"); //3.创建语句对象 PreparedStatementps=conn.prepareStatement(sql); ps.setObject(1,stu.getName()); ps.setObject(2,stu.getAge()); //4.执行SQL语句 ps.executeUpdate(); //5.释放资源 }catch(Exceptione){ e.printStackTrace(); }finally{ try{ if(st! =null) st.close(); }catch(SQLExceptione){ e.printStackTrace(); }finally{ try{ if(conn! =null) conn.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } } //删除学生信息 @Override publicvoiddelete(Longid){ Stringsql="DELETEFROMt_studentWHEREid=? "; Connectionconn=null; Statementst=null; try{ //1.加载注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取数据库连接 conn=DriverManager.getConnection("jdbc: mysql: ///jdbcdemo","root","root"); //3.创建语句对象 PreparedStatementps=conn.prepareStatement(sql); ps.setObject(1,id); //4.执行SQL语句 ps.executeUpdate(); //5.释放资源 }catch(Exceptione){ e.printStackTrace(); }finally{ try{ if(st! =null) st.close(); }catch(SQLExceptione){ e.printStackTrace(); }finally{ try{ if(conn! =null) conn.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } } //修改学生信息 @Override publicvoidupdate(Studentstu){ Stringsql="UPDATEt_studentSETname=? age=? WHEREid=? "; Connectionconn=null; Statementst=null; try{ //1.加载注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取数据库连接 conn=DriverManager.getConnection("jdbc: mysql: ///jdbcdemo","root","root"); //3.创建语句对象 PreparedStatementps=conn.prepareStatement(sql); ps.setObject(1,stu.getName()); ps.setObject(2,stu.getAge()); ps.setObject(3,stu.getId()); //4.执行SQL语句 ps.executeUpdate(); //5.释放资源 }catch(Exceptione){ e.printStackTrace(); }finally{ try{ if(st! =null) st.close(); }catch(SQLExceptione){ e.printStackTrace(); }finally{ try{ if(conn! =null) conn.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } 上述代码中功能没问题,但是代码重复的太多,因此我们可以进行抽取,把重复的代码放到一个工具类JDBCUtil2里 [java]viewplaincopy在CODE上查看代码片派生到我的代码片 //工具类 publicclassJDBCUtil2{ privateJDBCUtil2(){ } static{ //1.加载注册驱动 try{ Class.forName("com.mysql.jdbc.Driver"); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } publicstaticConnectiongetConnection(){ try{ //2.获取数据库连接 returnDriverManager.getConnection("jdbc: mysql: ///jdbcdemo","root","root"); }catch(Exceptione){ e.printStackTrace(); } returnnull; } //释放资源 publicstaticvoidclose(ResultSetrs,Statementst,Connectionconn){ try{ if(rs! =null) rs.close(); }catch(SQLExceptione){ e.printStackTrace(); }finally{ try{ if(st! =null) st.close(); }catch(SQLExceptione){ e.printStackTrace(); }finally{ try{ if(conn! =null) conn.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } } } 在实现类中直接调用工具类中的方法即可 [java]viewplaincopy在CODE上查看代码片派生到我的代码片 publicclassStudentDAOImpl2implementsIstudentDAO{ //增加学生信息 @Override publicvoidsave(Studentstu){ Stringsql="INSERTINTOt_student(name,age)VALUES(? ? )"; Connectionconn=null; PreparedStatementps=null; try{ conn=JDBCUtil2.getConnection(); //3.创建语句对象 ps=conn.prepareStatement(sql); ps.setObject(1,stu.getName()); ps.setObject(2,stu.getAge()); //4.执行SQL语句 ps.executeUpdate(); //5.释放资源 }catch(Exceptione){ e.printStackTrace(); }finally{ JDBCUtil2.close(null,ps,conn); } } //删除学生信息 @Override publicvoiddelete(Longid){ Stringsql="DELETEFROMt_studentWHEREid=? "; Connectionconn=null; PreparedStatementps=null; try{ conn=JDBCUtil2.getConnection(); //3.创建语句对象 ps=conn.prepareStatement(sql); ps.setObject(1,id); //4.执行SQL语句 ps.executeUpdate(); //5.释放资源 }catch(Exceptione){ e.printStackTrace(); }finally{ JDBCUtil2.close(null,ps,conn); } } //修改学生信息 @Override publicvoidupdate(Studentstu){ Stringsql="UPDATEt_studentSETname=? age=? WHEREid=? "; Connectionconn=null; PreparedStatementps=null; try{ conn=JDBCUtil2.getConnection(); //3.创建语句对象 ps=conn.prepareStatement(sql); ps.setObject(1,stu.getName()); ps.setObject(2,stu.getAge()); ps.setObject(3,stu.getId()); //4.执行SQL语句 ps.executeUpdate(); //5.释放资源 }catch(Exceptione){ e.printStackTrace(); }finally{ JDBCUtil2.close(null,ps,conn); } } @Override publicStudentget(Longid){ Stringsql="SELECT*FROMt_studentWHEREid=? "; Connectionconn=null; Statementst=null; ResultSetrs=null; PreparedStatementps=null; try{ conn=JDBCUtil2.getConnection(); //3.创建语句对象 ps=conn.prepareStatement(sql); ps.setObject(1,id); //4.执行SQL语句 rs=ps.executeQuery(); if(rs.next()){ Stringname=rs.getString("name"); intage=rs.getInt("age"); Studentstu=newStudent(id,name,age); returnstu; } //5.释放资源 }catch(Exceptione){ e.printStackTrace(); }finally{ JDBCUtil2.close(rs,ps,conn); } returnnull; } @Override publicList List Stringsql="SELECT*FROMt_student"; Connectionconn=null; Statementst=null; ResultSetrs=null; PreparedStatementps=null; try{ conn=JDBCUtil2.getConnection(); //3.创建语句对象 ps=conn.prepareStatement(sql); //4.执行SQL语句 rs=ps.executeQuery(); while(rs.next()){ longid=rs.getLong("id"); Stringname=rs.getString("name"); intage=rs.getInt("age"); Studentstu=newStudent(id,name,age); list.add(stu); } //5.释放资源 }catch(Exceptione){ e.printStackTrace(); }finally{ JDBCUtil2.close(rs,ps,conn); } returnlist; } } 虽然完成了重复代码的抽取,但数据库中的账号密码等直接显示在代码中,不利于后期账户密码改动的维护,我们可以建立个db.propertise文件用来存储这些信息 [html]viewplaincopy在CODE上查看代码片派生到我的代码片 driverClassName=com.mysql.jdbc.Driver url=jdbc: mysql: ///jdbcdemo username=root password=root 只需在工具类中获取里面的信息即可 [java]viewplaincopy在CODE上查看代码片派生到我的代码片 privatestaticPropertiesp; static{ //1.加载注册驱动 try{ ClassLoaderloader=Thread.currentThread().getContextClassLoader(); InputStreaminputStream=loader.getResourceAsStream("db.properties"); p=newProperties(); p.load(inputSream); Class.forName(p.getProperty("driverClassName")); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } publicstaticConnectiongetConnection(){ try{ //2.获取数据库连接 returnDriverManager.getConnection(p.getProperty("url"),p.getProperty("username"), p.getProperty("password")); }catch(Exceptione){ e.printStackTrace(); } returnnull; } 抽取到这里貌似已经完成,但在实现类中,依然存在部分重复代码,在DML操作中,除了SQL和设置值的不同,其他都相同,将相同的抽取出去,不同的部分通过参数传递进来,无法直接放在工具类中,这时我们可以创建一个模板类JDBCTemplate,创建一个DML和DQL的模板来进行对代码的重构。 [java]viewplaincopy在CODE上查看代码片派生到我的代码片 publicclassJDBCTemplate{ privateJDBCTemplate(){}; //DML通用模板 publicstaticvoidupdate(Stringsql,Object...params){ Connectionconn=null; PreparedStatementps=null; try{ conn=JDBCUtil2.getConnection(); ps=conn.prepareStatement(sql); //设置值 for(inti=0;i ps.setObject(i+1,params[i]); } ps.executeUpdate(); }catch(Exceptione){ e.printStackTrace(); }finally{ JDBCUtil.close(null,ps,conn); } } //DQL同意模板 publicstaticList List Connectionconn=null; PreparedStatementps=null; ResultSetrs=null; try{ conn=JDBCUtil.getConnection(); ps=conn.prepareStatement(sql); //设置值 for(inti=0;i ps.setObject(i+1,params[i]); } rs=ps.executeQuery(); while(rs.next()){ longid=rs.getLong("id"); Stringname=rs.getString("name"); intage=rs.getInt("age"); Studentstu=newStudent(id,name,age); list.add(stu); } //5.释放资源 }catch(Exceptione){ e.printStackTrace(); }finally{ JDBCUtil.close(rs,ps,conn); } returnlist; } } 实现类直接调用方法即可。 [java]viewplaincopy在CODE上查看代码片派生到我的代码片 //增加学生信息 @Override publicvoidsave(Studentstu){ Stringsql="INSERTINTOt_student(name,age)VALUES(? ? )"; Object[]params=newObject[]{stu.getName(),stu.getAge()}; JDBCTemplate.update(sql,params); } //删除学生信息 @Override publicvoiddelete(Longid){ Stringsql="DELETEFROMt_studentWHEREid=? "; JDBCTemplate.update(sql,id); } //修改学生信息 @Override publicvoidupdate(Studentstu){ Stringsql="UPDATEt_studentSETname=? age=? WHEREid=? "; Object[]params=newObject[]{stu.getName(),stu.getAge(),stu.getId()}; JDBCTemplate.update(sql,params); } @Override publicStudentget(Longid){ Stringsql="SELECT*FROMt_studentWHEREid=? "; List returnlist.size()>0? list.get(0): null; } @Over
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)