今天补齐DolerData判断数据是否存在的API,即M的$d。
兜兜转转,经过近十年探索,3年的酝酿,10个月的开发,JRT终于集齐多维取数据三件套。分别是$get,$listget,$data。通过多维取数据的支持,JRT特别适合医疗数据表关系参照多的运用场景,使开发者开发业务爬行主数据周边几十上百个相关表不在受限数据库交互性能。也使开发脱离原始SQL,不用绞尽脑汁的join一堆相关表来优化性能。在整个业务代码无缝支持多数据库情况下,比同等spring+mybats体系的程序性能高几倍到几十倍。
对应的JRT的API就是下面5个
/**
* 通过主键查询数据,带缓存的查询,用来解决关系库的复杂关系数据获取,顶替Cache的$g
*
* @param modelClass 实体类型
* @param id 主键
* @param <T> 泛型
* @return 一行数据
* @throws Exception
*/
public <T> T DolerGet(Class modelClass, Object id) throws Exception;
/**
* 通过多列值唯一得到数据,带缓存的查询,用来解决关系库的复杂关系数据索引唯一获取
*
* @param modelClass 实体类型
* @param para 索引参数
* @param <T> 泛型
* @return 一行数据
* @throws Exception
*/
public <T> T DolerGet(Class modelClass, HashParam para) throws Exception ;
/**
* 通过多列值判断数据是否存在,带缓存的判断,用来解决关系库的复杂关系数据的存在判断,登记$d
*
* @param modelClass 实体类型
* @param para 索引参数
* @return 一行数据
* @throws Exception
*/
public boolean DolerData(Class modelClass, HashParam para) throws Exception ;
/**
* 通过主键查询一列数据
*
* @param modelClass 实体类型
* @param id 主键
* @param colName 列名
* @return 一行具体列数据
* @throws Exception
*/
public Object DolerGetCol(Class modelClass, Object id,String colName) throws Exception;
/**
* 通过主键查询一行数据的CName
*
* @param modelClass 实体类型
* @param id 主键
* @return 一行具体列数据
* @throws Exception
*/
public String DolerGetCName(Class modelClass, Object id) throws Exception;
用DolerData代替CheckHas的性能差距
综合带有取一个周边数据和判断子数据存在,还有取单列数据的性能差距
通过多列取唯一行的性能差距
测试代码
import JRT.Core.Util.RuleNumberUtil;
import JRT.DAL.ORM.Global.GlobalManager;
import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.Helper;
import JRT.Core.Dto.HashParam;
import JRT.Core.Dto.ParamDto;
import JRT.Core.Dto.OutParam;
import JRT.Model.Entity.*;
import JRT.Core.Util.Convert;
import JRT.Core.MultiPlatform.JRTContext;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
/**
* 测试DolerGet和不用DolerGet的性能差别以及在哈希表放千万行数据的内存占用
*
*/
public class ashDolerGetTest extends BaseHttpHandlerNoSession {
/**
* 用Doler系列测试,综合性能
* @return
*/
public String DolerMethodsTest() throws Exception
{
String ret="";
//用DolerData判断
long start=JRT.Core.Util.TimeParser.GetTimeInMillis();
//取一个标本测试取周边数据
List<RPVisitNumber> visList = EntityManager().FindAllSimple(RPVisitNumber.class, null,"",1,null,null);
//刚清库标本数据不够,多循环几次代表多标本
for(int i=0;i<50;i++) {
if (visList != null && visList.size() > 0) {
for (RPVisitNumber vis : visList) {
//平均每个标本取20次周边数据
for(int j=0;j<20;j++) {
if (vis.LocationDR != null) {
BTLocation loc = EntityManager().DolerGet(BTLocation.class, vis.LocationDR);
}
String hosName = EntityManager().DolerGetCName(BTHospital.class, vis.HospitalDR);
HashParam hs = new HashParam();
hs.Add("VisitNumberDR", vis.RowID);
if (EntityManager().DolerData(RPVisitNumberReport.class, hs)) {
//System.out.println("存在报告");
}
}
}
}
}
long end=JRT.Core.Util.TimeParser.GetTimeInMillis();
ret="用DolerGet通过索引取数据耗时:"+(end-start);
//不用DolerData判断
start=JRT.Core.Util.TimeParser.GetTimeInMillis();
visList = EntityManager().FindAllSimple(RPVisitNumber.class, null);
//刚清库标本数据不够,多循环几次代表多标本
for(int i=0;i<50;i++) {
if (visList != null && visList.size() > 0) {
for (RPVisitNumber vis : visList) {
//平均每个标本取20次周边数据
for(int j=0;j<20;j++) {
if (vis.LocationDR != null) {
BTLocation loc = EntityManager().GetById(BTLocation.class, vis.LocationDR);
}
BTHospital hos = EntityManager().GetById(BTHospital.class, vis.HospitalDR);
String hosName = hos.CName;
HashParam hs = new HashParam();
hs.Add("VisitNumberDR", vis.RowID);
if (EntityManager().CheckHasData(RPVisitNumberReport.class, hs, null, null)) {
//System.out.println("存在报告");
}
}
}
}
}
end=JRT.Core.Util.TimeParser.GetTimeInMillis();
ret+=",直接查数据库取数据耗时:"+(end-start);
return ret;
}
/**
* 用DolerData判断数据是否存在
* @return
*/
public String DolerDataTest() throws Exception
{
String ret="";
//用DolerData判断
long start=JRT.Core.Util.TimeParser.GetTimeInMillis();
for(int i=0;i<500;i++)
{
HashParam hs=new HashParam();
hs.Add("Code","FileServiceAddr");
hs.Add("ParaType","HOS");
hs.Add("ParaTypeCode","1");
if(EntityManager().DolerData(JRTParameter.class,hs))
{
//System.out.println("存在参数");
}
}
long end=JRT.Core.Util.TimeParser.GetTimeInMillis();
ret="用DolerGet通过索引取数据耗时:"+(end-start);
//不用DolerData判断
start=JRT.Core.Util.TimeParser.GetTimeInMillis();
for(int i=0;i<500;i++)
{
HashParam hs=new HashParam();
hs.Add("Code","FileServiceAddr");
hs.Add("ParaType","HOS");
hs.Add("ParaTypeCode","1");
if(EntityManager().CheckHasData(JRTParameter.class,hs,null,null))
{
//System.out.println("存在参数");
}
}
end=JRT.Core.Util.TimeParser.GetTimeInMillis();
ret+=",直接查数据库取数据耗时:"+(end-start);
return ret;
}
/**
* 用DolerGet通过唯一索引查询数据
* @return
*/
public String DolerIndexGet() throws Exception
{
String ret="";
//带索引缓存查询测
long start=JRT.Core.Util.TimeParser.GetTimeInMillis();
for(int i=0;i<5000;i++)
{
HashParam hs=new HashParam();
hs.Add("Code","FileServiceAddr");
hs.Add("ParaType","HOS");
hs.Add("ParaTypeCode","1");
JRTParameter para=EntityManager().DolerGet(JRTParameter.class,hs);
}
long end=JRT.Core.Util.TimeParser.GetTimeInMillis();
ret="用DolerGet通过索引取数据耗时:"+(end-start);
//不带索引缓存查询测试
start=JRT.Core.Util.TimeParser.GetTimeInMillis();
for(int i=0;i<5000;i++)
{
HashParam hs=new HashParam();
hs.Add("Code","FileServiceAddr");
hs.Add("ParaType","HOS");
hs.Add("ParaTypeCode","1");
JRTParameter para=EntityManager().GetByPara(JRTParameter.class,hs);
}
end=JRT.Core.Util.TimeParser.GetTimeInMillis();
ret+=",直接查数据库取数据耗时:"+(end-start);
return ret;
}
/**
* 不用DolerGet查询数据
* @return
*/
public String NoDolerGet() throws Exception
{
long start=JRT.Core.Util.TimeParser.GetTimeInMillis();
//查询所有表里面的元素
List<JRTPrintTemplateEleRetDto> eleList=EntityManager().FindAllSimple(JRTPrintTemplateEleRetDto.class,null);
int getNum=0;
for(JRTPrintTemplateEleRetDto ele:eleList)
{
for(int i=0;i<2000;i++) {
//取模板信息
JRTPrintTemplate tmp = EntityManager().GetById(JRTPrintTemplate.class, ele.PrintTemplateDR);
ele.TemplateCode=tmp.Code;
ele.TemplateName=tmp.CName;
//取纸张信息
if(tmp.JRTPrintPaperDR!=null)
{
JRTPrintPaper paper=EntityManager().GetById(JRTPrintPaper.class,tmp.JRTPrintPaperDR);
ele.TemplatePaper=paper.CName;
getNum++;
}
getNum++;
}
}
long end=JRT.Core.Util.TimeParser.GetTimeInMillis();
return "消耗时间:"+(end-start)+",获取次数:"+getNum+",数据行数:"+eleList.size()+",数据:"+Helper.Object2Json(eleList);
}
/**
* 用DolerGet查询数据
* @return
*/
public String DolerGet() throws Exception
{
long start=JRT.Core.Util.TimeParser.GetTimeInMillis();
//查询所有表里面的元素
List<JRTPrintTemplateEleRetDto> eleList=EntityManager().FindAllSimple(JRTPrintTemplateEleRetDto.class,null);
int getNum=0;
for(JRTPrintTemplateEleRetDto ele:eleList)
{
for(int i=0;i<2000;i++) {
//取模板信息
JRTPrintTemplate tmp = EntityManager().DolerGet(JRTPrintTemplate.class, ele.PrintTemplateDR);
ele.TemplateCode=tmp.Code;
ele.TemplateName=tmp.CName;
//取纸张信息
if(tmp.JRTPrintPaperDR!=null)
{
JRTPrintPaper paper=EntityManager().DolerGet(JRTPrintPaper.class,tmp.JRTPrintPaperDR);
ele.TemplatePaper=paper.CName;
getNum++;
}
getNum++;
}
}
long end=JRT.Core.Util.TimeParser.GetTimeInMillis();
return "消耗时间:"+(end-start)+",获取次数:"+getNum+",数据行数:"+eleList.size()+",数据:"+Helper.Object2Json(eleList);
}
}
}
同时JRT把开发速度也提高到极致,业务脚本化方便开发和修改,开发环境简单到只要idea和jdk把环境部署简化。
借助实现的代码生成器为所有表生成拷贝的代码资源,Aspx和Java代码是直接放上去就能增删改查的界面,单表维护有特殊改动的只要基于生成基础改改,多表维护从里面拷贝素材。
这样的一个父子表维护界面的开发时间直接提速到半小时范围,拷贝父表界面和后台,加详细列弹窗,拷子表界面后后台逻辑组装。
生成页面示例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>JRTMenu供拷贝代码使用</title>
<link rel="shortcut icon" href="../../resource/common/images/favicon.ico" />
<script src="../../resource/common/js/JRTBSBase.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
SYSPageCommonInfo.Init();
var BasePath = '';
var ResourcePath = '';
var WebServicAddress = SYSPageCommonInfo.Data.WebServicAddress;
var UserID = SYSPageCommonInfo.Data.Sesssion.UserID;
var GroupID = SYSPageCommonInfo.Data.Sesssion.GroupID;
var SessionStr = SYSPageCommonInfo.Data.SessionStr;
</script>
<script type="text/javascript">
//全局变量
var me = {
actionUrl: '../ashx/ashJRTMenu.ashx'
};
//jquery入口
$(function () {
//新增数据点击
$("#btnAddJRTMenu").click(function () {
$("#txtJRTMenuRowID").val("");
$('#winEditJRTMenu').window({
title: TranslateDataMTHD('Add Data', '新增数据', ''),
modal: true
});
});
//修改数据点击
$("#btnUpdateJRTMenu").click(function () {
UpdateJRTMenu();
});
//修改数据
function UpdateJRTMenu(row)
{
var selectRow = $('#dgJRTMenu').datagrid("getSelected");
if(row!=null)
{
selectRow=row;
}
if (selectRow == null) {
$.messager.alert(TranslateDataMTHD('Info', '提示', ''), TranslateDataMTHD('Please select the data to modify', '请选择要修改的数据!', ''), 'info');
return;
}
$("#formJRTMenu").form('load', selectRow);
$('#winEditJRTMenu').window({
title: TranslateDataMTHD('Update Data', '修改数据', ''),
modal: true
});
}
//删除数据点击
$("#btnDeleteJRTMenu").click(function () {
var checkRow = $('#dgJRTMenu').datagrid("getChecked");
var selectRow = $('#dgJRTMenu').datagrid("getSelected");
if ((checkRow == null || checkRow.length == 0)&&selectRow==null) {
$.messager.alert(TranslateDataMTHD('Info', '提示', ''), TranslateDataMTHD('Please select the data to delete', '请勾选要删除的数据!', ''), 'info');
return;
}
if ((checkRow == null || checkRow.length == 0)) {
checkRow=[selectRow];
}
var RowIDS = "";
for (var i = 0; i < checkRow.length; i++) {
if (i == 0) {
RowIDS = checkRow[i].RowID;
}
else {
RowIDS += "^" + checkRow[i].RowID;
}
}
$.messager.confirm(TranslateDataMTHD('Info', '提示', ''), TranslateDataMTHD('Do you want to delete the selected data', '是否要删除选择的数据?', '') , function (r) {
if (r) {
//开启等待
$.messager.progress({ text: TranslateDataMTHD("Deleting data","正在删除数据", ""), interval: 500 });
setTimeout(function () {
$.messager.progress('close');
}, 8000);
//往后台提交数据
$.ajax({
type: "post",
dataType: "json",
cache: false, //
async: true, //为true时,异步,不等待后台返回值,为false时强制等待;-asir
url: me.actionUrl + '?Method=DeleteJRTMenu',
data: { RowIDS: RowIDS },
success: function (data, status) {
$.messager.progress('close');
if (!FilterBackData(data)) {
return;
}
if (!data.IsOk) {
$.messager.alert(TranslateDataMTHD("Error message", "错误提示", ""), TranslateDataMTHD("failed to dalete data, error message:", "删除失败,错误信息:", "") + data.Message);
}
else {
QryJRTMenu();
$.messager.show({
title: TranslateDataMTHD("Info", "提示", ""),
msg: TranslateDataMTHD("Successfully deleted!", "删除成功!", ""),
timeout: 500,
showType: 'slide'
});
}
}
});
}
});
});
//保存数据
$("#btnSaveJRTMenu").click(function () {
var saveData = jQuery.parseJSON($("#formJRTMenu").serializeObject());
//开启等待
$.messager.progress({ text: TranslateDataMTHD("Saving data","正在保存数据", ""), interval: 500 });
setTimeout(function () {
$.messager.progress('close');
}, 8000);
//往后台提交数据
$.ajax({
type: "post",
dataType: "json",
cache: false, //
async: true, //为true时,异步,不等待后台返回值,为false时强制等待;-asir
url: me.actionUrl + '?Method=SaveJRTMenu',
data: saveData,
success: function (data, status) {
$.messager.progress('close');
if (!FilterBackData(data)) {
return;
}
if (!data.IsOk) {
$.messager.alert(TranslateDataMTHD("Error message", "错误提示", ""), TranslateDataMTHD("failed to save data, error message:", "保存失败,错误信息:", "") + data.Message);
}
else {
QryJRTMenu();
$.messager.show({
title: TranslateDataMTHD("Info", "提示", ""),
msg: TranslateDataMTHD("Successfully saveed!", "保存成功!", ""),
timeout: 500,
showType: 'slide'
});
$('#winEditJRTMenu').window("close");
}
}
});
});
//关闭窗口
$("#btnCloseJRTMenu").click(function () {
$('#winEditJRTMenu').window("close");
});
//构造查询事件
$("#txtFilterJRTMenu").searchbox({
searcher: function (value, name) {
QryJRTMenu();
},
prompt: TranslateDataMTHD('Enter query', '回车查询', '')
});
//上级下拉表格渲染
$('#txtJRTMenuParentDR').combogrid({
panelWidth: 350,
idField: 'RowID',
width: 205,
textField: 'CName',
url: me.actionUrl + '?Method=CommonQueryView&data='+JSON.stringify({ ModelName: "JRTMenu", Pram: [], IsDisplayCount: false, Joiner: [], Operators: [] }),
columns: [[
{ field: 'RowID', title: '主键', width: 60 },
{ field: 'CName', title: '名称', width: 260 }
]]
});
$('#txtJRTMenuParentDR').combogrid("showSelectWin");
//页面路径下拉表格渲染
$('#txtJRTMenuFormDR').combogrid({
panelWidth: 350,
idField: 'RowID',
width: 205,
textField: 'CName',
url: me.actionUrl + '?Method=CommonQueryView&data='+JSON.stringify({ ModelName: "JRTForm", Pram: [], IsDisplayCount: false, Joiner: [], Operators: [] }),
columns: [[
{ field: 'RowID', title: '主键', width: 60 },
{ field: 'CName', title: '名称', width: 260 }
]]
});
$('#txtJRTMenuFormDR').combogrid("showSelectWin");
//激活布尔渲染
$('#txtJRTMenuActive').combobox({
valueField:'RowID',
textField:'CName',
width: 205,
data: [{"RowID":false,"CName":TranslateDataMTHD('No', '否', '')},{"RowID":true,"CName":TranslateDataMTHD('Yes', '是', '')}]
});
//是否置顶显示布尔渲染
$('#txtJRTMenuIsTop').combobox({
valueField:'RowID',
textField:'CName',
width: 205,
data: [{"RowID":false,"CName":TranslateDataMTHD('No', '否', '')},{"RowID":true,"CName":TranslateDataMTHD('Yes', '是', '')}]
});
//子系统下拉表格渲染
$('#txtJRTMenuSystemSubDR').combogrid({
panelWidth: 350,
idField: 'RowID',
width: 205,
textField: 'SubSysName',
url: me.actionUrl + '?Method=CommonQueryView&data='+JSON.stringify({ ModelName: "JRTSystemSub", Pram: [], IsDisplayCount: false, Joiner: [], Operators: [] }),
columns: [[
{ field: 'RowID', title: '主键', width: 60 },
{ field: 'SubSysName', title: '名称', width: 260 }
]]
});
$('#txtJRTMenuSystemSubDR').combogrid("showSelectWin");
//系统模块下拉表格渲染
$('#txtJRTMenuSystemDR').combogrid({
panelWidth: 350,
idField: 'RowID',
width: 205,
textField: 'SysName',
url: me.actionUrl + '?Method=CommonQueryView&data='+JSON.stringify({ ModelName: "JRTSystem", Pram: [], IsDisplayCount: false, Joiner: [], Operators: [] }),
columns: [[
{ field: 'RowID', title: '主键', width: 60 },
{ field: 'SysName', title: '名称', width: 260 }
]]
});
$('#txtJRTMenuSystemDR').combogrid("showSelectWin");
//JRTMenu表格
$('#dgJRTMenu').datagrid({
remoteSort:false,
singleSelect: true,
toolbar: "#dgJRTMenuToolBar",
fit: true,
onSelect: function (index, row) {
//方便拷贝到子表查询用
var selectJRTMenu=$('#dgJRTMenu').datagrid("getSelected");
},
onDblClickRow: function (index, row) {
UpdateJRTMenu(row);
},
columns: [[
{ field: 'ChkFlag', title: TranslateDataMTHD('Check', '选择', ''), width: 20, sortable: true, align: 'center', checkbox: true },
{ field: 'RowID', title: TranslateDataMTHD('RowID', '主键', '') , width: 150, sortable: true },
{ field: 'CName', title: TranslateDataMTHD('CName', '名称', '') , width: 150, sortable: true },
{ field: 'ParentDR_JRTMenu_CName', title: TranslateDataMTHD('ParentDR', '上级', '') , width: 150, sortable: true },
{ field: 'FormDR_JRTForm_CName', title: TranslateDataMTHD('FormDR', '页面路径', '') , width: 150, sortable: true },
{ field: 'Description', title: TranslateDataMTHD('Description', '功能描述', '') , width: 150, sortable: true },
{ field: 'Icon', title: TranslateDataMTHD('Icon', '图标', '') , width: 150, sortable: true },
{ field: 'Sequence', title: TranslateDataMTHD('Sequence', '序号', '') , width: 150, sortable: true },
{ field: 'Active', title: TranslateDataMTHD('Active', '激活', '') , width: 150, sortable: true },
{ field: 'IsTop', title: TranslateDataMTHD('IsTop', '是否置顶显示', '') , width: 150, sortable: true },
{ field: 'SystemSubDR_JRTSystemSub_SubSysName', title: TranslateDataMTHD('SystemSubDR', '子系统', '') , width: 150, sortable: true },
{ field: 'SystemDR_JRTSystem_SysName', title: TranslateDataMTHD('SystemDR', '系统模块', '') , width: 150, sortable: true },
{ field: 'OpenModel', title: TranslateDataMTHD('OpenModel', '空:在Tab页打印,0:弹窗打开,1:独立打开', '') , width: 150, sortable: true },
{ field: 'OpenWidth', title: TranslateDataMTHD('OpenWidth', '打开宽度', '') , width: 150, sortable: true },
{ field: 'OpenHeight', title: TranslateDataMTHD('OpenHeight', '打开高度', '') , width: 150, sortable: true }
]]
});
//查询JRTMenu
function QryJRTMenu() {
var Filter = $("#txtFilterJRTMenu").searchbox("getValue");
//开启等待,默认注释,在单击事件调用的逻辑启用等待会冲掉双击事件,按需要开启
//$.messager.progress({ text: TranslateDataMTHD("Querying data","正在查询数据", ""), interval: 500 });
//setTimeout(function () {
//$.messager.progress('close');
//}, 8000);
$.ajax({
type: "post",
dataType: "json",
cache: false, //
async: true, //为true时,异步,不等待后台返回值,为false时强制等待;-asir
url: me.actionUrl + '?Method=QryJRTMenu',
data: { Filter: Filter },
success: function (data, status) {
//结束等待
//$.messager.progress('close');
if (!FilterBackData(data)) {
return;
}
$('#dgJRTMenu').datagrid("loadData", data);
}
});
};
//执行查询数据
QryJRTMenu();
});
</script>
</head>
<body>
<div class="easyui-layout" fit="true" style="border: none;">
<div data-options="region:'center',title:''" style="border: none;">
<div id="dgJRTMenuToolBar" style="padding: 3px 0px 3px 10px;">
<a id="btnAddJRTMenu" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-add'" plain="true" listranslate="html~Add">新增</a>
<a id="btnUpdateJRTMenu" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-write-order'" plain="true" listranslate="html~Mod">修改</a>
<a id="btnDeleteJRTMenu" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" plain="true" listranslate="html~Del">删除</a>
<input id="txtFilterJRTMenu" style="margin-left: 14px; width: 240px;"></input>
</div>
<table id="dgJRTMenu" title="" iconcls="icon-paper" listranslate="title~JRTMenu"></table>
</div>
<div id="winEditJRTMenu" style="padding: 10px 0px 0px 10px;width:1140px;height:292.6666666666666667px;display: none;">
<form id="formJRTMenu" name="edit_form" method="post">
<input type="hidden" id="txtJRTMenuRowID" name="RowID" value="0" />
<table>
<tr>
<td class="lisar" jrttranslate="html~CName">名称</td>
<td class="lisal"><input id="txtJRTMenuCName" type="text" name="CName" style="width:200px;" class="easyui-validatebox" maxlength="20"/></td>
<td class="lisar" jrttranslate="html~ParentDR">上级</td>
<td class="lisal"><input id="txtJRTMenuParentDR" type="text" name="ParentDR" style="width:200px;"/></td>
<td class="lisar" jrttranslate="html~FormDR">页面路径</td>
<td class="lisal"><input id="txtJRTMenuFormDR" type="text" name="FormDR" style="width:200px;"/></td>
</tr>
<tr>
<td class="lisar" jrttranslate="html~Description">功能描述</td>
<td class="lisal"><input id="txtJRTMenuDescription" type="text" name="Description" style="width:200px;" class="easyui-validatebox" maxlength="100"/></td>
<td class="lisar" jrttranslate="html~Icon">图标</td>
<td class="lisal"><input id="txtJRTMenuIcon" type="text" name="Icon" style="width:200px;" class="easyui-validatebox" maxlength="100"/></td>
<td class="lisar" jrttranslate="html~Sequence">序号</td>
<td class="lisal"><input id="txtJRTMenuSequence" type="text" name="Sequence" style="width:200px;" class="easyui-validatebox" maxlength="10"/></td>
</tr>
<tr>
<td class="lisar" jrttranslate="html~Active">激活</td>
<td class="lisal"><input id="txtJRTMenuActive" type="text" name="Active" style="width:200px;" class="easyui-validatebox" maxlength="1"/></td>
<td class="lisar" jrttranslate="html~IsTop">是否置顶显示</td>
<td class="lisal"><input id="txtJRTMenuIsTop" type="text" name="IsTop" style="width:200px;" class="easyui-validatebox" maxlength="1"/></td>
<td class="lisar" jrttranslate="html~SystemSubDR">子系统</td>
<td class="lisal"><input id="txtJRTMenuSystemSubDR" type="text" name="SystemSubDR" style="width:200px;"/></td>
</tr>
<tr>
<td class="lisar" jrttranslate="html~SystemDR">系统模块</td>
<td class="lisal"><input id="txtJRTMenuSystemDR" type="text" name="SystemDR" style="width:200px;"/></td>
<td class="lisar" jrttranslate="html~OpenModel">空:在Tab页打印,0:弹窗打开,1:独立打开</td>
<td class="lisal"><input id="txtJRTMenuOpenModel" type="text" name="OpenModel" style="width:200px;" class="easyui-validatebox" maxlength="1"/></td>
<td class="lisar" jrttranslate="html~OpenWidth">打开宽度</td>
<td class="lisal"><input id="txtJRTMenuOpenWidth" type="text" name="OpenWidth" style="width:200px;" class="easyui-validatebox" maxlength="10"/></td>
</tr>
<tr>
<td class="lisar" jrttranslate="html~OpenHeight">打开高度</td>
<td class="lisal"><input id="txtJRTMenuOpenHeight" type="text" name="OpenHeight" style="width:200px;" class="easyui-validatebox" maxlength="10"/></td>
</tr>
</table>
<div region="south" border="fale" style="text-align: center; padding: 5px 0 0;">
<a id="btnSaveJRTMenu" href="#" class="easyui-linkbutton" plain="false" listranslate="html~Save">保存</a>
<span class="sp6"></span>
<a id="btnCloseJRTMenu" href="#" class="easyui-linkbutton" plain="false" listranslate="html~Cancel">取消</a>
</div>
</form>
</div>
</div>
</body>
</html>
生成的后台
import JRTBLLBase.BaseHttpHandler;
import JRTBLLBase.Helper;
import JRT.Core.Dto.HashParam;
import JRT.Core.Dto.ParamDto;
import JRT.Core.Dto.OutParam;
import JRT.Model.Entity.*;
import JRT.Core.Util.Convert;
import JRT.Core.MultiPlatform.JRTContext;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
/**
*由代码生成器生成的后台代码
*/
public class ashJRTMenu extends BaseHttpHandler {
/**
* 保存数据,前台按表的属性名提交
* @return 字符串
*/
public String SaveJRTMenu() throws Exception
{
JRTMenu dto=new JRTMenu();
//主键
dto.RowID=Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), dto.RowID);
//名称
dto.CName=Helper.ValidParam(JRTContext.GetRequest(Request, "CName"), dto.CName);
//上级
dto.ParentDR=Helper.ValidParam(JRTContext.GetRequest(Request, "ParentDR"), dto.ParentDR);
//页面路径
dto.FormDR=Helper.ValidParam(JRTContext.GetRequest(Request, "FormDR"), dto.FormDR);
//功能描述
dto.Description=Helper.ValidParam(JRTContext.GetRequest(Request, "Description"), dto.Description);
//图标
dto.Icon=Helper.ValidParam(JRTContext.GetRequest(Request, "Icon"), dto.Icon);
//序号
dto.Sequence=Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), dto.Sequence);
//激活 {1:true,0:false}
dto.Active=Helper.ValidParam(JRTContext.GetRequest(Request, "Active"), dto.Active);
//是否置顶显示 {1:true,0:false}
dto.IsTop=Helper.ValidParam(JRTContext.GetRequest(Request, "IsTop"), dto.IsTop);
//子系统
dto.SystemSubDR=Helper.ValidParam(JRTContext.GetRequest(Request, "SystemSubDR"), dto.SystemSubDR);
//系统模块
dto.SystemDR=Helper.ValidParam(JRTContext.GetRequest(Request, "SystemDR"), dto.SystemDR);
//空:在Tab页打印,0:弹窗打开,1:独立打开
dto.OpenModel=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenModel"), dto.OpenModel);
//打开宽度
dto.OpenWidth=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenWidth"), dto.OpenWidth);
//打开高度
dto.OpenHeight=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenHeight"), dto.OpenHeight);
OutParam out=new OutParam();
int ret=0;
//更新
if(dto.RowID>0)
{
ret=EntityManager().Update(dto,null, out, null, null, null);
}
//插入数据
else
{
ret=EntityManager().Save(dto,out);
}
if(ret==1)
{
return Helper.Success();
}
else
{
return Helper.Error(out);
}
}
/**
* 删除数据,多个RowID以上尖号分割
* @return 字符串
*/
public String DeleteJRTMenu() throws Exception
{
String RowIDS=Helper.ValidParam(JRTContext.GetRequest(Request, "RowIDS"), "");
if(RowIDS.isEmpty())
{
return Helper.Error("请传入要删除数据的RowID,多个以^分割!");
}
//分割主键
String [] arr=RowIDS.split("\\^");
//out参数
OutParam out=new OutParam();
//循环删除数据
for(int i=0;i<arr.length;i++)
{
int ret=EntityManager().RemoveById(JRTMenu.class,Convert.ToLong(arr[i]),out);
if(ret!=1)
{
return Helper.Error(out);
}
}
return Helper.Success();
}
/**
* 查询数据,前台按表的属性名提交
* @return 字符串
*/
public String QryJRTMenu() throws Exception
{
//预留的取前台参数代码
//参数
List<ParamDto> para=new ArrayList<>();
//sql连接符号
List<String> joiner=new ArrayList<>();
//sql比较符号
List<String> operators=new ArrayList<>();
//模糊查询
String Filter=Helper.ValidParam(JRTContext.GetRequest(Request, "Filter"), "");
//预留参数
//主键
String RowID=Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), "");
//名称
String CName=Helper.ValidParam(JRTContext.GetRequest(Request, "CName"), "");
//上级
String ParentDR=Helper.ValidParam(JRTContext.GetRequest(Request, "ParentDR"), "");
//页面路径
String FormDR=Helper.ValidParam(JRTContext.GetRequest(Request, "FormDR"), "");
//功能描述
String Description=Helper.ValidParam(JRTContext.GetRequest(Request, "Description"), "");
//图标
String Icon=Helper.ValidParam(JRTContext.GetRequest(Request, "Icon"), "");
//序号
String Sequence=Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), "");
//激活 {1:true,0:false}
String Active=Helper.ValidParam(JRTContext.GetRequest(Request, "Active"), "");
//是否置顶显示 {1:true,0:false}
String IsTop=Helper.ValidParam(JRTContext.GetRequest(Request, "IsTop"), "");
//子系统
String SystemSubDR=Helper.ValidParam(JRTContext.GetRequest(Request, "SystemSubDR"), "");
//系统模块
String SystemDR=Helper.ValidParam(JRTContext.GetRequest(Request, "SystemDR"), "");
//空:在Tab页打印,0:弹窗打开,1:独立打开
String OpenModel=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenModel"), "");
//打开宽度
String OpenWidth=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenWidth"), "");
//打开高度
String OpenHeight=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenHeight"), "");
//模糊查询
if(!Filter.isEmpty())
{
ParamDto p=null;
//名称
p=new ParamDto();
p.Key="CName";
p.Value="%"+Filter+"%";
para.add(p);
joiner.add("or");
operators.add("like");
//功能描述
p=new ParamDto();
p.Key="Description";
p.Value="%"+Filter+"%";
para.add(p);
joiner.add("or");
operators.add("like");
//图标
p=new ParamDto();
p.Key="Icon";
p.Value="%"+Filter+"%";
para.add(p);
joiner.add("or");
operators.add("like");
//空:在Tab页打印,0:弹窗打开,1:独立打开
p=new ParamDto();
p.Key="OpenModel";
p.Value="%"+Filter+"%";
para.add(p);
joiner.add("or");
operators.add("like");
}
//调用查询
String json=EntityManager().QueryAllWithFK(JRTMenu.class,para,"",true,-1,-1,"",joiner,operators);
return json;
}
/**
* 查询数据,前台按表的属性名提交
* @return 字符串
*/
public String FindJRTMenu() throws Exception
{
List<HashMap> retList=new ArrayList<>();
//参数
HashParam hs=new HashParam();
//模糊查询
String Filter=Helper.ValidParam(JRTContext.GetRequest(Request, "Filter"), "");
//预留参数
//主键
String RowID=Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), "");
//名称
String CName=Helper.ValidParam(JRTContext.GetRequest(Request, "CName"), "");
//上级
String ParentDR=Helper.ValidParam(JRTContext.GetRequest(Request, "ParentDR"), "");
//页面路径
String FormDR=Helper.ValidParam(JRTContext.GetRequest(Request, "FormDR"), "");
//功能描述
String Description=Helper.ValidParam(JRTContext.GetRequest(Request, "Description"), "");
//图标
String Icon=Helper.ValidParam(JRTContext.GetRequest(Request, "Icon"), "");
//序号
String Sequence=Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), "");
//激活 {1:true,0:false}
String Active=Helper.ValidParam(JRTContext.GetRequest(Request, "Active"), "");
//是否置顶显示 {1:true,0:false}
String IsTop=Helper.ValidParam(JRTContext.GetRequest(Request, "IsTop"), "");
//子系统
String SystemSubDR=Helper.ValidParam(JRTContext.GetRequest(Request, "SystemSubDR"), "");
//系统模块
String SystemDR=Helper.ValidParam(JRTContext.GetRequest(Request, "SystemDR"), "");
//空:在Tab页打印,0:弹窗打开,1:独立打开
String OpenModel=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenModel"), "");
//打开宽度
String OpenWidth=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenWidth"), "");
//打开高度
String OpenHeight=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenHeight"), "");
//模糊查询
if(!Filter.isEmpty())
{
ParamDto p=null;
//名称
hs.Add("CName","%"+Filter+"%","","","like","or");
//功能描述
hs.Add("Description","%"+Filter+"%","","","like","or");
//图标
hs.Add("Icon","%"+Filter+"%","","","like","or");
//空:在Tab页打印,0:弹窗打开,1:独立打开
hs.Add("OpenModel","%"+Filter+"%","","","like","or");
}
//调用查询
List<JRTMenu> allList=EntityManager().FindAllSimple(JRTMenu.class,hs);
if(allList!=null&&allList.size()>0)
{
for(JRTMenu one:allList)
{
HashMap out=new HashMap();
//主键
out.put("RowID",one.RowID);
//名称
out.put("CName",one.CName);
//上级
out.put("ParentDR",one.ParentDR);
out.put("ParentName",EntityManager().DolerGetCName(JRTMenu.class,one.ParentDR));
//页面路径
out.put("FormDR",one.FormDR);
out.put("FormName",EntityManager().DolerGetCName(JRTForm.class,one.FormDR));
//功能描述
out.put("Description",one.Description);
//图标
out.put("Icon",one.Icon);
//序号
out.put("Sequence",one.Sequence);
//激活 {1:true,0:false}
out.put("Active",one.Active);
//是否置顶显示 {1:true,0:false}
out.put("IsTop",one.IsTop);
//子系统
out.put("SystemSubDR",one.SystemSubDR);
out.put("SystemSubSubSysName",Helper.ToStr(EntityManager().DolerGetCol(JRTSystemSub.class,one.SystemSubDR,"SubSysName")));
//系统模块
out.put("SystemDR",one.SystemDR);
out.put("SystemSysName",Helper.ToStr(EntityManager().DolerGetCol(JRTSystem.class,one.SystemDR,"SysName")));
//空:在Tab页打印,0:弹窗打开,1:独立打开
out.put("OpenModel",one.OpenModel);
//打开宽度
out.put("OpenWidth",one.OpenWidth);
//打开高度
out.put("OpenHeight",one.OpenHeight);
retList.add(out);
}
}
return Helper.Object2Json(retList,true);
}
}
JRT源自Cache、探索于C#、落地于Java。带来的不仅仅是技术的革新,更是思想和设计的革新,充分理解数据的28原则,以四两拨千斤的思路改进关系库的多维查询瓶颈。今天我们在lis里面运用这样的架构,明天就有可能在整个医疗乃至信创里推广这样的架构。