接口中定义的方法在抽象类中实现
2012-04-12 12:12
555 查看
今天在做一个dao工厂时遇到一个问题,就是对于数据库的连接到底在哪里关闭,在创建连接时是在dao父类中创建的,而关闭则不能在一个dao的方法中去完成,那样在使用这个dao实例的方法会报异常,看来还得为每个dao定义一个关闭连接的方法,而这个方法还得在接口中声明,,那样就得在每个实现中去实现一遍重复的代码了,试着把这个实现的代码提到一个抽象类中,在实现接口的子类中没有去覆写,也没有报错,嘿嘿,目的达到了,,原来实现一个接口又实现一个父类,接口中方法原来可以在继承的父类中实现。好吧贴一下代码。
dao接口: package com.justsy.mdm.dao; import java.sql.SQLException; import com.justsy.mdm.permission.User; public interface IUserDAO { public User login(String name, String password) throws SQLException; public void closeConnQuiet() ; }
抽象父类: package com.justsy.mdm.dao; import java.sql.Connection; import java.sql.SQLException; import org.apache.log4j.Logger; import com.justsy.mdm.util.DBManager; public abstract class AbstractBaseDAO { protected final Logger logger = Logger.getLogger(getClass()); protected final DBManager db = DBManager.getDbManager(); protected Connection conn; public AbstractBaseDAO() throws SQLException, ClassNotFoundException { conn = db.createConn(); } /** * 关闭连接,不捕获异常 */ public void closeConnQuiet() { if (conn != null) { try { conn.close() ; logger.debug("close connection success!!") ; } catch (SQLException e) { logger.warn("close connection fail"+e) ; //e.printStackTrace(); } } } }
userDao实现类,这个类中就没有覆写closeConnQuiet方法 package com.justsy.mdm.dao.impl; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.justsy.mdm.dao.AbstractBaseDAO; import com.justsy.mdm.dao.IUserDAO; import com.justsy.mdm.permission.Resource; import com.justsy.mdm.permission.Role; import com.justsy.mdm.permission.User; import com.justsy.mdm.permission.comparator.Function; import com.justsy.mdm.permission.comparator.FunctionFactory; public class UserDAO extends AbstractBaseDAO implements IUserDAO { public UserDAO() throws SQLException, ClassNotFoundException { super(); } @Override public User login(String name, String password) throws SQLException { logger.debug("user login username:" + name + ",password:" + password); String sql = "select * from user where name=? and password=?"; PreparedStatement pstmt = db.prepare(conn, sql); ResultSet rs = db.getResult(pstmt, new Object[] { name, password }); User user = null; while (rs.next()) { user = new User(); int userId = rs.getInt(1); String userName = rs.getString("name"); user.setId(userId); user.setName(userName); sql = "select * from role where id in (select roleid from user_role where userid=?)"; PreparedStatement rolePstmt = db.prepare(conn, sql); ResultSet roleRs = db.getResult(rolePstmt, new Object[] { userId }); Role role = null; while (roleRs.next()) { role = new Role(); long roleId = roleRs.getLong("id"); String roleName = roleRs.getString("name"); role.setId(roleId); role.setName(roleName); // user中添加角色 user.getRoles().add(role); // function sql = "select f.id funId,f.name funName,r.id resId,r.name resName from function f join resource r on f.resid = r.id and f.id in (select funid from role_function where roleid=?)"; PreparedStatement funPstmt = db.prepare(conn, sql); ResultSet funRs = db.getResult(funPstmt, new Object[] { roleId }); Function function = null; Resource resource = null; while (funRs.next()) { resource = new Resource(); long resId = funRs.getLong("resId"); String resName = funRs.getString("resName"); resource.setId(resId); resource.setObject(resName); String funName = funRs.getString("funName"); // 得到默认的操作 function = FunctionFactory.getDefaultFunction(funName, resource); role.getFunctions().add(function); } db.close(funPstmt, funRs); } db.close(rolePstmt, roleRs); } // db.close(conn, pstmt, rs); db.close(pstmt, rs); return user; } // public static void main(String[] args) throws SQLException, // ClassNotFoundException { // UserDAO dao = new UserDAO(); // dao.logger.debug("12") ; // System.out.println(dao.conn); // } }
相关文章推荐
- 抽象类、抽象方法、接口的区别及实现
- 编写Animal接口,接口中声明run()方法; 2)定义Bird类和Fish类实现Animal接口; )编写Bird类和Fish类的测试程序,并调用其中的run()方法
- 1)编写Animal接口,接口中声明run()方法; 2)定义Bird类和Fish类实现Animal接口; 3)编写Bird类和Fish类的测试程序,并调用其中的run()方法
- 14. JAVA 枚举(Enum、类集EnumMap&EnumSet 、实现接口、定义抽象方法) ----- 学习笔记
- 1)编写Animal接口,接口中声明run()方法; 2)定义Bird类和Fish类实现Animal接口; 3)编写Bird类和Fish类的测试程序,并调用其中的run()方法
- PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
- 关于抽象类和接口中含有相同方法的实现的一点思考
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
- android studio 查看 类 接口 定义的方法实现方法 快捷键
- 1)编写Animal接口,接口中声明run()方法; 2)定义Bird类和Fish类实现Animal接口; 3)编写Bird类和Fish类的测试程序,并调用其中的run()方法
- /*1)编写Animal接口,接口中声明run()方法; 2)定义Bird类和Fish类实现Animal接口; 3)编写Bird类和Fish类的测试程序,并调用其中的run()方法 */
- 定义一个接口,再定义类实现该接口,编写应用程序,调用接口中的 3 个方法,并将调用方法所得的结果输出。
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
- C#多态的实现:虚方法、抽象类、接口
- VC实现java定义的接口的一些方法
- 为什么抽象类实现接口的时候不需要重写接口里的方法?
- 抽象类、接口的区别 和 抽象类可以不实现接口的全部方法
- 抽象类、接口的区别 和 抽象类可以不实现接口的全部方法
- python 之浅谈接口的定义和抽象类以及抽象方法
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类