MyBatis查询专题
参数处理指定了接口方法的sql传值规范,这里解决查询结果处理、字段映射的细节。
使用 POJO 封装结果集
结果集的每条记录的封装由 resultType 属性指定,通过 setter 方法进行封装。
<select id="" resultType="POJO全限定类名或别名">
</select>查询结果集最终封装的类型取决于接口方法的返回值。
返回单个 POJO
Car selectById(Long id);
// Car selectAll();
// 报错 TooManyResultsException,当结果集记录多于一条时,不能采用单个实体类接收返回 List<POJO>
List<Car> selectByIdToList(Long id);
// 查询结果即使是至多一条,也可以封装为List返回
List<Car> selectAll();返回 Map<String, POJO>
将指定字段值作为 map 的key,将每条记录封装成一个 pojo 作为value。
- ?key的类型可以是简单类型。
@MapKey("id") // 指定作为key值的字段名
Map<Long,Car> selectAllRetMap();
使用 Map 封装结果集
<select id="" resultType="map">
</select>当返回的数据,没有合适的实体类对应的话,可以采⽤Map集合接收。字段名做key(String类型),字段值做value(Object类型)。
- resultType="map" 使用的是mybatis的内置别名。
返回单个 Map
查询如果可以保证只有⼀条数据,则返回⼀个Map集合即可。
Map<String, Object> selectByIdRetMap(Long id);如果查询记录多余一条,则报错 TooManyResultsException。
返回 List<Map>
查询结果条数⼤于等于1条数据,则可以返回⼀个存储Map集合的List集合。类似于List<POJO>,List 中的每个 map 封装了一条记录,key为字段名,value为字段值。
List<Map<String,Object>> selectAllRetListMap();
返回 Map<String, Map>
将指定字段值作为 map 的Key,将每条记录封装成一个 map 作为value。
?key的类型可以是简单类型。
便于根据字段索引记录。如:根据id确定记录。
@MapKey("id") // 指定作为key值的字段名
Map<Long,Map<String,Object>> selectAllRetMap();
结果映射
查询结果的列名和java对象的属性名对应不上怎么办?
第⼀种⽅式:as 给列起别名
第⼆种⽅式:使用<resultMap>进行结果映射
第三种⽅式:配置<settings>,开启驼峰命名自动映射
使用<resultMap>进行结果映射
在 SQL映射文件中,配置这个文件中DQL的执行结果封装的映射规则。
<!--
resultMap:
id:这个结果映射的标识,作为select标签的resultMap属性的值。
type:结果集要映射的类。可以使⽤别名。
-->
<resultMap id="carResultMap" type="car">
<!--对象的唯⼀标识,通常为主键值,官⽅解释是:为了提⾼mybatis的性能。建议写上。-->
<id property="id" column="id"/>
<!--当属性名和数据库列名⼀致时,可以省略。但建议都写上。-->
<result property="carNum" column="car_num"/>
<!--javaType⽤来指定属性类型。jdbcType⽤来指定列类型。⼀般可以省略。-->
<result property="brand" column="brand" javaType="string" jdbcType="VARCHAR"/>
<result property="guidePrice" column="guide_price"/>
<result property="produceTime" column="produce_time"/>
<result property="carType" column="car_type"/>
</resultMap>
<!--resultMap属性的值必须和resultMap标签中id属性值⼀致。-->
<select id="selectAllByResultMap" resultMap="carResultMap">
select * from t_car
</select>
<!--使用resultMap后,无需指定resultType,因为结果映射配置了type属性,这个就是记录的封装类型-->开启驼峰命名自动映射
前提:属性名遵循Java的命名规范,数据库表的列名遵循SQL的命名规范。
Java命名规范:⾸字⺟⼩写,后⾯每个单词⾸字⺟⼤写,遵循驼峰命名⽅式。
SQL命名规范:全部⼩写,单词之间采⽤下划线分割。
启用驼峰自命名映射,需要 mybatis核心配置文件 中配置:
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>SQL 映射中就不需要配置结果映射,或是起别名了:
<select id="selectAllByMapUnderscoreToCamelCase" resultType="Car">
select * from t_car
</select>返回简单类型
当记录只有一条且一个字段时,可以采用简单类型返回。如:
<!--long是别名,可参考mybatis开发⼿册。-->
<select id="selectTotal" resultType="long">
select count(*) from t_car
</select>接口方法直接采用简单类型返回即可:
Long selectTotal();