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

目录
相关文章
|
16天前
|
存储 安全 搜索推荐
酒店管理系统的数据库的应用以及选择
酒店管理系统数据库关乎运营效率和服务质量。数据库用于数据存储、管理、分析及客户关系管理,确保房态与预订精准。选择时重视性能稳定性、数据安全、易用性、可扩展性和成本效益。合适的数据库能提升酒店运营效率并优化客户体验。
22 2
|
16天前
|
存储 中间件 关系型数据库
数据库切片大对决:ShardingSphere与Mycat技术解析
数据库切片大对决:ShardingSphere与Mycat技术解析
25 0
|
3天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
3天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
3天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
10天前
|
存储 数据库连接 数据处理
NumPy与数据库的结合应用探索
【4月更文挑战第17天】本文探讨了NumPy与数据库结合在数据处理和分析中的应用,阐述了结合使用的必要性,包括数据提取、转换、处理与分析及结果存储。通过Python数据库连接库提取数据,转化为NumPy数组进行高效计算,适用于金融等领域的数据分析。结合应用的优势在于高效性、灵活性和可扩展性,但也面临数据转换、性能优化和安全性挑战。
|
11天前
|
存储 SQL 安全
6.数据库技术基础
6.数据库技术基础
|
8天前
|
关系型数据库 MySQL 分布式数据库
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
45 2
|
24天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
105 0
|
24天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)

热门文章

最新文章