设为首页 收藏本站
查看: 970|回复: 0

[经验分享] MyBatis 3中实现一对多的插入和查询

[复制链接]

尚未签到

发表于 2016-11-27 10:22:11 | 显示全部楼层 |阅读模式
  summary:
  MyBatis3中实现一对多的查询比较简单,可以自动完成。但插入操作要复杂一些,需要相关的DAO配合完成,这点不如Hibernate。
  

  场景描述:
  类:Mail和Attachment类
  关系描述:一封邮件(Mail)可以有0个或多个附件(Attachment),附件(Attachment)仅对应一封邮件。
  表格:mail表(主键:id_mail)和attachment表(外键:id_mail)。
  

POJO:
Mail.java
public class Mail implements Serializable {private static final long serialVersionUID = 7427977743354005783L;private Integer id;private String sender;private String subject;private String content;private String fromAddress;...getters and setters...}
Attachment.java
public class Attachment implements Serializable {private static final long serialVersionUID = -1863183546552222728L;private String id;private String mailId;private String name;private String relativePath;...getters and setters...}SqlMapConfig:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="test/properties/mysql.properties"></properties><typeAliases><typeAlias type="test.model.Mail" alias="Mail"/><typeAlias type="test.model.Attachment" alias="Attachment"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="UNPOOLED"><property name="driver" value="${db_driver}" /><property name="url" value="${db_url}" /><property name="username" value="${db_user}" /><property name="password" value="${db_password}"/></dataSource></environment></environments>  <mappers><mapper resource="test/data/MailMapper.xml"/><mapper resource="test/data/AttachmentMapper.xml"/></mappers></configuration>Mappers
MailMapper.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="test.data.MailMapper"><cache /><resultMap type="Mail" id="result_base"><id property="id" column="id_mail" /><result property="sender" column="sender"/><result property="fromAddress" column="from_address" /><result property="subject" column="subject"/><result property="content" column="content"/><result property="sendTime" column="send_time" />....</resultMap><!--这里是关键,一对多映射的“魔法”几乎都在<collection>的配置里。select=...中"test.data.AttachmentMapper"对应于AttachmentMapper中            的namespace--><resultMap type="Mail" id="result" extends="result_base"><collection property="attachments" javaType="ArrayList" column="id_mail" ofType="Attachment" select="test.data.AttachmentMapper.selectByMailId"/></resultMap><insert id="insert" parameterType="Mail" useGeneratedKeys="true" keyProperty="id_note">insert into note(sender, from_address, subject, content, send_time)values(#{sender}, #{fromAddress}, #{subject}, #{content}, #{sendTime})<selectKey keyProperty="id_mail" resultType="int"> select LAST_INSERT_ID() </selectKey> </insert><select id="selectById" parameterType="int" resultMap="result" >select * from mail where id_mail = #{id}</select><select id="selectAllMails" resultMap="result">select * from note Note</select><!--这里可以获得刚插入表格的id,为后面attachment的插入提供了mailId字段--><select id="selectLastId" resultType="int">select LAST_INSERT_ID() </select></mapper>AttachmentMapper.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="test.data.AttachmentMapper"><cache /><resultMap type="Attachment" id="result"><result property="id" column="id_accessory" /><result property="name" column="name" /><result property="relativePath" column="relative_path" /><result property="mailId" column="id_mail" /></resultMap><insert id="insert" parameterType="Attachment">insert into attachments(id_mail, name, relative_path) values(#{mailId}, #{name}, #{relativePath})</insert><!--MailMapper中的ResultMap调用这个方法来进行关联--><select id="selectByMailId" parameterType="int" resultMap="result">select id, id_mail, name, relative_pathfrom attachments where id_note = #{id}</select></mapper>
DAO

AttachmentDAO
public class AttachmentDAO {private SqlSessionFactory sqlSessionFactory;public AttachmentDAO(){this.sqlSessionFactory = TestConnectionFactory.getSqlSessionFactory();}public void insert(Attachment attachment){SqlSession session = sqlSessionFactory.openSession();AttachmentMapper attachmentMapper = session.getMapper(AttachmentMapper.class); try {attachmentMapper.insert(attachment);session.commit();} finally {session.close();}}}

MailDAO

public class MailDAO {private SqlSessionFactory sqlSessionFactory; public MailDAO(){sqlSessionFactory = TestConnectionFactory.getSqlSessionFactory();} public void insertMailOnly(Mail mail){SqlSession session = sqlSessionFactory.openSession();MailMapper mailMapper = session.getMapper(MailMapper.class);try {mailMapper.insert(mail);       session.commit();} finally {session.close();}} //inset public void insertMail(Mail mail){SqlSession session = sqlSessionFactory.openSession();MailMapper mailMapper = session.getMapper(MailMapper.class);AttachmentMapper attachmentMapper = session.getMapper(AttachmentMapper.class);try{mailMapper.insert(mail);//这里必须commit,再执行Attachment的插入操作。否则会导致null pointer异常session.commit();//获得最近插入到note表的idint mailId = mailMapper.selectLastId();for(Attachment attach : mail.getAttachments()){attach.setMailId(String.valueOf(mailId));attachmentMapper.insert(attach);}session.commit();}finally{session.close();}}public ArrayList<Mail> selectAllMails(){    ArrayList<Mail> mailList = null;SqlSession session = sqlSessionFactory.openSession();MailMapper mailMapper = session.getMapper(MailMapper.class);try {        mailList = mailMapper.selectAllMails();session.commit();} finally {session.close();}return mailList;} public Mail selectMailById(int i){Mail mail = null;SqlSession session = sqlSessionFactory.openSession();MailMapper mailMapper = session.getMapper(MailMapper.class);try {        mail = mailMapper.selectById(i);session.commit();} finally {session.close();}return mail;}public int selectLastId(){int id = -1;SqlSession session = sqlSessionFactory.openSession();MailMapper mailMapper = session.getMapper(MailMapper.class);try {        id = mailMapper.selectLastId();session.commit();} finally {session.close();}return id;}}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-306086-1-1.html 上篇帖子: 避免mybatis generator生成Example类的配置方法 下篇帖子: ibatis / mybatis 存储过程调用 区别 以及例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表