JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(上):https://developer.aliyun.com/article/1419274
3 获取数据库连接方法
public static Connection getConnection() throws Exception { Connection conn = null; conn = ds.getConnection(); return conn; }
4 释放数据库连接方法
public static void close(Connection conn,Statement statement) throws Exception { try { if (statement!=null) { statement.close(); } } catch (SQLException e) { e.printStackTrace(); }finally { if (conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
应用程序分层
应用程序分层简介
应用程序分层是指通过创建不同的包来实现项目的分层,将项目中 的代码根据功能做具体划分,并存放在不同的包下。
三层结构
三层结构就是将整个业务应用划分为:表述层、业务逻辑层 、数据访问层。区分层次的目的即为了“高内 聚低耦合”的思想。在软件体 系架构设计中,分层式结构是最常见,也是最重要的一种结构。
分层优点
1 分层结构将应用系统划分为若干层,每一层只解决问题的一部 分,通过各层的协作提供整体解决方案。大的问题被分解为一系 列相对独立的子问题,局部化在每一层中,这样就有效的降低了 单个问题的规模和复杂度,实现了复杂系统的第一步也是最为关 键的一步分解。
2 分层结构具有良好的可扩展性,为应用系统的演化增长提供了一 个灵活的支持,具有良好的可扩展性。增加新的功能时,无须对 现有的代码做修改,业务逻辑可以得到最大限度的重用。
3 分层结构易于维护。在对系统进行分解后,不同的功能被封装在 不同的层中,层与层之间的耦合显著降低。因此在修改某个层的 代码时,只要不涉及层与层之间的接口,就不会对其他层造成严 重影响。
分层命名
表述层:web或controller
业务层:service
数据访问层:dao (Data Access Object)
应用程序分层实现
在分层项目中实现查询业务
UserDao接口
public interface UsersDao { /** * 根据用户ID查询用户 * */ Users selectUsersById(int userid); }
UserDaoImpl接口实现类
public class UsersDaoImpl implements UsersDao { /** * 根据用户ID查询用户 * @param userid * @return */ @Override public Users selectUsersById(int userid) { Connection conn =null; PreparedStatement ps = null; ResultSet rs = null; Users users = null; try{ conn = JdbcDruidUtil.getConnection(); ps = conn.prepareStatement("select * from users where userid = ?"); ps.setInt(1,userid); rs = ps.executeQuery(); while(rs.next()){ //手动orm映射 users = new Users(); users.setUserid(rs.getInt("userid")); users.setUsername(rs.getString("username")); users.setUserage(rs.getInt("userage")); } }catch(Exception e){ e.printStackTrace(); //通过自定义异常解决异常耦合问题 throw new ApplicationException(e.getMessage()); }finally{ JdbcDruidUtil.closeResource(rs,ps,conn); } return users; } }
UserService接口
public interface UsersService { Users findUsersById(int userid); }
UserServiceImpl接口实现类
public class UsersServiceImpl implements UsersService { /** * 根据用户ID查询用户业务 * @param userid * @return */ @Override public Users findUsersById(int userid) { UsersDao ud = new UsersDaoImpl(); return ud.selectUsersById(userid); } }
web
public class Test { public static void main(String[] args) { UsersService us = new UsersServiceImpl(); Users u = us.findUsersById(1); System.out.println(u); } }
封装通用的BaseDao
封装通用的DML操作
BaseDao接口
/** * 通用接口 */ public interface BaseDao { /** * 通用的DML操作方法 */ int executeUpdate(String sql,Object[] param); }
BaseDaoImpl接口实现类
/** * 通用接口实现类 */ public class BaseDaoImpl implements BaseDao { /** * 通用的DML操作方法 */ @Override public int executeUpdate(String sql, Object[] param) { Connection conn = null; PreparedStatement ps = null; int row; try{ conn = JdbcDruidUtil.getConnection(); ps = conn.prepareStatement(sql); //得到参数的个数 ParameterMetaData pd = ps.getParameterMetaData(); for(int i =0;i<pd.getParameterCount();i++){ ps.setObject(i+1,param[i]); } row = ps.executeUpdate(); }catch (Exception e){ e.printStackTrace(); //通过自定义异常解决异常耦合问题 throw new ApplicationException(e.getMessage()); }finally{ JdbcDruidUtil.closeResource(ps,conn); } return row; } }
UsersDao接口
public interface UsersDao extends BaseDao { /** * 根据用户ID查询用户 * */ Users selectUsersById(int userid); /** * 修改用户信息 */ int updateUsersById(Users users); }
UsersDaoImpl接口实现类
public class UsersDaoImpl extends BaseDaoImpl implements UsersDao { /** * 根据用户ID查询用户 * @param userid * @return */ @Override public Users selectUsersById(int userid) { Connection conn =null; PreparedStatement ps = null; ResultSet rs = null; Users users = null; try{ conn = JdbcDruidUtil.getConnection(); ps = conn.prepareStatement("select * from users where userid = ?"); ps.setInt(1,userid); rs = ps.executeQuery(); while(rs.next()){ //手动orm映射 users = new Users(); users.setUserid(rs.getInt("userid")); users.setUsername(rs.getString("username")); users.setUserage(rs.getInt("userage")); } }catch(Exception e){ e.printStackTrace(); //通过自定义异常解决异常耦合问题 throw new ApplicationException(e.getMessage()); }finally{ JdbcDruidUtil.closeResource(rs,ps,conn); } return users; } /** * 修改用户信息 */ @Override public int updateUsersById(Users users) { String sql = "update users set userage = ? where userid = ? "; Object[] param = new Object[] {users.getUserage(),users.getUserid()}; return this.executeUpdate(sql,param); } }
封装通用的查询操作
BaseDao接口
/** * 通用接口 */ public interface BaseDao { /** * 通用的DML操作方法 */ int executeUpdate(String sql,Object[] param); /** * 通用查询方法 * 要求:实体类的属性名必须要与表的列名相同。 */ <T> List<T> select(String sql,Object[] param,Class<T> clazz); }
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(下):https://developer.aliyun.com/article/1419276