if(id == null || id.isEmpty()){
if(type == null){
if(name==null || name.isEmpty()){
//...select..sql...
}else {
//...select..sql...
}
}else {
if(name==null || name.isEmpty()){
//...select..sql...
}else {
//...select..sql...
}
}
}else {
if(type == null){
if(name==null || name.isEmpty()){
//...select..sql...
}else {
//...select..sql...
}
}else {
if(name==null || name.isEmpty()){
//...select..sql...
}else {
//...select..sql...
}
}
}
把4个重复的部分提出来,这样代码是否清晰些,一定要写好注释哦
if (id == null || id.isEmpty()) {
if (type == null) {
getSql(1, name);
} else {
getSql(2, name);
}
} else {
if (type == null) {
getSql(3, name);
} else {
getSql(4, name);
}
}
public String getSql(int state, List name) {
switch (state) {
case 1:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
case 2:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
case 3:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
case 4:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
}
}
自己把问题搞复杂了,实际上线上很少有复杂的语句,大多数情况都可以通过分解进行解决。
mybatis的动态sql应该是解决你这个问题的方式。
给个思路:1,在业务处理之前,把这些判断变量的if 写一个类方法,2.通过类方法的返回值判断变量。3,,间接的在业务逻辑处理之前把这些判断就做完。不要把变量的判断和业务逻辑放在一起
if () return;
//somecode
不过你上面的代码我觉得没必要优化
if (id == null || id.isEmpty()) {
if (type == null) {
getSql(1, name);
} else {
getSql(1, name);
}
} else {
if (type == null) {
getSql(3, name);
} else {
getSql(4, name);
}
}
public String getSql(int state, List name) {
switch (state) {
case 1:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
case 2:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
case 3:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
case 4:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
}
}
for(int i=0;i<5;i++){
if(i==2){
System.out.println("i==2时忽略了");
continue;//忽略i==2时的循环
}
System.out.println("当前i的值为"+i);
}
for(int i =0;i<5;i++){
System.out.println("当前i的值"+i);
if(i==2){
return; //直接结束main()方法
}
}
for(int i =0;i<5;i++){
System.out.println("当前i的值"+i);
if(i==2){
break; //直接结束for循环
}
}
bgm:for(int i=0;i<2;i++){
for(int j=0;j<4;j++){
System.out.println("当前i的值"+j);
if(j==2){
System.out.println("当前j的值="+j);
break bgm;//跳出外循环,给外循环起一个名字,然后使用break 名字 跳出外循环
}
}
}
把4个重复的部分提出来,这样代码是否清晰些,一定要写好注释哦
if (id == null || id.isEmpty()) {
if (type == null) {
getSql(1, name);
} else {
getSql(2, name);
}
} else {
if (type == null) {
getSql(3, name);
} else {
getSql(4, name);
}
}
public String getSql(int state, List name) {
switch (state) {
case 1:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
case 2:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
case 3:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
case 4:
if (name == null || name.isEmpty()) {
// ...select..sql...
} else {
// ...select..sql...
}
}
}
如果判断条件相同,可以写个方法,用反射遍历所有需要检查的字段,做相同的检查和处理。
看if之间的“包含”与“并列”关系,从而判断if之间的关系!
if () return;
//somecode
不过你上面的代码我觉得没必要优化
这个具体情况具体处理。一个参考建议是判是改成判否。比如:
if (boolean-expression1) {
if(boolean-expression2) {
doSomething();
}
}
改成
if (!boolean-expresssion1) {
return;
}
if (boolean-expression2) {
doSomething();
}
不管怎么判断,其实就是判断的地方可以有选择性,比如在页面上判断,比如java中判断,比如mybatis中判断。无非是这几种方式。如果以上30个字段都是必填项
可以在页面中进行为空判断,使用插件。可以省掉很多代码量。
你判断空应该是用来判断是否按此条件查询查询的吧,mybatis的动态sql就可以了。
按照你写的我写了一个动态sql,你可以参考下,应该有用:
SELECT * FROM TEST
AND ID
=#{ id }
AND TYPE
=#{ type }
AND NAME
=#{ name }
ID
=#{ id }TYPE
=#{ type }NAME
=#{ name }xml竟然被影藏了,上个截图吧
你现在遇到的问题应该是,不同的情况下,你需要使用不同的sql语句。但是排列组合的数量上去了,你要写的if else就太多了。可以用拼接字符串的方法解决,如果需要就把where后的查询条件拼接,不需要就不进入。可以少些很多代码。如果你用到Hibernate的话,可以使用criteria,也可以解决。
目前需要写一个判断完整度的方法
A实体类共有20个字段,其中12个字段参与计算,计作:a1到a12
B实体类共有16个字段,其中8个字段参与计算,计作:b1到b8
C实体类共有19个字段,其中10个字段参与计算,计作:c1到c10
所有30个字段都不为空才算完整
目前的判断语句为:
if (!StringUtils.isEmpty(a1) && ...
&& !StringUtils.isEmpty(c10)){
return true;
}