事情的原由是这样的:今天在项目中查看mybatis框架的sql语句时候,看到接收参数和返回参数都是Map类型,这使得我忽然眼前一亮,由于以前所接触过的传参和返回类型,除了java的经常使用数据类型以外,就是将传入的参数和返回的数据映射到实体类中。由于以前都没见过接受和返回都是map类型的(多是由于我经验缺少,就是短浅啦)。这里附上图片一张:前端
因此就去查看了一下资料。这里我就真理一下本身的理解。java
1:返回数据。sql
返回为map类型的,其sql查询出来的字段,即为map中的返回字段,map中经过键值对的方式存取这些数据,其key就是sql中所查询的字段,固然,这里须要注意的一点就是,若是此字段为空,那么就不会返回此字段,记住,是不会返回,也就是说在map中的key并不存在这个字段,这个和返回实体类有一点区别,实体类中就算查询出来的数据是空的,也能返回这个字段。json
下面是我随便写的一个测试,目的就是看一下返回的字段:mybatis
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和李四的语文成绩设为空,下面看返回的数据以下:spa
[
{
"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和返回映射到实体类的优缺点code
优势:
首先从上述代码就直接能够看出来,返回为map类型,使用Map做为接收类型时,一般可以在传参到持久层这一过程当中省去不少麻烦。前端请求及参数到达Action或者Controller时一般使用map来进行接收,使用map做为传递类型能够不用再将数据封装为Bean类型再去根据实体属性一一填充,直接经过Service和Dao以map类型将数据传到map配置SQL文件当中,省去不少数据转换环节。
再执行完SQL语句返回时制定map类型返回,无论是单条数据仍是List均可以快速编写并返回给前端。这种方式在处理多表查询时避免了编写大量的实体类和属性字段定义,减小了不少中间流程。
缺点:
缺点也同样明显,没有了实体类,本身就须要记好map中的key-value映射关系,其次其数据不能像映射到实体类中那样,重写getter方法。当另一个同事来接手和维护时,由于没有了实体类,他只能经过查询map调试,或者查看才能知晓。也不利于后期的维护。