Cette fois, j'ai essayé de joindre deux tables.
Entity
<Classe d'entité parent>
Player.java
package com.mybatis.test.domain;
import java.util.List;
import lombok.Data;
@Data
public class Player {
private String id;
private String name;
private String age;
//Définir les éléments de la classe enfant(1 à 1)
private Detail detailIds;
}
<Classe d'entité enfant>
Detail.java
package com.mybatis.test.domain;
import lombok.Data;
@Data
public class Detail {
private String detailId;
private String work;
}
Puisque la relation parent-enfant de la table est connectée par detail_id, préparez une variable pour l'élément enfant dans Player.java.
XML
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.mybatis.test.domain.MyBatisMapper">
<select id="selectItem" resultMap="playerMap">
SELECT
player.id
,player.name
,player.detail_id
,detail.work
FROM
player
JOIN
detail
ON
player.detail_id=detail.detail_id
WHERE
player.id=#{id}
</select>
<!--Spécifiez comment mapper le résultat SELECT de la table-->
<resultMap id="playerMap" type="com.mybatis.test.domain.Player">
<id property="id" column="id" />
<result property="name" column="name" />
<association property="detailIds" resultMap="detailResult"/>
</resultMap>
<resultMap id="detailResult" type="com.mybatis.test.domain.Detail">
<result property="detailId" column="detail_id" />
<result property="work" column="work" />
</resultMap>
</mapper>
Le résultat de la recherche est défini séparément dans l'élément resultMap.
Dans resultMap, le résultat est mappé au contenu (Player cette fois) que vous voulez réellement obtenir dans le résultat de la recherche. property fait référence à une propriété (variable) du côté de la classe Java. colonne fait référence à une colonne SQL.
De plus, puisque cette fois nous avons une relation 1: 1, nous utiliserons l'association. Associer aux éléments enfants dans le resultMap de l'association.
Interface
MyBatisMapper.java
package com.mybatis.test.domain;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface MyBatisMapper {
//Pour tester JOIN
public Player selectItem(String id);
Service
MyBatisService.java
package com.mybatis.test.domain;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MyBatisService {
@Autowired
MyBatisMapper mapper;
//JOIN
@Transactional
public Player selectItem(String id) {
return mapper.selectItem(id);
}
Controller
Controller
@Controller
public class MybatisController {
@Autowired
MyBatisService myBatisService;
Player player = new Player();
player = myBatisService.selectItem("002");
model.addAttribute("playerDetail", player);
return "index";
}
Jsp
<div th:object="${playerDetail}">
<div>
<label><b>Nom</b></label>
<p th:text="${playerDetail.name}">
</div>
<div>
<label><b>travaux</b></label>
<p th:text="${playerDetail.detailIds.work}">
</div>
</div>
Entity
<Entité parente>
Player.java
package com.mybatis.test.domain;
import java.util.List;
import lombok.Data;
@Data
public class Player {
private String id;
private String name;
private String age;
private Detail detailIds;
//Définition d'élément de la classe enfant(Un à plusieurs)
private List<Item> items;
}
Puisqu'il s'agit d'un à plusieurs, j'ai défini un type de liste dans le champ.
<Entité enfant>
Item.java
package com.mybatis.test.domain;
import lombok.Data;
@Data
public class Item {
private String id;
private String item;
}
XML
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.mybatis.test.domain.MyBatisMapper">
<select id="selectChoice" resultMap="itemMap">
select
player.id
,player.name
,item.items
from
player
join
item
on
player.id = item.id
where
player.id=#{id}
</select>
<!--Spécifiez comment mapper le résultat SELECT de la table-->
<resultMap id="itemMap" type="com.mybatis.test.domain.Player">
<id property="id" column="id" />
<result property="name" column="name" />
<collection property="items" ofType="com.mybatis.test.domain.Item">
<result property="id" column="id" />
<result property="item" column="items" />
</collection>
</resultMap>
</mapper>
Pour un-à-plusieurs, utilisez la balise de collection. (Balise d'association pour un à un) Dans la propriété de la balise de collection, définissez les champs (éléments) de la classe parent (Player.java) qui regroupe les classes enfants (Item.java). Dans ofType, spécifiez la classe enfant.
même ici,
l'interface et le service sont omis.
Controller
MybatisController.java
@Controller
public class MybatisController {
@Autowired
MyBatisService myBatisService;
@GetMapping()
public String index(Model model) {
Player playerChoise = myBatisService.selectChoice("002");
//Reconditionner dans la liste des types d'élément
List<Item> itemsList = playerChoise.getItems();
model.addAttribute("itemsList", itemsList);
Jsp
<!-- th:Obtenez un élément à la fois avec chacun-->
<div th:each="item : ${itemsList}">
<p th:text="${item.item}">
</div>