求大神们讲解,红色框中的内容为什么这样????

图片说明

下面的这个恒等1=1,我见到过这样写但是不是特别理解这个是什么意思。为什么不能直接
写下面中的内容非要在前面加上一个1=1?

第二个问题是:parametype="map"这是以前就没有见过这么写过。这么写,接口中的参数怎么写?前端网后端传的时候怎么传呢?后台怎么接收呢?求解啊????

先来讲解一下第一个红色框:这个表示的是在下面使用#{变量名} 的来源是一个Map对象。这里的Map对象是参入的参数,而这个Map对象里面存放了
下面的bnId 、bnName、bnPId这些变量,这些变量就是Map里面放入的key,下面的这个例子:
Map map = new HashMap<>();
map.put("bnId", "a");
map.put("bnName", "b");
map.put("bnPId", "c");

    dao.getBSNetTree(map);

第二个问题:
SELECT * FROM T_BUS_NET WHERE 1=1

AND BN_ID = #{bnId}


AND BN_NAME = #{bnName}


AND BN_PID = #{bnPId}

ORDER BY BN_PID
当: bnId、bnName、bnPId这几个变量值都为null的时候,sql语句就变成了:
SELECT * FROM T_BUS_NET WHERE 1=1 ORDER BY BN_PID

如果没有这个1=1作为where的条件,那么sql将变更成下面这个样子,那么这个sql的语法就是错误的,程序就会出现异常:
SELECT * FROM T_BUS_NET WHERE ORDER BY BN_PID

应该能明白了吧?

如果不写1=1,那么你的语句就是 SELECT * FROM T_BUS_NET;假设你第一个条件成立也就是,对应的sql语句就是SELECT * FROM T_BUS_NET AND BN_ID=#{bnId},这样语句就不对了。加1=1,主要是为了能和后面条件顺利拼接上,尤其是多条件组合。

1.Where 1=1,原因是后面的条件都是有标签包含的,也就是可能后面所有条件都不成立。如果不加1=1,这个时候的SQL就是:

 select * from T_BUG_NET where order by BN_PID

SQL语法就是错误的。因此加个1=1 表示恒成立。
2.parameterType="map",这样写和parameterType="java.util.Map"是一样的效果,map在mybatis中被定义为type:java.util.Map;
Map的参数你就直接可以写hashMap,里面可以很灵活的传各种类型。

【1】下面的这个恒等1=1,我见到过这样写但是不是特别理解这个是什么意思。为什么不能直接写下面中的内容非要在前面加上一个1=1?

为了拼接,,假如说,下面几个if都没执行,sql以where结尾是不是有点问题。
所以加上1=1,,为了拼接动态sql

【1】第二个问题是:parametype="map"这是以前就没有见过这么写过。这么写,接口中的参数怎么写?前端网后端传的时候怎么传呢?后台怎么接收呢?求解啊????
参数类型时map,意思时传入的参数类型是map,,,这样写貌似有点问题哎