ssm框架 maven配置 使用quartz 调用kettle已经写好的job执行

maven 配置只上quartz和kettle的配置部分

<dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
        </dependency>
         <!-- kettle -->
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-core</artifactId>
            <version>7.1.0.0-12</version>
        </dependency>
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-dbdialog</artifactId>
            <version>7.1.0.0-12</version>
        </dependency>
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-engine</artifactId>
            <version>7.1.0.0-12</version>
        </dependency>
        <dependency>
            <groupId>pentaho</groupId>
            <artifactId>metastore</artifactId>
            <version>7.1.0.0-12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-vfs2</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>19.0</version>
        </dependency>



<repositories>
        <repository>
            <id>pentaho-releases</id>
            <name>Kettle</name>
            <url>https://nexus.pentaho.org/content/groups/omni/</url>
        </repository>
        <!-- 阿里云maven仓库 -->
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>

job类代码:

package com.doart.job;

import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.doart.utils.KettleUtils;

/**
 * testSecondsStore job.
 */
public class TestSecondsStoreJob implements Job {

    /**
     * 日志.
     */
    private Logger log = LoggerFactory.getLogger(TestSecondsStoreJob.class);

    @Override
    public void execute(JobExecutionContext context) {

        JobDetail jobDetail = context.getJobDetail();
        String jobName = jobDetail.getKey().getName();
        // String name = jobDetail.getJobDataMap().getString("name");
        log.info(jobName  + "执行开始!");
        String kjbPath = "E:\\kettle\\project\\testSecondsStore.kjb";//job的路径
        try {

            KettleUtils.runJob(kjbPath);
        } catch (Exception e) {

            String msg = "runJob错误:" + e.getMessage();
            log.error(msg, e);
        }
    }
}

前端代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
        <link rel="stylesheet" href="js/layui/css/layui.css" />
    </head>
    <body>
        <div class="layui-form" style="margin:10px 0px 10px 10px">
            <div class="layui-inline">
                <label class="layui-form-lable">任务</label>
                <div class="layui-inline" style="margin:0px 0px 0px 10px">
                    <a class="layui-btn" id="start">开始</a>
                </div>
                <div class="layui-inline" style="margin:0px 0px 0px 10px">
                    <a class="layui-btn layui-btn-warm" id="pause">暂停</a>
                </div>
                <div class="layui-inline" style="margin:0px 0px 0px 10px">
                    <a class="layui-btn layui-btn-warm" id="resume">恢复</a>
                </div>
                <div class="layui-inline" style="margin:0px 0px 0px 10px">
                    <a class="layui-btn layui-btn-danger" id="stop">停止</a>
                </div>
                <div class="layui-inline" style="margin:0px 0px 0px 10px">
                    <label class="layui-form-lable">job1执行间隔</label>
                </div>
                <div class="layui-inline" style="margin:0px 0px 0px 10px">
                    <input class="layui-input" type="text" id="cronExpression1" placeholder="请输入频率时间" autocomplete="off">
                </div>
                <div class="layui-inline" style="margin:0px 0px 0px 10px">
                    <label class="layui-form-lable">job2执行间隔</label>
                </div>
                <div class="layui-inline" style="margin:0px 0px 0px 10px">
                    <input class="layui-input" type="text" id="cronExpression2" placeholder="请输入频率时间" autocomplete="off">
                </div>
                <div class="layui-inline" style="margin:0px 0px 0px 10px">
                    <a class="layui-btn layui-btn-danger" id="updateQuartz">修改执行间隔</a>
                </div>
            </div>
        </div>
        <table id="dataTbl2" lay-filter="tblFilter1" class="layui-table"></table>
        <table id="dataTbl1" lay-filter="tblFilter2" class="layui-table"></table>
        <script type="text/javascript" src="js/layui/layui.all.js"></script>
        <script type="text/html" id="opera">
            <input type="button" name="update"  lay-event="edit" value="编辑" class="layui-btn layui-btn-sm" >
            <input type="button" name="delete"  lay-event="delete" value="删除" class="layui-btn layui-btn-danger layui-btn-sm" >
        </script>
        <script>
            layui.use(["form", "table", "element", "layer"], function () {

                var form = layui.form;
                var table = layui.table;
                var element = layui.element;
                var layer = layui.layer;
                var $ = layui.jquery;
                var timer;
                // test_client_1数据
                table.render({

                    elem : "#dataTbl1",
                    id : "dataTbl1",
                    skin: "row",
                    even: true,
                    url : "/demo/kettle/getTestClinet1PageBean.do",
                    page : true,
                    limits: [3, 5, 10],
                    limit: 5,
                    cols : [ [ {type: "numbers", title:"序号", width:50},
                               {field : "id", title:"Id", sort:true, align:"center"},
                               {field : "userId", title : "用户id", align:"center"}, 
                               {field : "userName", title : "用户名", align:"center"},
                               {title : "操作", width:150, align:"center", toolbar:"#opera"},
                   ] ],
                   request: {

                   page : "curr",
                   limit : "size"
                   },
                   parseData : function(res) {

                       if (res.code == 200) {

                           return {

                               "code": 0,
                               "msg": res.msg,
                               "count": res.data.count,
                               "data": res.data.data
                           }
                       }
                   }
                });
                // test_日期表数据
                table.render({

                    elem : "#dataTbl2",
                    id : "dataTbl2",
                    skin: "row",
                    even: true,
                    url : "/demo/kettle/getTestTodayPageBean.do",
                    page : true,
                    limits: [3, 5, 10],
                    limit: 5,
                    cols : [ [ {type: "numbers", title:"序号", width:50},
                               {field : "id", title:"Id", sort:true, align:"center"},
                               {field : "userId", title : "用户id", align:"center"}, 
                               {field : "userName", title : "用户名", align:"center"},
                               {title : "操作", width:150, align:"center", toolbar:"#opera"},
                   ] ],
                   request: {

                   page : "curr",
                   limit : "size"
                   },
                   parseData : function(res) {

                       if (res.code == 200) {

                           return {

                               "code": 0,
                               "msg": res.msg,
                               "count": res.data.count,
                               "data": res.data.data
                           }
                       }
                   }
                });
                $("#start").click(function () {

                    $.ajax({

                        type : "post",
                        url : "/demo/kettle/startJob.do",
                        success : function (data) {

                            var data = JSON.parse(data);
                            if (data["code"] == "200") {

                                layer.msg(data.msg, {icon : 1}, 3000);
                            } else {

                                layer.msg(data.msg, {icon : 2}, 3000);
                            }
                        }
                    });
                    timer = setInterval(function () {

                        table.reload('dataTbl1', {

                            page : {curr:1},
                            url : "/demo/kettle/getTestClinet1PageBean.do",
                            method : "post"
                        });
                        table.reload('dataTbl2', {

                            page : {curr:1},
                            url : "/demo/kettle/getTestTodayPageBean.do",
                            method : "post"
                        });
                    }, 10000);
                    
                });
                $("#stop").click(function () {

                    $.ajax({

                        type : "post",
                        url : "/demo/kettle/stopJob.do",
                        success : function (data) {

                            var data = JSON.parse(data);
                            if (data.code == 200) {

                                layer.msg(data.msg, {icon : 1}, 3000);
                            } else {

                                layer.msg(data.msg, {icon : 2}, 3000);
                            }
                        }
                    });
                    clearInterval(timer);
                });
                $("#pause").click(function () {

                    $.ajax({

                        type : "post",
                        url : "/demo/kettle/pauseJob.do",
                        success : function (data) {

                            var data = JSON.parse(data);
                            if (data.code == 200) {

                                layer.msg(data.msg, {icon : 1}, 3000);
                            } else {

                                layer.msg(data.msg, {icon : 2}, 3000);
                            }
                        }
                    });
                });
                $("#resume").click(function () {

                    $.ajax({

                        type : "post",
                        url : "/demo/kettle/resumeJob.do",
                        success : function (data) {

                            var data = JSON.parse(data);
                            if (data.code == 200) {

                                layer.msg(data.msg, {icon : 1}, 3000);
                            } else {

                                layer.msg(data.msg, {icon : 2}, 3000);
                            }
                        }
                    });
                });
                $("#updateQuartz").click(function () {

                    var cronExpression1 = $("#cronExpression1").val();
                    var cronExpression2 = $("#cronExpression2").val();
                    $.ajax({

                        type : "post",
                        url : "/demo/kettle/updateTriggerInterval.do",
                        data : {
                            "cronExpression1" : cronExpression1,
                            "cronExpression2" : cronExpression2},
                        success : function (data) {

                            var data = JSON.parse(data);
                            if (data.code == 200) {

                                layer.msg(data.msg, {icon : 1}, 3000);
                            } else {

                                layer.msg(data.msg, {icon : 2}, 3000);
                            }
                        }
                    });
                });
            });
        </script>
    </body>
</html>

controller代码:

package com.doart.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.doart.bean.TestClient1Bean;
import com.doart.bean.TestTodayBean;
import com.doart.service.IKettleService;

/**
 * kettle控制器.
 */
@Controller
@RequestMapping("/kettle")
public class KettleController extends BaseController {

    /**
     * 日志.
     */
    private static Logger log = LoggerFactory.getLogger(KettleController.class);

    /**
     * kettle Service.
     */
    @Autowired
    private IKettleService kettleService;

    /**
     * seconds job名字.
     */
    private String jobName1 = "testSecondsStore";

    /**
     * seconds job 组名.
     */
    private String groupName1 = "group1";

    /**
     * seconds job 触发器名.
     */
    private String triggerName1 = "trigger1";

    /**
     * seconds job cron表达式.
     */
    private String cronExpression1 = "*/20 * * * * ?";

    /**
     * day job 名字.
     */
    private String jobName2 = "testDayStore";

    /**
     * day job 组名.
     */
    private String groupName2 = "group2";

    /**
     * day job 触发器名.
     */
    private String triggerName2 = "trigger2";

    /**
     * day job cron表达式.
     */
    private String cronExpression2 = "0 0 3 * * ? ";

    /**
     * job 参数名.
     */
    private String jobPara = "name";

    /**
     * job 参数值.
     */
    private String jobValue = "doart123";

    /**
     * 分页查询testClinet1数据.
     * @param form form
     * @param response 响应
     */
    @RequestMapping("/getTestClinet1PageBean")
    @ResponseBody
    public void getTestClinet1PageBean(HttpServletResponse response, TestClient1Bean form) {

       try {

           Map<String, Object> map = new HashMap<String, Object>();
           form.setPage((form.getPage() - 1) * form.getLimit());
           List<TestClient1Bean> list = kettleService.getTestClinet1PageBean(form);
           int count = kettleService.getTestClient1Count();
           map.put("code", "0");
           map.put("msg", "查询成功");
           map.put("count", count);
           map.put("data", list);
           respSuccessMsg(response, map, "查询成功");
       } catch (Exception e) {

           String msg = "查询失败" + e.getMessage();
           log.error(msg, e);
           respErrorMsg(response, msg);
       }
    }

    /**
     * 分页查询test_today数据.
     * @param form form
     * @param response 响应
     */
    @RequestMapping("/getTestTodayPageBean")
    private void getTestTodayPageBean(HttpServletResponse response, TestTodayBean form) {

        try {

        Map<String, Object> map = new HashMap<String, Object>();
        form.setPage((form.getPage() - 1) * form.getLimit());
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        String date = format.format(new Date());
        form.setTableName("test_" + date);
        List<TestClient1Bean> list = kettleService.getTestTodayPageBean(form);
        int count = kettleService.getTestTodayCount(form);
        map.put("code", "0");
        map.put("msg", "查询成功");
        map.put("count", count);
        map.put("data", list);
        respSuccessMsg(response, map, "查询成功");
        } catch (Exception e) {

            String msg = "查询失败" + e.getMessage();
            log.error(msg, e);
            respErrorMsg(response, msg);
        }
    }

    /**
     * 执行job.
     * @param response 响应
     */
    @RequestMapping("/startJob")
    public void startJob(HttpServletResponse response) {

        try {

            kettleService.runSecondsJob(jobName1, groupName1, triggerName1, cronExpression1, jobPara, jobValue);
            kettleService.runDayJob(jobName2, groupName2, triggerName2, cronExpression2, jobPara, jobValue);
            respSuccessMsg(response, "", "job执行成功");
        } catch (Exception e) {

            String msg = "job执行出现错误:" + e.getMessage();
            log.error(msg, e);
            respErrorMsg(response, msg);
        }
    }

    /**
     * 暂停job.
     * @param response 响应
     */
    @RequestMapping("/pauseJob")
    public void pauseJob(HttpServletResponse response) {

        try {

            kettleService.pauseSecondsTrigger(groupName1, triggerName1);
            kettleService.pauseDayTrigger(groupName2, triggerName2);
            respSuccessMsg(response, "", "job暂停成功");
        } catch (Exception e) {

            String msg = "job暂停出现错误:" + e.getMessage();
            log.error(msg, e);
            respErrorMsg(response, msg);
        }
    }

    /**
     * 恢复job.
     * @param response 响应
     */
    @RequestMapping("/resumeJob")
    public void resumeJob(HttpServletResponse response) {

        try {

            kettleService.resumeSecondsTrigger(groupName1, triggerName1);
            kettleService.resumeDayTrigger(groupName2, triggerName2);
            respSuccessMsg(response, "", "job恢复成功");
        } catch (Exception e) {

            String msg = "job恢复出现错误:" + e.getMessage();
            log.error(msg, e);
            respErrorMsg(response, msg);
        }
    }

    /**
     * 停止seconds job.
     * @param response 响应
     */
    @RequestMapping("/stopJob")
    public void stopJob(HttpServletResponse response) {

        try {

            kettleService.removeSecondsTrigger(groupName1, triggerName1);
            kettleService.removeDayTrigger(groupName2, triggerName2);
            respSuccessMsg(response, "", "job停止成功");
        } catch (Exception e) {

            String msg = "job停止出现错误:" + e.getMessage();
            log.error(msg, e);
            respErrorMsg(response, msg);
        }
    }

    /**
     * 修改 trigger 执行间隔.
     * @param response 响应
     * @param request 请求
     */
    @RequestMapping("/updateTriggerInterval")
    public void updateTriggerInterval(HttpServletResponse response, HttpServletRequest request) {

        String cronExpression1 = request.getParameter("cronExpression1");
        String cronExpression2 = request.getParameter("cronExpression2");
        try {

            if (cronExpression1 != null && cronExpression1 != "") {

                kettleService.updateSecondsTriggerInterval(cronExpression1, groupName1, jobName1, triggerName1);
            }
            if (cronExpression2 != null && cronExpression2 != "") {

                kettleService.updateDayTriggerInterval(cronExpression2, groupName2, jobName2, triggerName2);
            }
            respSuccessMsg(response, "", "修改执行间隔成功");
        } catch (Exception e) {

            String msg = "修改执行间隔出现错误" + e.getMessage();
            log.error(msg, e);
            respErrorMsg(response, msg);
        }
    }
}

service 接口代码 不给了 直接实现类:

package com.doart.service.impl;

import java.util.List;
import java.util.Properties;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.doart.bean.TestClient1Bean;
import com.doart.bean.TestTodayBean;
import com.doart.dao.KettleDao;
import com.doart.job.TestDayStoreJob;
import com.doart.job.TestSecondsStoreJob;
import com.doart.service.IKettleService;

/**
 * kettle 实现类.
 */
@Service
public class KettleServiceImpl implements IKettleService {

    /**
     * testSecondsStore job 调度器.
     */
    private Scheduler secondsScheduler;
    /**
     * testDayStore job 调度器.
     */
    private Scheduler dayScheduler;

    /**
     * 构造器.
     * @throws Exception 异常
     */
    public  KettleServiceImpl() throws Exception {

        StdSchedulerFactory sf1 = new StdSchedulerFactory();
        Properties props1 = new Properties();
        props1.put("org.quartz.scheduler.instanceName", "Seconds");
        props1.put("org.quartz.threadPool.threadCount", "10");
        sf1.initialize(props1);
        secondsScheduler = sf1.getScheduler();
        StdSchedulerFactory sf2 = new StdSchedulerFactory();
        Properties props2 = new Properties();
        props2.put("org.quartz.scheduler.instanceName", "Seconds");
        props2.put("org.quartz.threadPool.threadCount", "10");
        sf2.initialize(props2);
        dayScheduler = sf2.getScheduler();
    }

    /**
     * kettle DAO.
     */
    @Autowired
    private KettleDao kettleDao;

    @Override
    public List<TestClient1Bean> getTestClinet1PageBean(TestClient1Bean form) {

        return kettleDao.getTestClinet1PageBean(form);
    }

    @Override
    public int getTestClient1Count() {

        return kettleDao.getTestClient1Count();
    }

    @Override
    public List<TestClient1Bean> getTestTodayPageBean(TestTodayBean form) {

        return kettleDao.getTestTodayPageBean(form);
    }

    @Override
    public int getTestTodayCount(TestTodayBean form) {

        return kettleDao.getTestTodayCount(form);
    }

    @Override
    public void runSecondsJob(String jobName, String groupName, String triggerName, String cronExpression,
        String jobPara, String jobValue) throws SchedulerException {

        JobDetail jobDetail = JobBuilder.newJob(TestSecondsStoreJob.class)
            .withIdentity(jobName, groupName).usingJobData(jobPara, jobValue).build();
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, groupName).startNow()
            .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
        secondsScheduler.scheduleJob(jobDetail, trigger);
        secondsScheduler.start();
    }

    @Override
    public void runDayJob(String jobName, String groupName, String triggerName, String cronExpression,
        String jobPara, String jobValue) throws SchedulerException {


        JobDetail jobDetail = JobBuilder.newJob(TestDayStoreJob.class)
            .withIdentity(jobName, groupName).usingJobData(jobPara, jobValue).build();
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, groupName).startNow()
            .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
        dayScheduler.scheduleJob(jobDetail, trigger);
        dayScheduler.start();
    }

    @Override
    public void pauseSecondsTrigger(String groupName, String triggerName) throws Exception {

        secondsScheduler.pauseTrigger(new TriggerKey(triggerName, groupName));
    }

    @Override
    public void pauseDayTrigger(String groupName, String triggerName) throws Exception {

        dayScheduler.pauseTrigger(new TriggerKey(triggerName, groupName));
    }

    @Override
    public void resumeSecondsTrigger(String groupName, String triggerName) throws Exception {

        secondsScheduler.resumeTrigger(new TriggerKey(triggerName, groupName));
    }

    @Override
    public void resumeDayTrigger(String groupName, String triggerName) throws Exception {

        dayScheduler.resumeTrigger(new TriggerKey(triggerName, groupName));
    }

    @Override
    public void removeSecondsTrigger(String groupName, String triggerName) throws Exception {

        // 先暂停在移除
        secondsScheduler.pauseTrigger(new TriggerKey(triggerName, groupName));
        secondsScheduler.unscheduleJob(new TriggerKey(triggerName, groupName));
    }

    @Override
    public void removeDayTrigger(String groupName, String triggerName) throws Exception {

        // 先暂停在移除
        dayScheduler.pauseTrigger(new TriggerKey(triggerName, groupName));
        dayScheduler.unscheduleJob(new TriggerKey(triggerName, groupName));
    }

    @Override
    public void updateSecondsTriggerInterval(String cronExpression, String groupName, String jobName,
        String triggerName) throws Exception {

        Trigger trigger = secondsScheduler.getTrigger(new TriggerKey(triggerName, groupName));
        if (trigger != null) {

            removeSecondsTrigger(groupName, triggerName);
            runSecondsJob(jobName, groupName, triggerName, cronExpression, "name", "doart1");
        }
    }

    @Override
    public void updateDayTriggerInterval(String cronExpression, String groupName, String jobName,
        String triggerName) throws Exception {

        Trigger trigger = dayScheduler.getTrigger(new TriggerKey(triggerName, groupName));
        if (trigger != null) {

            removeDayTrigger(groupName, triggerName);
            runDayJob(jobName, groupName, triggerName, cronExpression, "name", "doart2");
        }
    }
}

dao代码:

package com.doart.dao;

import java.util.List;

import com.doart.bean.TestClient1Bean;
import com.doart.bean.TestTodayBean;

/**
 * kettle DAO.
 */
public interface KettleDao {

    /**
     * 获取testClient1数据.
     * @param form form
     * @return testClient1数据集合
     */
    List<TestClient1Bean> getTestClinet1PageBean(TestClient1Bean form);

    /**
     * 获取testClint1数量.
     * @return 数量
     */
    int getTestClient1Count();

    /**
     * 获取testToday数据.
     * @param form form
     * @return testToday数据集合
     */
    List<TestClient1Bean> getTestTodayPageBean(TestTodayBean form);

    /**
     * 获取testToday数量.
     * @param form form
     * @return testToday数量
     */
    int getTestTodayCount(TestTodayBean form);
}

mapper映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.doart.dao.KettleDao">
    <select id="getTestClinet1PageBean" resultType="com.doart.bean.TestClient1Bean" parameterType="com.doart.bean.TestClient1Bean">
        select id, user_id, user_name from test_client_1
        <if test = "page !=null and limit != null">
            limit #{page}, #{limit}
        </if>
    </select>
    <select id="getTestClient1Count" resultType="int" parameterType="com.doart.bean.TestClient1Bean">
        select count(*) from test_client_1
    </select>
        <select id="getTestTodayPageBean" resultType="com.doart.bean.TestClient1Bean" parameterType="com.doart.bean.TestTodayBean">
        select id, user_id, user_name from ${tableName}
        <if test = "page !=null and limit != null">
            limit #{page}, #{limit}
        </if>
    </select>
    <select id="getTestTodayCount" resultType="int" parameterType="com.doart.bean.TestTodayBean">
        select count(*) from ${tableName}
    </select>
</mapper>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值