springboot + mybatis discriminator (鉴别器)使用
表结构:
mk_discriminatorparent
mk_discriminatorchildren1
mk_discriminatorchildren2
entity:
DiscriminatorParent
public class DiscriminatorParent implements Serializable {
private Integer id;
private String message;
private List<DiscriminatorChildren1> discriminatorChildren1List;
private List<DiscriminatorChildren2> discriminatorChildren2List;
get set ......
DiscriminatorChildren1
public class DiscriminatorChildren1 implements Serializable {
private Integer id;
private String message;
set get ......
DiscriminatorChildren2
public class DiscriminatorChildren2 implements Serializable {
private Integer id;
private String message;
get set......
}
mapper:
DiscriminatorParentMapper
@Repository
public interface DiscriminatorParentMapper {
List<DiscriminatorParent> findAll();
}
DiscriminatorChildren1Mapper
@Repository
public interface DiscriminatorChildren1Mapper {
List<DiscriminatorChildren1> findByParentId(Integer parentId);
}
DiscriminatorChildren2Mapper
@Repository
public interface DiscriminatorChildren2Mapper {
List<DiscriminatorChildren2> findByParentId(Integer parentId);
}
mapper.xml:
DiscriminatorParentMapper.xml
这里需要注意 类型为parent类
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.mapper.DiscriminatorParentMapper">
<resultMap id="discriminatorParentMap" type="discriminatorParent">
<id column="id" property="id"/>
<result column="message" property="message"/>
<discriminator javaType="String" column="message">
<case value="to discriminatorchildren1" resultMap="discriminatorChildrenMap1"/>
<!--<case value="to discriminatorchildren1" resultType="discriminatorParent">-->
<!--<collection property="discriminatorChildren1List" fetchType="eager" column="id" select="com.demo.mapper.DiscriminatorChildren1Mapper.findByParentId"/>-->
<!--</case>-->
<case value="to discriminatorchildren2" resultMap="discriminatorChildrenMap2"/>
</discriminator>
</resultMap>
<resultMap id="discriminatorChildrenMap1" type="discriminatorParent">
<collection fetchType="eager" property="discriminatorChildren1List" column="id" javaType="List" select="com.demo.mapper.DiscriminatorChildren1Mapper.findByParentId"/>
</resultMap>
<resultMap id="discriminatorChildrenMap2" type="discriminatorParent">
<collection fetchType="eager" property="discriminatorChildren1List" column="id" javaType="List" select="com.demo.mapper.DiscriminatorChildren2Mapper.findByParentId"/>
</resultMap>
<select id="findAll" resultMap="discriminatorParentMap">
select * from mk_discriminatorparent;
</select>
</mapper>
DiscriminatorChildren1Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.mapper.DiscriminatorChildren1Mapper">
<select id="findByParentId" resultType="DiscriminatorChildren1" parameterType="Integer">
select * from mk_discriminatorchildren1 where parent_id = #{parentId}
</select>
</mapper>
DiscriminatorChildren2Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.mapper.DiscriminatorChildren2Mapper">
<select id="findByParentId" resultType="DiscriminatorChildren2" parameterType="Integer">
select * from mk_discriminatorchildren2 where parent_id = #{parentId}
</select>
</mapper>
service:
@Service
public class DiscriminatorParentService {
@Autowired
DiscriminatorParentMapper discriminatorParentMapper;
public List<DiscriminatorParent> findAll(){
return discriminatorParentMapper.findAll();
}
}
controller:
DiscriminatorController
@RestController
@RequestMapping("dir")
public class DiscriminatorController {
@Autowired
DiscriminatorParentService discriminatorParentService;
@GetMapping("findAll")
public ResponseEntity findAll(){
return ResponseEntity.ok(discriminatorParentService.findAll());
}
}
测试结果:
注解版