Java开发———DAO设计模式及优化

Java开发者转型大模型Agent开发的45天速成指南 大模型Agent技术正在重塑软件开发范式,其核心原理是通过工程化方法将大语言模型(LLM)能力整合到业务系统中。作为分布式系统的一种新形态,Agent技术实现了自然语言处理与传统软件架构的深度融合,在客服机器人、智能推荐等场景展现巨大价值。Java开发者凭借Spring生态和工程化思维优势,可以快速掌握LangChain4j等开发框架,通过Prompt工程和RAG架构实现业务智能化升级。本文提供的45天转型路线涵盖从基础概念到电商推荐系统实战,特别适合需要提升AI能力的Java全栈工程师。 阅读详情

什么是DAO?

DAO是Data Access Object 数据访问接口,顾名思义:就是与数据库打交道。夹在业务逻辑与数据资源的中间。

DAO模式有哪些?

DAO模式实际上是两个模式的组合 既Data Accessor 模式和Active Domain Object模式。

它们的意义和作用

Data Accessor模式实现了数据访问和业务逻辑的分离,Active Domain Object 模式实现了业务数据的对象化封装。
以javaWeb中对数据库的为例:
首先预先准备一个工具类DBUtils.class

public class DBUtils {
    public final static String URL="jdbc:mysql://localhost:3306/mydb";
    public final static String USERNAME="root";//用户名
    public final static String  PASSWORD="*****";//密码
    public final static String DRIVER="com.mysql.jdbc.Driver";
    private DBUtils(){
    }
    //使用静态快加载驱动
    static{
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //定义一个获取数据库连接的方法
    public static Connection getconnection() {
        Connection connection=null;
        try {
        connection=DriverManager.getConnection(URL, USERNAME, PASSWORD);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("获取连接失败");
        }
        return connection;

    }
    public static void close(ResultSet rs,Statement statement,Connection conn){
         if (rs!=null)
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            if (statement!=null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }   
            }
            if (conn!=null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            }}      

接下来我们要来实现Dao模式

一个典型的DAO模式有以下几个组件:一个接口,数据传递对象或者领域模型,
先建立一个类 person.class 数据模型类

public class Person {
    private int id;
    private String name;
    private int age;
    private String description;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public Person( String name, int age, String description) {
        super();
        this.name = name;
        this.age = age;
        this.description = description;
    }
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    @Override
    public String toString() {
        return "person [id=" + id + ", name=" + name + ", age=" + age + ", description=" + description + "]";
    }

声明一个接口,数据操作类 PersonDao.class

import java.sql.SQLException;
import java.util.List;
import com.vince.domain.Person;
public interface PersonDao {
public void add(Person p) throws SQLException;//这里需要抛出异常;否则在下面操作的时候会报错!!!!
public void update(Person p) throws SQLException;
public void delete(int id) throws SQLException;
public Person findById(int id) throws SQLException;
public List<Person> findAll() throws SQLException;
}

编写接口的实现类 PersonDanImpl.class

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.util.db.DBUtils;
import com.util.db.JdbcTemplete;
import com.vince.base.ResultSetHandler;
import com.vince.dao.PersonDao;
import com.vince.domain.Person;

public class PersonDaoImpl implements PersonDao {
private JdbcTemplete jdbcTemolete;
    public PersonDaoImpl() {
        jdbcTemolete=new JdbcTemplete();
}
    @Override
    public void add(Person p) throws SQLException {
        Connection connection=null;
        PreparedStatement ps=null;
        String sql="insert into person(name,age,description)values(?,?,?)";
        try {
        connection=DBUtils.getconnection();
        ps=connection.prepareStatement(sql);
        ps.setString(1, p.getName());
        ps.setInt(2, p.getAge());
        ps.setString(3, p.getDescription());
        ps.executeUpdate();
    } catch (SQLException e) {

        throw new SQLException("数据库添加异常");
    }finally {
        DBUtils.close(null, ps, connection);
    }

        }
@Override
    public void update(Person p) throws SQLException {
    Connection connection=null;
        PreparedStatement ps=null;
        String sql="update person set name=?,age=?,description=? where id=?";
        try {
        connection=DBUtils.getconnection();
        ps=connection.prepareStatement(sql);
        ps.setString(1, p.getName());
        ps.setInt(2, p.getAge());
        ps.setString(3, p.getDescription());
        ps.setInt(4, p.getId());
        ps.executeUpdate(); 
    } catch (SQLException e) {
            throw new SQLException("数据库更新异常");
    }finally {
        DBUtils.close(null, ps, connection);
    }   
    }
    @Override
    public void delete(int id) throws SQLException {
        Connection connection=null;
        PreparedStatement ps=null;
        String sql="delete from person where id=?";
        try {
        connection=DBUtils.getconnection();
        ps.setInt(1,id);
        ps.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
        throw new SQLException("数据库删除异常");
    }finally {
        DBUtils.close(null, ps, connection);
    }
    }

@Override
    public List<Person> findAll() throws SQLException {
         Connection connection=null;
           PreparedStatement ps=null;
           ResultSet rs=null;
           Person p=null;
           List<Person> persons=new ArrayList<Person>();
            String sql="selectid,name,age,description from person";
            try {
                connection=DBUtils.getconnection();
                ps=connection.prepareStatement(sql);
                rs=ps.executeQuery();
                while(rs.next()){
                    p=new Person();
                    p.setId(rs.getInt(1));
                    p.setName(rs.getString(2));
                    p.setAge(rs.getInt(3));
                    p.setDescription(rs.getString(4));
                    persons.add(p);
                    }
                } catch (SQLException e) {
                // TODO: handle exception
                throw new SQLException("查询所有数据异常");
            }finally {
                DBUtils.close(rs, ps, connection);
            }
            return persons; }
}

上面就是DAO模式的实现过程。这种DAO设计模式主要是可以让我们写的代码,更加简洁,冗余小,实现了软件设计设计模式中的一条规则:高内聚,低耦合;下面呢?我们来思考能不能继续优化DAO设计模式的实现,

新建一个类,JdbcTemplete .class 来再做个一个提炼 抽象;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.vince.base.ResultSetHandler;
public class JdbcTemplete {
public int update(String sql,Object ...args){
Connection connection=null;
PreparedStatement ps=null;
try {
connection=DBUtils.getconnection();
ps=connection.prepareStatement(sql);
if (args!=null) {
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
}
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
return 0;
}finally {
DBUtils.close(null, ps, connection);
}
}
public Object query(String sql,ResultSetHandler handler,Object...args){
Connection connection=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
connection=DBUtils.getconnection();
connection.prepareStatement(sql);
if (args!=null) {
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
}
rs=ps.executeQuery();
return handler.doHandler(rs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}

所有类的父类是Objects 有多个参数, 所有我们使用Object …args;
接下来在PersonDaoImpl.class类中,我们就可以使用我们提取处在的抽象类了 嘻嘻~ 是不是代码简单多了~~ 向对于数据库的增删 更新的操作都可以使用类似的方法,

@Override
    public void add(Person p) throws SQLException {
        String sql="insert into person(name,age,description)values(?,?,?)";
        jdbcTemolete.update(sql, p.getName(),p.getDescription());   
    }

对于一个需要从数据库查询的操作,在查询的操作,需要用道 ResultSet这个方法的
我们这里定义一个接口ResultSetHandler.class;

import java.sql.ResultSet;
import java.sql.SQLException;

public interface ResultSetHandler {
    public Object doHandler(ResultSet rs)throws SQLException;
}

**在JdbcTemplete.class中的query这个方法中 就需要用的这个接口
在PersonDaoImpl.class中这个查询方法,我们就可以这样写了**

@Override
    public Person findById(final int id) throws SQLException {

        String sql="select name,age,description from person where id=?";
      return  (Person) jdbcTemolete.query(sql, new ResultSetHandler() {

        @Override
        public Object doHandler(ResultSet rs)throws SQLException {
             Person p=null;
                if(rs.next()){
                    p=new Person();
                    p.setId(id);
                    p.setName(rs.getString(1));
                    p.setAge(rs.getInt(2));
                    p.setDescription(rs.getString(3));                                    }
            return p;
        }
    },id);
    }

最后 就是弄一个main 方法 来使用我们定义好 对数据操作的方法喽

有什么错误需要改正欢迎指出,共同学习
有什么错误需要改正欢迎指出,共同学习

Java数据访问层代码精简实战 本文还有配套的精品资源,点击获取 简介:在Java开发中,数据访问层负责数据库交互和CRUD操作,精简此层代码可提升代码可维护性、可读性和效率。使用ORM框架如Hibernate和MyBatis,DAO设计模式,泛型,动态SQL,存储过程,事务管理,分页查询,缓存机制,代码生成工具以及单元测试,均能有效减少数据访问层代码。本篇文章将介绍具体方法和最佳实践,帮助开发者优化代码... 阅读详情

相关推荐

全面掌握JAVA进销存管理系统开发

随着信息技术的快速发展,进销存管理系统成为企业日常运作中不可或缺的一部分。企业通过进销存系统管理商品的进货、销售及库存,提高工作效率,优化资源配置。JAVA作为一种稳定、跨平台的编程语言,被广泛应用于企业级应用开发中,其中进销存系统就是典型代表。进销存系统不仅要求能够处理大量的数据,还要求系统具有高可用性和可扩展性。JAVA语言由于其出色的性能和健壮的生态系统,为构建可靠的进销存系统提供了坚实的基础。通过使用JAVA,开发者可以构建出具有企业所需的安全性、稳定性及高效性的进销存管理系统。

weixin_28746213的博客 419

DAO设计模式讲解—四层模型,分层设计模式

1.程序的分层 如果对程序进行划分,那么最常见的划分方式:显示层+控制层+业务鞥+数据层,其中,显示层和控制层一般称为前台,业务层和数据层成为后台业务层。 在整个项目之中,后台业务是最核心的部分,因为移动应用的火爆问题,前台所以对于前台层不再简单局限于WEB层,可能是Android,IOS,而且随着技术的发展。前台可能使用Python或者Node.js进行包装。 业务层是整个程序提供的操

qq_37759895的博客 7126

iStudent学生管理系统深入解析

数据库是存储数据的仓库,它的出现极大地提高了数据管理的效率。数据库管理系统(DBMS)是用于创建、管理和操作数据库的应用软件。通过DBMS,用户可以对数据库进行增删改查等操作,使得数据存储更加集中化、规范化,并保证数据的安全性与完整性。结构化查询语言(SQL)是一种用于与关系型数据库进行交互的通用语言。SQL包含了一系列用于数据操作的指令,如SELECT、INSERT、UPDATE、DELETE等,这些指令允许用户执行各种数据库操作。

weixin_42163404的博客 679

什么是dao模式,dao模式的实现方法

http://blog.youkuaiyun.com/wuyueyuljh/article/details/7561863 dao设计模式简介 dao全称是data access object,数据库访问对象,主要的功能就是用于进行数据操作的,在程序的标准开发架构中属于数据层的操作 企业分层架构 客户层:因为现在都采用了B/S开发架构,所以一般都使用浏览器进行访问。 显示层:使用JSP/Servle...

weixin_30827565的博客 909

Java企业级代码自动生成工具ModelsTry3.1

随着软件行业的发展,企业对开发效率和软件质量的要求越来越高。Java代码自动生成工具应运而生,它通过自动化手段快速生成重复性代码,使得开发人员能够专注于业务逻辑和设计,而无需浪费大量时间编写模板化代码。在多个成功案例中,我们可以观察到集成框架带来的好处。以一个电子商务平台为例,该平台采用了Struts2作为前端控制器,Spring作为业务逻辑层的核心,并利用Hibernate来处理数据持久化。这种架构不仅提高了开发速度,还使得应用在扩展性和性能上都得到了优化。

weixin_42668301的博客 422

Java+MySQL电梯维保信息化管理系统实战课程设计

htmltable {th, td {th {pre {简介:电梯维保信息化管理系统是利用Java和MySQL构建GUI,实现电梯维护管理的高效监控。系统涉及Java编程语言、MySQL数据库、图形用户界面、系统架构与设计模式、数据访问对象(DAO)、实体类、安全性与权限控制、异常处理与日志记录,以及测试与部署。本课程设计项目将引导学生通过实践掌握这些关键知识点,并理解软件工程流程,最终提供一个易于管理、安全可靠且便于使用的电梯维保系统。

weixin_36238982的博客 1031

DAO模式的理解

例如,

等什么君!的博客 1545

Java泛型DAO设计模式详解与实践

数据访问对象(Data Access Object,简称DAO)是软件设计模式中的一种,用于将低级数据访问层与高级业务逻辑层分离的一种抽象。DAO模式通常通过封装数据库操作(如CRUD:创建、读取、更新、删除),以简化业务逻辑层的代码。DAO通常包含了与数据库交互所需的所有方法,它能将数据源的变化对业务逻辑层的影响降到最低,增强系统的可维护性和可扩展性。在Java中,DAO通常通过接口与实现类来定义,使得具体的数据访问逻辑与业务逻辑代码分离,从而提高了代码的可维护性。

weixin_30598047的博客 1107

一篇带你走进程序设计的准则——DAO和MVC设计模式

DAO(Data Access Object,数据访问对象)的主要功能就是操作数据库,也就是数据的增删改查。接下来分别介绍每一层的功能。(1)客户层:目前采用B/S开发架构居多,客户使用浏览器访问,当然也可以使用别的工具访问。(2)显示层:使用JSP/Servlet进行页面显示。(3)业务层:负责将DAO层的操作进行组合,形成一个完整的业务逻辑。(4)数据层:提供原子性操作,比如增加、删除、修改、查询。那么Model、View、Controller分别在应用程序中代表什么呢?

H215919719的博客 4056

一个DAO通用模型

一个DAO通用模型,包含典型的连接池设计,是一个初学入门很好的例子

一个AI Agent顶十个软件,toB赛道正在大洗牌

一个AI Agent顶十个软件,toB赛道正在大洗牌

ith321的博客 1331

DAO模型

DAO模型 前面我们在使用JDBC时解决的都是一些很简单的问题,例如登录,注册等等,所以有些例直接把代码写在了main方法中。这种写法很容易出现代码臃肿,耦合度高,不能模块化开发等诸多弊端,特别是将来我们做大型实战项目时该怎么办呢?这些业务会更加复杂。DAO模式就可以解决这个问题。 DAO:数据存取对象,它是位于业务逻辑和底层数据库之间, 专门使用JDBC实现数据库持久化的一种...

weixin_30414635的博客 453

保姆级教程:用Python+MM-Agent搭建自己的数学建模AI助手(支持GPT-4o/DeepSeek)

本文提供了一份详细的教程,教你如何使用Python和MM-Agent框架搭建数学建模AI助手,支持GPT-4o和DeepSeek-R1等LLM后端。从环境配置、HMML知识库集成到多LLM适配和建模流程实现,手把手教你构建智能建模系统,提升数学建模效率。

k6l7m8n9的博客 452

java面试题(71-85)

摘要:这一部分主要包括了UML(统一建模语言)、面向对象的设计原则(六原则一法则)、GoF设计模式、企业级设计模式、JDBC(Java数据库连接)、XML(可扩展标记语言)等知识。 71、UML是什么?UML中有哪些图? 答:UML是统一建模语言(Unified Modeling Language)的缩写,它发表于1997年,综合了当时已经存在的面向对象的建模语言、方法和过程,

java程序员之路 1528

SAP FICO 银企直连

银企直联或者自动付款的目的是和银行做一个接口,把SAP中的到期应付款(也包括预付款)按照一定格式(银行要求的)在审批后发送给银行,请银行按照这个付款指定进行付款,并跟踪付款状态的过程,这个过程在SAP中如何实现呢?根据个人项目经验,客户需求可分为如下三种: 1. 第一种是完全不自动方式,仅批量生成付款凭证,实际的付款还是通过原来的流程执行,和银行没有任何接口; 2. 第二种是半自动方式,这种方式下需要按照银行的要求的格式生成付款条件,然后把付款文件下载下来,通过企业版的网银接口把付款文件进行上载,提交后

IamRunjiang的博客 9291

Oracle数据库安装及配置(Oracle19c)

Windows 10安装Oracle 19c教程

weixin_69200200的博客 2万+

Java开发之JDBC学习分享

数据库的操作步骤: 1:导入数据库的驱动jar包----> 导入实现类 2:加载驱动 -----> 告诉他我要连接哪个数据库 3:获得连接------>让我和数据库发生关系 4:获得预处理语句对象->让我 发送sql指令到数据库 5:执行SQL命令;--->预处理语句对象.execute("SQL 命令行"); 6:释放资源 -------> 切断我和数据库的联系 import java.sql.Connection; import java.sql.Dr

m0_58371965的博客 178

从零构建安全通信:mbedtls与ECDSA在嵌入式系统中的实战指南

本文详细介绍了如何在嵌入式系统中使用mbedtls和ECDSA实现安全通信,重点探讨了ECDSA相比RSA的优势、mbedtls的模块化裁剪策略、密钥安全存储方案以及完整的签名验签流程。通过实战案例和优化技巧,帮助开发者在资源受限环境下构建高效可靠的安全通信系统。

weixin_28338005的博客 685

ssm细节

Controller层调用Service层,Service层调用Dao层。尽量将代码放到启动类所在的包或子包下。

m0_56428218的博客 97

Linux ARM平台开发系列讲解(网络篇)1.3 MDIO总线设备device和设备driver匹配

在设备和驱动都载入内核后,设备和驱动是如何匹配起来的呢?其实他们就是通过的唯一标识phyID进行匹配phy_dev和phy_drv是通过phy_bus_match函数进行匹配,匹配成功后会建立链表链接,具体流程如下图: 返回总目录......

DSMGUOGUO的博客 1098

42、使用mmrotate中k3det进行旋转目标检测,并进行mnn部署和ncnn部署

基本思想:仍然是身份证分割,并进行ncnn和mnn的c++的部署开发

sxj731533730 5711

SSM学习36:编程思想总结(重点)

AOP(Aspect Oriented Programming)面向切面编程。

weixin_51330376的博客 393

DMC-E 系列总线控制卡----雷赛板卡介绍(十七)

低的速度平稳地接近目标位置,降低运动部件对接触点的冲击。设置插补目标位置,插补方向,以确定插补动作。圆形区域限位,即运动仅在用户设定的圆形范围内进行,超出这个范围,运动会依据设定。首先,用户需要绑定两个轴进而确定该功能所处的坐标系。仅支持平面圆形限位,不支持空间圆形限位。径,可以确定该区域在坐标系中的位置。)运动开始前,用户应当将旋转轴调整到与插补曲线的起点位置相切的角度;可以配合椭圆插补或圆弧插补运动,实现跟随轴的旋转运动角度与曲线当前。外,其它运动形式若开始运动时在限位区域外,则禁止运动;

A_nanda的博客 653

Android代码规范

JAVA代码规范 强制性规范: 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 类名使用UpperCamelCase 风格,必须遵从驼峰形式。 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清...

weixin_34095889的博客 110

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

DAO开发实战业务分析

阿里云大学:DAO开发实战业务分析 本课程是由Java SE向Java WEB学习的过渡课程,为了更好的巩固Java SE中所学习到的各项技术,同时也为了更完整的阐述Java在整个项目开发中的核心意义,所以讲解了综合的DAO设计模式。 在学习本课程之前请确保已经学习了:《Oracle从入门到精通》、《Java8编程入门》、《Java8面向对象编程》、《Java8高级编程》几门课程,并且已经熟练...

weixin_40050195的博客 148

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

AI编程助手实战指南:从副驾驶定位到Spring Boot集成,提升开发效率

在软件工程领域,自动化工具和智能辅助技术正深刻改变开发工作流。其核心原理是基于大规模代码和自然语言数据训练的大语言模型,能够理解开发者意图并生成、解释或优化代码片段。这类技术的核心价值在于将开发者从重复性、模式化的编码任务中解放出来,显著提升开发效率与代码一致性,同时辅助学习与问题排查。典型的应用场景包括快速生成样板代码(如CRUD接口)、解释复杂逻辑、调试错误以及进行技术方案咨询。以当前流行的AI编程助手为例,它们并非替代开发者,而是作为“副驾驶”深度集成到日常开发中。本文将以Spring Boot项目开

weixin_33139275的博客 223

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 记录Error:Execution failed for task ':app:transformClassesWithDexForDebug'. > 的解决方法
下一篇: 关于机器学习在线预测的任务学习笔记
linjunjj
博客等级 码龄11年 3粉丝 4原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值