DAO设计模式

概念:DAO(Data Access Object) 数据库访问对象,**面向数据库SQL操作**的封装。

(一)场景

问题分析

在实际开发中,针对一张表的复杂业务功能通常需要和表交互多次(比如转账)。如果每次针对表的简单操作我们都写一遍,代码中会出现大量的代码冗余。

解决思路

将重复的SQL操作提炼至方法中,达到一条SQL操作多次复用的目的

(二)DAO编程

核心思想

DAO模式目的就是将SQL语句转化为通用SQL语句,并封装成Java方法、提高代码复用性。

编码规范:

  • ① 一张表的操作对应一个DAO

  • ② 一个通用的SQL封装成一个方法,方法名和对应sql关键词一致,且望文生义

    操作 Java 数据库
    新增 insertXxx(Xxx x) insert into ...
    删除 deleteXxxxxId(Integer id) delete from ...
    更新 updateXxx(Xxx x) update t_xxx set ...
    查询单个 Xxx selectXxxxxId(Integer id) select * from ...
    查询多个 List<Xxx> selectXxxs() select * from ...
  • ③ 具体实现采用dao接口+impl实现类的形式(目的为提升代码扩展性和维护性

    • ① 接口中做方法声明的约束

    • ②实现类中利用JDBCTemplate做具体实现

    • ③ 接口命名:对应实体类名+Dao,例如表t_person,DAO命名为PersonDAO

    • ④ 实现类名:接口名+Impl,如PersonDAOImpl

    • ⑤ 接口存放在dao包下

    • ⑥ 实现类需要存放在dao.impl包下

示例

编写一个关于Person表的DAO操作类。

  • 简化版

    package com.xx.dao;

    import com.xx.entity.Account;

    import java.util.List;

    /**

    • t_account表的所有SQL操作
      /
      public interface AccountDao {
      /
      *
      • 根据账户名查询账户信息
      • @param accName 被查询的账户名
      • @return 对应的账户对象
        /
        Account selectAccountxxAccountName(String accName);

        /
        *
      • 根据账户名修改账户信息
      • @param account 包含了被修改的账户名和修改后的余额 的对象
      • @return 受影响的行数
        /
        int updateAccountxxAccountName(Account account);

        /
        *
      • 新增账户信息
      • @param account 包含所有信息的对象
      • @return 受影响的行数
        /
        int insertAccount(Account account);

        /
        *
      • 根据账户id删除账户信息
      • @param id 被删除的id
      • @return 受影响的行数
        /
        int deleteAccountxxAccountId(int id);

        /
        *
      • 查询所有账户信息
      • @return 账户对象的list集合
        */
        List selectAccounts();

        }
  • 详细代码:结合JDBCUtils

    package com.xx.dao.impl;

    import com.xx.dao.AccountDao;
    import com.xx.entity.Account;
    import com.xx.util.JDBCUtils;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;

    import javax.sql.DataSource;
    import java.util.List;

    public class AccountDaoImpl implements AccountDao {
    @Override
    public Account selectAccountxxAccountName(String accName) {
    //获取JDBCTemplate
    JdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();
    String sql1 = "select * from t_account where account_name=?";
    //查询转出人信息
    List list = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(Account.class), accName);
    //集合内容为空为返回null,内容不为空将对应对象获取返回
    return list.isEmpty() ? null : list.get(0);
    }

    @Override
    public int updateAccountxxAccountName(Account account) {
    //获取JDBCTemplate
    JdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();

    String sql = "update t_account set balance=? where account_name=?";
    //执行sql
    int n = jdbcTemplate.update(sql, account.getBalance(), account.getAccountName());
    return n;
    }

    @Override
    public int insertAccount(Account account) {
    //获取JDBCTemplate
    JdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();
    //书写sql
    String sql = "insert into t_account(account_name,account_password,balance) values(?,?,?)";
    //执行sql
    int n = jdbcTemplate.update(sql, account.getAccountName(), account.getAccountPassword(), account.getBalance());
    return n;
    }

    @Override
    public int deleteAccountxxAccountId(int id) {
    //获取JDBCTemplate
    JdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();

    String sql = "delete from t_account where account_id=?";
    //执行sql
    return jdbcTemplate.update(sql, id);
    }

    @Override
    public List selectAccounts() {
    //获取JDBCTemplate
    JdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();

    String sql = "select * from t_account";
    return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Account.class));

    }
    }

相关推荐
福大大架构师每日一题27 分钟前
Redis 8.10.0 正式发布:紧凑哈希、批量导入、备份恢复、流与时序能力全面升级
数据库·redis·哈希算法
雨晨源码(同名B站)1 小时前
基于深度学习YoloV11农业病害虫害检测系统 智慧农业信息化综合管理平台 (附源码+lw文档+ppt)
数据库·人工智能·深度学习·yolo·信息可视化
DBA小马哥2 小时前
向量数据库入门到进阶:Embedding、ANN算法与RAG落地的关键术语
数据库·算法·embedding
云和数据.ChenGuang2 小时前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
祈禾2 小时前
Redis三大特殊数据类型
运维·服务器·数据库·redis·笔记·缓存
东方护航数据恢复(深圳)2 小时前
MySQL_Oracle数据库崩溃修复全攻略_东方护航数据恢复深圳店
数据库·mysql·oracle
y = xⁿ3 小时前
一文掌握Redis常见八股
数据库·redis·缓存
Cloud云卷云舒3 小时前
HaishanDB(海山)|磐维数据库|YashanDB(崖山)深度对比分析
数据库·人工智能·海山数据库·haishandb·移动云海山数据库
weixin_460443563 小时前
企业考试系统如何对接OA、钉钉和企业微信?SSO单点登录、组织同步与权限一致性设计
java·开发语言·数据库
xywww1683 小时前
真实后台页实测:Opus 5 看图写前端的可用边界在哪
linux·服务器·前端·数据库·人工智能·gpt