事情的起因是这样的:今天在项目中查看mybatis框架的sql语句时候,看到接收参数和返回参数都是Map类型,这使得我突然眼前一亮,因为之前所接触过的传参和返回类型,除了java的常用数据类型之外,就是将传入的参数和返回的数据映射到实体类中。因为之前都没见过接受和返回都是map类型的(可能是因为我经验缺乏,就是短浅啦)。这里附上图片一张:
所以就去查看了一下资料。这里我就真理一下自己的理解。
1:返回数据。
返回为map类型的,其sql查询出来的字段,即为map中的返回字段,map中通过键值对的方式存取这些数据,其key就是sql中所查询的字段,当然,这里需要注意的一点就是,如果此字段为空,那么就不会返回此字段,记住,是不会返回,也就是说在map中的key并不存在这个字段,这个和返回实体类有一点区别,实体类中就算查询出来的数据是空的,也能返回这个字段。
下面是我随便写的一个测试,目的就是看一下返回的字段:
sql语句如下:
1 <select id="testResultMap" resultType="java.util.Map"> 2 SELECT 3 student.*, 4 grade.c_fs, 5 grade.c_kc 6 FROM 7 student 8 LEFT JOIN grade ON grade.c_stuId = student.id 9 </select>
student表字段和grade表字段和数据如下:
这里为了验证数据为空时候,是否返回此字段,我专门把张三的goTime和李四的语文成绩设为空,下面看返回的数据如下:
[
{
"classes":"五年级一班",
"id":2,
"c_fs":100,
"sex":1,
"c_kc":"数学",
"age":211,
"userName":"张三"
},
{
"classes":"五年级二班",
"id":3,
"goTime":"2018-12-31",
"sex":0,
"c_kc":"语文",
"age":212,
"userName":"李四"
}
]
可以看到,字段就是sql里面查询的字段里面张三的goTime和李四的c_fs直接没有返回,这也验证了之前所说的字段为空直接不返回此字段。
2:返回map和返回映射到实体类的优缺点
优点:
首先从上述代码就直接可以看出来,返回为map类型,使用Map作为接收类型时,通常能够在传参到持久层这一过程中省去很多麻烦。前端请求及参数到达Action或者Controller时通常使用map来进行接收,使用map作为传递类型可以不用再将数据封装为Bean类型再去根据实体属性一一填充,直接通过Service和Dao以map类型将数据传到map配置SQL文件当中,省去很多数据转换环节。
再执行完SQL语句返回时制定map类型返回,不管是单条数据还是List都可以快速编写并返回给前端。这种方式在处理多表查询时避免了编写大量的实体类和属性字段定义,减少了很多中间流程。
缺点:
缺点也一样明显,没有了实体类,自己就需要记好map中的key-value映射关系,其次其数据不能像映射到实体类中那样,重写getter方法。当另外一个同事来接手和维护时,因为没有了实体类,他只能通过查询map调试,或者查看才能知晓。也不利于后期的维护。