25.Spark大型电商项目-用户访问session分析-DAO模式讲解以及TaskDAO开发

目录

DAO模式

编写业务代码 

Task.java

ITaskDAO.java

TaskDAOImpl.java


本篇文章将介绍DAO模式。

DAO模式

Data Access Object:数据访问对象

首先,你的应用程序,肯定会有业务逻辑的代码。在三层架构的web系统中,业务逻辑的代码,就是在你的Service组件里面;在我们的spark作业中,业务逻辑代码就是在我们的spark作业里面。

如果说,你不用DAO模式的话,那么所有的数据库访问的代码和逻辑会全部耦合在业务逻辑代码里面。比如,你的业务逻辑代码中,可能会充斥着JDBCHelper,定义SQL语句,处理查询返回结果等等代码。会导致业务逻辑和数据访问严重耦合。导致以后如果你只是想修改数据访问的代码,那么还得在一大堆业务逻辑的代码中去找,找到这段代码,然后去做对应的修改。

因为我们要将数据库访问的代码,封装在DAO中,然后呢,业务逻辑的代码,就可以直接去调用DAO组件,实现数据库操作的逻辑。如果这样做了以后,那么在业务逻辑的代码中,就不可能出现SQL语句、查询结果处理等等这些东西。当后面对系统进行维护的时候,如果你只是要优化一条SQL语句,那么你肯定不用跑到业务逻辑的代码里面去找到这条SQL语句,然后去修改它。。。

只需要到业务逻辑代码调用的DAO组件里面去,找到对应的SQL语句,修改,即可。

引入了DAO模式以后,就大大降低了业务逻辑层和数据访问层的耦合,大大提升了后期的系统维护的效率,并降低了时间成本。

我们自己在实现DAO模式的时候,通常来说,会将其分为两部分,一个是DAO接口;一个是DAO实现类。我们的业务的代码,通常就是面向接口进行编程;那么当接口的实现需要改变的时候,直接定义一个新的实现即可。但是对于我们的业务代码来说,只要面向接口开发就可以了。DAO的改动对业务代码应该没有任何的影响。

编写业务代码 

Task.java

package main.xxx.java.domain;

import java.io.Serializable;

/**
 * FileName: Task
 * Author:   hadoop
 * Email:    3165845957@qq.com
 * Date:     19-2-27 下午4:15
 * Description:任务
 */
public class Task  implements Serializable {
    private static final long serialVersionUID = 1L;

    private long taskId;
    private String taskName;
    private String createTime;
    private String startTime;
    private String finishTime;
    private String taskType;
    private String taskStatus;
    private String taskParam;

    public long getTaskId() {
        return taskId;
    }

    public void setTaskId(long taskId) {
        this.taskId = taskId;
    }

    public String getTaskName() {
        return taskName;
    }

    public void setTaskName(String taskName) {
        this.taskName = taskName;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public String getStartTime() {
        return startTime;
    }

    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }

    public String getFinishTime() {
        return finishTime;
    }

    public void setFinishTime(String finishTime) {
        this.finishTime = finishTime;
    }

    public String getTaskType() {
        return taskType;
    }

    public void setTaskType(String taskType) {
        this.taskType = taskType;
    }

    public String getTaskStatus() {
        return taskStatus;
    }

    public void setTaskStatus(String taskStatus) {
        this.taskStatus = taskStatus;
    }

    public String getTaskParam() {
        return taskParam;
    }

    public void setTaskParam(String taskParam) {
        this.taskParam = taskParam;
    }
}

ITaskDAO.java

package main.xxx.java.dao;

import main.xxx.java.domain.Task;

/**
 * FileName: ITaskDAO
 * Author:   hadoop
 * Email:    3165845957@qq.com
 * Date:     19-2-27 下午4:21
 * Description:任务管理DAO接口
 */
public interface ITaskDAO {
    /**
     * 根据主键查询任务
     * @param taskid 主键
     * @return 任务
     */
    Task findById(long taskid);
}

TaskDAOImpl.java

package main.xxx.java.impl;

import main.xxx.java.dao.ITaskDAO;
import main.xxx.java.domain.Task;
import main.xxx.java.jdbc.JDBCHelper;

import java.sql.ResultSet;

/**
 * FileName: TaskDAOImpl
 * Author:   hadoop
 * Email:    3165845957@qq.com
 * Date:     19-2-27 下午4:23
 * Description:任务管理DAO实现
 */
public class TaskDAOImpl  implements ITaskDAO {

    /**
     * 根据主键查询任务
     * @param taskid 主键
     * @return 任务
     */
    public Task findById(long taskid){
        final Task task = new Task();
        String sql = "select * from task where id = ?";
        Object[] params = new Object[]{taskid};
        JDBCHelper jdbcHelper = JDBCHelper.getInstance();
        jdbcHelper.executeQuery(sql, params, new JDBCHelper.QueryCallback() {
            @Override
            public void process(ResultSet rs) throws Exception {
                if (rs.next()){
                    long taskid =rs.getLong(1);
                    String taskName = rs.getString(2);
                    String createTime = rs.getString(3);
                    String startTime = rs.getString(4);
                    String finishTime = rs.getString(5);
                    String taskType = rs.getString(6);
                    String taskStatus = rs.getString(7);
                    String taskParam = rs.getString(8);


                    task.setTaskId(taskid);
                    task.setTaskName(taskName);
                    task.setCreateTime(createTime);
                    task.setStartTime(startTime);
                    task.setFinishTime(finishTime);
                    task.setTaskType(taskType);
                    task.setTaskStatus(taskStatus);
                    task.setTaskParam(taskParam);

                }
            }
        });
        /**
         * 说在后面的话:
         *
         * 大家看到这个代码,包括后面的其他的DAO,就会发现,用JDBC进行数据库操作,最大的问题就是麻烦
         * 你为了查询某些数据,需要自己编写大量的Domain对象的封装,数据的获取,数据的设置
         * 造成大量很冗余的代码
         *
         * 所以说,之前就是说,不建议用Scala来开发大型复杂的Spark的工程项目
         * 因为大型复杂的工程项目,必定是要涉及很多第三方的东西的,MySQL只是最基础的,要进行数据库操作
         * 可能还会有其他的redis、zookeeper等等
         *
         * 如果你就用Scala,那么势必会造成与调用第三方组件的代码用java,那么就会变成scala+java混编
         * 大大降低我们的开发和维护的效率
         *
         * 此外,即使,你是用了scala+java混编
         * 但是,真正最方便的,还是使用一些j2ee的开源框架,来进行第三方
         * 技术的整合和操作,比如MySQL,那么可以用MyBatis/Hibernate,大大减少我们的冗余的代码
         * 大大提升我们的开发速度和效率
         *
         * 但是如果用了scala,那么用j2ee开源框架,进来,造成scala+java+j2ee开源框架混编
         * 简直会造成你的spark工程的代码上的极度混乱和惨不忍睹
         * 后期非常难以维护和交接
         *
         */
        return task;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用和中提到的错误信息是"org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.xxx",这个错误信息表示找不到与指定语句绑定的方法。引用将这个错误信息翻译成中文为"嵌套异常是 org.apache.ibatis.binding.BindingException:无法绑定当前com.cloud.lowcode.mapper包下的UserMapper类的queryByParam方法"。要解决这个问题,可以按照以下步骤进行分析和处理: 1. 检查启动类的配置:首先,需要检查启动类的配置,确保正确指定了MyBatis的mapper扫描路径,并且确保com.youkeda.app.kanban.dao.TaskDAO.add方法在指定的路径下。 2. 检查Mapper接口和映射文件:然后,需要检查com.youkeda.app.kanban.dao.TaskDAO接口和对应的映射文件,确保映射文件中有正确的语句与com.youkeda.app.kanban.dao.TaskDAO.add方法进行了绑定。 3. 检查语句ID的命名:还需要检查映射文件中的语句ID,确保与com.youkeda.app.kanban.dao.TaskDAO.add方法的命名一致。 4. 检查语句的参数和返回类型:最后,需要检查com.youkeda.app.kanban.dao.TaskDAO.add方法的参数和返回类型与映射文件中的语句定义一致。 通过以上步骤的检查和调整,应该能够解决"org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.youkeda.app.kanban.dao.TaskDAO.add"的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.xxx 的解决...](https://blog.csdn.net/Hello_World_QWP/article/details/126713075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):xxx问题](https://blog.csdn.net/lvoelife/article/details/128017529)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值