JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(中)

简介: JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)

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

目录
相关文章
|
11月前
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
866 2
|
SQL Java 关系型数据库
使用 JDBC 实现 Java 数据库操作
JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,允许通过 SQL 语句与数据库交互。本文详细介绍了 JDBC 的使用方法,包括环境准备、编程步骤和完整示例。
1392 7
|
SQL Java 数据库连接
【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢
由于网络带宽不足导致的jdbc向yashandb插入数据慢
|
SQL Java 数据库连接
JDBC编程安装———通过代码操控数据库
本文,教你从0开始学习JBCD,包括驱动包的下载安装调试设置,以及java是如何通过JBDC实现对数据库的操作,以及代码的分析,超级详细
|
12月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
661 158
|
12月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
12月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1760 152
|
12月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1190 156
|
12月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
780 156
|
12月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
833 161