1.在已有类中只查询部分属性
如果Car类中有很多属性car_id、car_type、car_number、car_color、car_price等等很多属性,可是我们要查的只有car_id、car_number 应该如何去做
可以在mapper中直接写方法
List<Car> list = findCarInfo(@Param("id") id 查询条件)
然后通过stream-map等方法遍历出来
但是这样会比较麻烦,如果属性很多是个宽表,那么每次会造成很多的浪费;
可以新建一个类PartCar只有两个属性car_id和car_number
public class PartCar{
carId
carNumber
}
(mapper中想直接点到xml文件可以下载 free mybatis plugin )
同样mapper中写查询的方法 方法名比如是 findPartInfo(@param......)
xml中需要新建一个resultMap,它的意思是如果你想在这个xml中查点什么,你得有一个返回的“类”,这个类如何定义,就是resultMap的功能;
<resultMap id = "findPartInfo" type = "com.car.entity.PartCar"></resultMap>
id:给这个resultMap起一个名字
type:这个返回类的全路径
接下来就是他的<result>属性;
<result column="car_id" property="carId" jdbcType="bigint"></result>
<result column="car_number" property="carNumber" jdbcType="varchar"></result>
column:意思就是数据库中的列 一般用下划线这种方式定义;
property:这个和你的类中定义的属性一样;到这里可以看出mapResult就是一个映射关系
jdbcType:数据库中他的属性,一定要看看表里面定义的是啥再写
<result column="create_at" property="createAt" jdbcType="TIMESTAMP"/> 对应数据库中的datetime
2.查询函数生成的属性
select car_id , car_number , count(car_number) as car_count from car where ....
比如这种里面有一个函数生成的属性 ,我要统计有多少次,然后我还要返回这个;
那么PartCar这个类中需要增加一个属性,这个属性记录的就是as后面 car_count的值
同样的它也需要写到<resultMap>中
<result column = car_count property = "carCount" jdbcType = "integer">
这里可以看出刚才说的是和数据库列名一一对应是不完全的,应该是和查询语句中要返回的字段名称的一种映射关系;
public class PartCar{
carId
carNumber
carCount
}
3.查询语句的Xml文件如何写
3.1 select标签
<select id="findCarInfo" resultMap="CallFailInfo">
id:和mapper中的方法名称一致 如果装了插件,会帮你检测;
resultMap:这里当然是填写,刚才定义好的resultMap的id;
其他属性还没有用到比如parameterType 这个好像是规定入参的类型,但是我遇到的查询是入参是一个List,后边带一个Integer ,比如是这样 List<PartCar> result = findCarInfo(@Param("list") List<Integer> list ,@Param("id") Integer id); (不要在第二个参数是id 我想不出来什么参数了,可能会产生疑问有id还查什么id啊 ,我编不出来了,只是举例 查询条件一个list 一个int)
如果遇到这种情况不知道type填什么,直接没写,也没出问题;
3.2 for循环如何写
利用 <foreach>标签
where id in
<foreach collection = "list" item = "item" open="(" separator="," close=")">
#{item}
</foreach>
collection;需要对应入参时想传入的list ,注解param中气的名字
item:这个相当于java中for(Car car : carList)中的小car
open和close相当于循环前后加的字符,正常写sql是where car_id in (1,2,3,4),这里填的就是这俩括号
separator:就是上边正常写的分隔符 这里用逗号;
#{item}:这个好理解,相当于循环出来的东西;
大于小于 这里建议用 #lt; 和 #gt; 用<编译器分不出来这个是标签开头开始小于,有时报错有时不报错;