Tôi đã quyết định thử và sử dụng mybatis cho một dự án mới. Tôi đã quen thuộc với SQL, và tôi đã có một số kinh nghiệm xấu với hibernate gần đây vì vậy tôi đang tìm kiếm một cách tiếp cận cấp thấp hơn để DAO.Lưu/Cập nhật bộ sưu tập với mybatis, thực hành phổ biến là gì?
Dường như khá đẹp, ngoại trừ một điều, và đó là xử lý các bộ sưu tập.
Tôi có hai POJO, nhóm và người dùng, nhiều người dùng. Tôi đã quyết định một triết lý thiết kế rằng một POJO có một bộ sưu tập chỉ nên cập nhật mối quan hệ M-M giữa các bảng khi được lưu. Vì vậy, ví dụ, khi tôi lưu một đối tượng nhóm có một bộ sưu tập người dùng, triết lý thiết kế ra lệnh cho người dùng đã được lưu, và tôi chỉ phải lưu nhóm và mối quan hệ group_user trong cơ sở dữ liệu.
như vậy, cho hàm saveGroup trong giao diện, tôi đã thực hiện lập bản đồ XML này cho 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>
Công việc này không như mong đợi (chèn/cập nhật nhóm, tiết kiệm bộ sưu tập của người sử dụng như các mối quan hệ trong cơ sở dữ liệu). Nhưng tôi không thực sự cảm thấy rằng đây là thực hành tốt nhất. Ứng dụng được tạo ra để tôi có thể chuyển sang chế độ ngủ đông nếu cần, do đó, logic để lưu bộ sưu tập tốt nhất nên ở trong lớp cơ sở dữ liệu. Có một số "ma thuật" trong mybatis mà tôi không biết điều đó có thể sắp xếp các hoạt động như thế này không?
Bất kỳ suy nghĩ nào về cách cải thiện điều này? Hoặc tôi nên suy nghĩ lại về thiết kế ứng dụng và đưa việc xử lý các bộ sưu tập lên cao hơn trong mô hình?
đã xảy ra sự cố khi sử dụng ' 'và' ' của nó để mô tả nhiều: nhiều mối quan hệ? –
Gus
Kết quả tốt cho việc thu thập dữ liệu, không lưu dữ liệu. Bắt một bộ sưu tập là không có vấn đề, nó tiết kiệm cho họ rằng tôi đã tìm thấy được cồng kềnh. – Dytut
Bạn đã xem xét sử dụng [Trình tạo MyBatis] (https://code.google.com/p/mybatis/wiki/Generator) chưa? Nó sẽ tạo ra các hoạt động CRUD cơ bản để bạn tiết kiệm cho bạn một tấn SQL được mã hóa bằng tay để bạn chỉ phải viết các phép nối phức tạp hơn, v.v. Bạn có thể sử dụng mã được tạo trong DAO của bạn và di chuyển rất nhiều logic lựa chọn mà bạn có XML của bạn vào DAO. – clav