Postanowiłem spróbować użyć mybatis do nowego projektu. Dobrze znam SQL, a ostatnio miałem złe doświadczenia z hibernacją, więc szukam bardziej niskopoziomowego podejścia do DAO.Zbieranie/aktualizowanie kolekcji za pomocą mybatis, jaka jest powszechna praktyka?
Wydaje się być całkiem miłym, z wyjątkiem jednej rzeczy, a to dotyczy kolekcjonowania.
Mam dwa POJO, grupy i użytkownika, które są wiele-do-wielu. Zdecydowałem się na filozofię projektowania, że POJO, które ma kolekcję, powinno jedynie aktualizować relację M-M między tabelami podczas zapisywania. Tak więc, na przykład, kiedy zapisuję obiekt grupowy, który ma kolekcję użytkowników, filozofia projektowania nakazuje, aby użytkownicy byli już zapisywani, a ja muszę tylko zapisać grupę i relację group_user w bazie danych.
tak, dla funkcji saveGroup w interfejsie, zrobiłem to odwzorowanie XML mybatis:
<insert id="saveGroup" keyColumn="id"
parameterType="se.myapp.domain.Group">
<choose>
<when test="id == null">
INSERT INTO myapp_group (name, description)
VALUES
(#{username}, #{password});
</when>
<otherwise>
UPDATE myapp_group set name=#{name}, description=#{description}
where id=#{id};
</otherwise>
</choose>
<if test="users != null">
create temporary table tmpnewgroups (group_id integer, user_id integer);
insert into tmpnewgroups (group_id, user_id) values (
<foreach collection="users" item="user" open="" close="" separator="),()">
#{id},#{user.id}
</foreach>
);
insert into myapp_user_group(group_id, user_id)
select tmp.group_id, tmp.user_id
from tmpnewgroups tmp
left outer join myapp_user_group ug
on ug.group_id = tmp.group_id and ug.user_id = tmp.user_id
where ug.group_id is null;
delete from myapp_user_group
where group_id = #{id} and user_id not in (select user_id from tmpnewgroups);
</if>
</insert>
ten działa zgodnie z przeznaczeniem (insert/aktualizuje grupę, zapisuje zbiór użytkowników jako stosunków w bazie danych). Ale nie uważam, że to najlepsza praktyka. Aplikacja jest tak wykonana, że w razie potrzeby mogę przejść do hibernacji, więc logika do zapisywania kolekcji powinna znajdować się w warstwie bazy danych. Czy istnieje jakaś "magia" w mybatis, której nie jestem w stanie uświadomić, że mogłaby usprawnić takie operacje?
Jakieś przemyślenia na temat tego, jak to poprawić? Czy powinienem ponownie przemyśleć projekt aplikacji i umieścić w kolekcji dalej obsługę kolekcji?
czy był problem z użyciem '' i jego '' do opisania wielu: wiele relacji? –
Gus
Cóż afaik resultmaps służą do uzyskiwania danych, a nie do zapisywania danych. Uzyskanie kolekcji nie stanowi problemu, jest to zapisanie ich, które uważam za kłopotliwe. – Dytut
Czy przyjrzał Ci się [Generator MyBatis] (https://code.google.com/p/mybatis/wiki/Generator)? Wygeneruje podstawowe operacje CRUD, dzięki czemu zaoszczędzisz mnóstwo ręcznie kodowanych instrukcji SQL, więc będziesz musiał pisać tylko bardziej skomplikowane połączenia itd. Możesz użyć wygenerowanego kodu w swoim DAO i przenieść wiele logiki wyboru, które posiadasz Twój XML do DAO. – clav