版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、java代码重构平时我们写的代码虽然满足了需求但往往不利于项目的开发与维护,以下面的JDBC代码为例java view plain copy 在CODE上查看代码片派生到我的代码片/ 增加学生信息 Override public void save(Student stu) String sql = INSERT INTO t_student(name,age) VALUES(?,?); Connection conn = null; Statement st = null; try / 1. 加载注册驱动 Class.forName(com.mysql.jdbc.Driver); / 2.
2、获取数据库连接 conn = DriverManager.getConnection(jdbc:mysql:/jdbcdemo, root, root); / 3. 创建语句对象 PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, stu.getName(); ps.setObject(2, stu.getAge(); / 4. 执行SQL语句 ps.executeUpdate(); / 5. 释放资源 catch (Exception e) e.printStackTrace(); finally try if
3、 (st != null) st.close(); catch (SQLException e) e.printStackTrace(); finally try if (conn != null) conn.close(); catch (SQLException e) e.printStackTrace(); / 删除学生信息 Override public void delete(Long id) String sql = DELETE FROM t_student WHERE id=?; Connection conn = null; Statement st = null; try
4、/ 1. 加载注册驱动 Class.forName(com.mysql.jdbc.Driver); / 2. 获取数据库连接 conn = DriverManager.getConnection(jdbc:mysql:/jdbcdemo, root, root); / 3. 创建语句对象 PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, id); / 4. 执行SQL语句 ps.executeUpdate(); / 5. 释放资源 catch (Exception e) e.printStackTrace();
5、 finally try if (st != null) st.close(); catch (SQLException e) e.printStackTrace(); finally try if (conn != null) conn.close(); catch (SQLException e) e.printStackTrace(); / 修改学生信息 Override public void update(Student stu) String sql = UPDATE t_student SET name=?,age=? WHERE id=?; Connection conn =
6、null; Statement st = null; try / 1. 加载注册驱动 Class.forName(com.mysql.jdbc.Driver); / 2. 获取数据库连接 conn = DriverManager.getConnection(jdbc:mysql:/jdbcdemo, root, root); / 3. 创建语句对象 PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, stu.getName(); ps.setObject(2, stu.getAge(); ps.setObject
7、(3, stu.getId(); / 4. 执行SQL语句 ps.executeUpdate(); / 5. 释放资源 catch (Exception e) e.printStackTrace(); finally try if (st != null) st.close(); catch (SQLException e) e.printStackTrace(); finally try if (conn != null) conn.close(); catch (SQLException e) e.printStackTrace(); 上述代码中功能没问题,但是代码重复的太多,因此我们可以
8、进行抽取,把重复的代码放到一个工具类JDBCUtil2里java view plain copy 在CODE上查看代码片派生到我的代码片/工具类 public class JDBCUtil2 private JDBCUtil2() static / 1. 加载注册驱动 try Class.forName(com.mysql.jdbc.Driver); catch (Exception e) / TODO Auto-generated catch block e.printStackTrace(); public static Connection getConnection() try / 2
9、. 获取数据库连接 return DriverManager.getConnection(jdbc:mysql:/jdbcdemo, root, root); catch (Exception e) e.printStackTrace(); return null; /释放资源 public static void close(ResultSet rs, Statement st, Connection conn) try if (rs != null) rs.close(); catch (SQLException e) e.printStackTrace(); finally try if
10、 (st != null) st.close(); catch (SQLException e) e.printStackTrace(); finally try if (conn != null) conn.close(); catch (SQLException e) e.printStackTrace(); 在实现类中直接调用工具类中的方法即可java view plain copy 在CODE上查看代码片派生到我的代码片public class StudentDAOImpl2 implements IstudentDAO / 增加学生信息 Override public void sa
11、ve(Student stu) String sql = INSERT INTO t_student(name,age) VALUES(?,?); Connection conn = null; PreparedStatement ps=null; try conn=JDBCUtil2.getConnection(); / 3. 创建语句对象 ps = conn.prepareStatement(sql); ps.setObject(1, stu.getName(); ps.setObject(2, stu.getAge(); / 4. 执行SQL语句 ps.executeUpdate();
12、/ 5. 释放资源 catch (Exception e) e.printStackTrace(); finally JDBCUtil2.close(null, ps, conn); / 删除学生信息 Override public void delete(Long id) String sql = DELETE FROM t_student WHERE id=?; Connection conn = null; PreparedStatement ps=null; try conn=JDBCUtil2.getConnection(); / 3. 创建语句对象 ps = conn.prepar
13、eStatement(sql); ps.setObject(1, id); / 4. 执行SQL语句 ps.executeUpdate(); / 5. 释放资源 catch (Exception e) e.printStackTrace(); finally JDBCUtil2.close(null, ps, conn); / 修改学生信息 Override public void update(Student stu) String sql = UPDATE t_student SET name=?,age=? WHERE id=?; Connection conn = null; Prep
14、aredStatement ps=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 (Exception e) e.printStackTrace(); finally JDBCUtil2.clos
15、e(null, ps, conn); Override public Student get(Long id) String sql = SELECT * FROM t_student WHERE id=?; Connection conn = null; Statement st = null; ResultSet rs = null; PreparedStatement ps=null; try conn=JDBCUtil2.getConnection(); / 3. 创建语句对象 ps = conn.prepareStatement(sql); ps.setObject(1, id);
16、/ 4. 执行SQL语句 rs = ps.executeQuery(); if (rs.next() String name = rs.getString(name); int age = rs.getInt(age); Student stu = new Student(id, name, age); return stu; / 5. 释放资源 catch (Exception e) e.printStackTrace(); finally JDBCUtil2.close(rs, ps, conn); return null; Override public List list() List
17、 list = new ArrayList(); String sql = SELECT * FROM t_student ; Connection conn = null; Statement st = null; ResultSet rs = null; PreparedStatement ps=null; try conn=JDBCUtil2.getConnection(); / 3. 创建语句对象 ps = conn.prepareStatement(sql); / 4. 执行SQL语句 rs = ps.executeQuery(); while (rs.next() long id
18、= rs.getLong(id); String name = rs.getString(name); int age = rs.getInt(age); Student stu = new Student(id, name, age); list.add(stu); / 5. 释放资源 catch (Exception e) e.printStackTrace(); finally JDBCUtil2.close(rs, ps, conn); return list; 虽然完成了重复代码的抽取,但数据库中的账号密码等直接显示在代码中,不利于后期账户密码改动的维护,我们可以建立个p
19、ertise文件用来存储这些信息html view plain copy 在CODE上查看代码片派生到我的代码片driverClassName =com.mysql.jdbc.Driver url =jdbc:mysql:/jdbcdemo username =root password =root 只需在工具类中获取里面的信息即可java view plain copy 在CODE上查看代码片派生到我的代码片private static Properties p; static / 1. 加载注册驱动 try ClassLoader loader = Thread.currentThread
20、().getContextClassLoader(); InputStream inputStream = loader.getResourceAsStream(perties); p = new Properties(); p.load(inputSream); Class.forName(p.getProperty(driverClassName); catch (Exception e) / TODO Auto-generated catch block e.printStackTrace(); public static Connection getConnection()
21、 try / 2. 获取数据库连接 return DriverManager.getConnection(p.getProperty(url), p.getProperty(username), p.getProperty(password); catch (Exception e) e.printStackTrace(); return null; 抽取到这里貌似已经完成,但在实现类中,依然存在部分重复代码,在DML操作中,除了SQL和设置值的不同,其他都相同,将相同的抽取出去,不同的部分通过参数传递进来,无法直接放在工具类中,这时我们可以创建一个模板类JDBCTemplate,创建一个DM
22、L和DQL的模板来进行对代码的重构。java view plain copy 在CODE上查看代码片派生到我的代码片public class JDBCTemplate private JDBCTemplate(); /DML通用模板 public static void update(String sql, Object. params) Connection conn = null; PreparedStatement ps = null; try conn = JDBCUtil2.getConnection(); ps = conn.prepareStatement(sql); / 设置值
23、 for (int i = 0; i params.length; i+) ps.setObject(i + 1, paramsi); ps.executeUpdate(); catch (Exception e) e.printStackTrace(); finally JDBCUtil.close(null, ps, conn); /DQL同意模板 public static List query(String sql,Object.params) List list=new ArrayList(); Connection conn = null; PreparedStatement ps
24、=null; ResultSet rs = null; try conn=JDBCUtil.getConnection(); ps=conn.prepareStatement(sql); /设置值 for (int i = 0; i params.length; i+) ps.setObject(i+1, paramsi); rs = ps.executeQuery(); while (rs.next() long id = rs.getLong(id); String name = rs.getString(name); int age = rs.getInt(age); Student s
25、tu = new Student(id, name, age); list.add(stu); / 5. 释放资源 catch (Exception e) e.printStackTrace(); finally JDBCUtil.close(rs, ps, conn); return list; 实现类直接调用方法即可。java view plain copy 在CODE上查看代码片派生到我的代码片/ 增加学生信息 Override public void save(Student stu) String sql = INSERT INTO t_student(name,age) VALUE
26、S(?,?); Object params=new Objectstu.getName(),stu.getAge(); JDBCTemplate.update(sql, params); / 删除学生信息 Override public void delete(Long id) String sql = DELETE FROM t_student WHERE id=?; JDBCTemplate.update(sql, id); / 修改学生信息 Override public void update(Student stu) String sql = UPDATE t_student SET
27、 name=?,age=? WHERE id=?; Object params=new Objectstu.getName(),stu.getAge(),stu.getId(); JDBCTemplate.update(sql, params); Override public Student get(Long id) String sql = SELECT * FROM t_student WHERE id=?; List list = JDBCTemplate.query(sql, id); return list.size()0? list.get(0):null; Override p
28、ublic List list() String sql = SELECT * FROM t_student ; return JDBCTemplate.query(sql); 这样重复的代码基本就解决了,但又个很严重的问题就是这个程序DQL操作中只能处理Student类和t_student表的相关数据,无法处理其他类如:Teacher类和t_teacher表。不同表(不同的对象),不同的表就应该有不同列,不同列处理结果集的代码就应该不一样,处理结果集的操作只有DAO自己最清楚,也就是说,处理结果的方法压根就不应该放在模板方中,应该由每个DAO自己来处理。因此我们可以创建一个IResultSe
29、tHandle接口来处理结果集java view plain copy 在CODE上查看代码片派生到我的代码片public interface IResultSetHandle /处理结果集 List handle(ResultSet rs) throws Exception; DQL模板类中调用IResultSetHandle接口中的handle方法,提醒实现类去自己去实现handle方法java view plain copy 在CODE上查看代码片派生到我的代码片/DQL同意模板 public static List query(String sql,IResultSetHandle r
30、sh, Object.params) List list=new ArrayList(); Connection conn = null; PreparedStatement ps=null; ResultSet rs = null; try conn=JDBCUtil.getConnection(); ps=conn.prepareStatement(sql); /设置值 for (int i = 0; i params.length; i+) ps.setObject(i+1, paramsi); rs = ps.executeQuery(); return rsh.handle(rs);
31、 / 5. 释放资源 catch (Exception e) e.printStackTrace(); finally JDBCUtil.close(rs, ps, conn); return list; 实现类自己去实现IResultSetHandle接口的handle方法,想要处理什么类型数据在里面定义即可java view plain copy 在CODE上查看代码片派生到我的代码片Override public Student get(Long id) String sql = SELECT * FROM t_student WHERE id=?; List list = JDBCTe
32、mplate.query(sql,new StudentResultSetHandle(), id); return list.size()0? list.get(0):null; Override public List list() String sql = SELECT * FROM t_student ; return JDBCTemplate.query(sql,new StudentResultSetHandle(); class StudentResultSetHandle implements IResultSetHandle Override public List hand
33、le(ResultSet rs) throws Exception List list=new ArrayList(); while(rs.next() long id = rs.getLong(id); String name = rs.getString(name); int age = rs.getInt(age); Student stu=new Student(id, name, age); list.add(stu); return list; 好了,基本已经大功告成了,但是DQL查询不单单只有查询学生信息(List类型),还可以查询学生数量,这时就要通过泛型来完成java view plain copy 在CODE上查看代码片派生到我的代码片/声明泛型T作为返回类型,谁调用IResultSetHandle,谁就决定T类型 public interface IResultSetHandle /处理结果集 T handle(ResultSet rs) throws Exception; java view plain copy 在CODE上查看代码片派生到我的代码片/DQL同意模板 public static T query(String sql,IResultSetHandle rsh, Object.params) Connection co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年京东方日结合同技术转让
- 2026年中国笔式结扎器行业市场前景预测及投资价值评估分析报告
- 个人描述及评估
- 2026年中国电动环链葫芦行业市场规模及未来投资方向研究报告
- 城市更新空间设计
- 物业收费管理流程标准操作手册
- 2026年中国版石棉制品行业市场前景预测及投资价值评估分析报告
- 2026年中国MPP电力管行业市场前景预测及投资价值评估分析报告
- 物业维修管理服务流程标准
- 2026年中国快速输液器行业市场前景预测及投资价值评估分析报告
- 初三超难数学题试卷及答案
- 《前列腺增生护理查房》课件
- 《智慧化工园区系统运维管理要求》
- 被执行人对强制执行异议申请书模板
- DB3311T 49-2015 企业导入精益生产评价规范
- 拼多多研究报告
- 2024-2025学年七年级生物上学期期中考试卷
- 河北省唐山市迁安市2024-2025学年九年级上学期11月期中数学试题
- 江苏省宿迁市宿城区2024-2025学年四年级上学期期中数学试题
- 医院进修申请表
- 中班音乐《粉刷匠》
评论
0/150
提交评论