MyBatis 3中实现一对多的插入和查询

MyBatis 3中实现一对多的插入和查询

summary:

MyBatis3中实现一对多的查询比较简单,可以自动完成。但插入操作要复杂一些,需要相关的DAO配合完成,这点不如Hibernate。

场景描述:

类:Mail和Attachment类

关系描述:一封邮件(Mail)可以有0个或多个附件(Attachment),附件(Attachment)仅对应一封邮件。

表格:mail表(主键:id_mail)和attachment表(外键:id_mail)。

POJO:

Mail.java

Java代码 

  1. public class Mail implements Serializable {  
  2.     private static final long serialVersionUID = 7427977743354005783L;  
  3.     private Integer id;  
  4.     private String sender;  
  5.     private String subject;  
  6.     private String content;  
  7.     private String fromAddress;  
  8. ...  
  9. getters and setters...  
  10. }  

Attachment.java

Java代码 

  1. public class Attachment implements Serializable {  
  2.     private static final long serialVersionUID = -1863183546552222728L;  
  3.     private String id;  
  4.     private String mailId;  
  5.     private String name;  
  6.     private String relativePath;  
  7. ...  
  8. getters and setters...  
  9. }  

SqlMapConfig:

Html代码 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  3. <configuration>  
  4.     <properties resource="test/properties/mysql.properties"></properties>  
  5.       
  6.     <typeAliases>  
  7.         <typeAlias type="test.model.Mail" alias="Mail"/>  
  8.         <typeAlias type="test.model.Attachment" alias="Attachment"/>        
  9.     </typeAliases>  
  10.       
  11.       
  12.     <environments default="development">  
  13.         <environment id="development">  
  14.             <transactionManager type="JDBC" />  
  15.             <dataSource type="UNPOOLED">  
  16.                 <property name="driver" value="${db_driver}" />  
  17.                 <property name="url" value="${db_url}" />  
  18.                 <property name="username" value="${db_user}" />  
  19.                 <property name="password" value="${db_password}"/>  
  20.             </dataSource>  
  21.         </environment>  
  22.     </environments>    
  23.           
  24.     <mappers>  
  25.     <mapper resource="test/data/MailMapper.xml"/>  
  26.     <mapper resource="test/data/AttachmentMapper.xml"/>  
  27.     </mappers>      
  28. </configuration>  

Mappers

MailMapper.xml

Html代码 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  3. <mapper namespace="test.data.MailMapper">  
  4.     <cache />  
  5.   
  6.     <resultMap type="Mail" id="result_base">  
  7.         <id property="id" column="id_mail" />  
  8.         <result property="sender" column="sender"/>  
  9.         <result property="fromAddress" column="from_address" />  
  10.         <result property="subject" column="subject"/>  
  11.         <result property="content" column="content"/>  
  12.         <result property="sendTime" column="send_time" />  
  13.             ....  
  14.     </resultMap>  
  15.     <!--这里是关键,一对多映射的“魔法”几乎都在<collection>的配置里。select=...中"test.data.AttachmentMapper"对应于AttachmentMapper中  

Html代码 

  1.             的namespace-->  
  2.     <resultMap type="Mail" id="result" extends="result_base">  
  3.         <collection property="attachments" javaType="ArrayList" column="id_mail" ofType="Attachment"   
  4.         select="test.data.AttachmentMapper.selectByMailId"/>  
  5.     </resultMap>  
  6.       
  7.     <insert id="insert" parameterType="Mail" useGeneratedKeys="true" keyProperty="id_note">  
  8.         insert into note(sender, from_address, subject, content, send_time)  
  9.         values(#{sender}, #{fromAddress}, #{subject}, #{content}, #{sendTime})  
  10.         <selectKey keyProperty="id_mail" resultType="int">   
  11.                       select LAST_INSERT_ID()   
  12.                 </selectKey>   
  13.     </insert>  
  14.       
  15.     <select id="selectById" parameterType="int" resultMap="result" >  
  16.         select * from mail where id_mail = #{id}  
  17.     </select>  
  18.       
  19.     <select id="selectAllMails" resultMap="result">  
  20.         select * from note Note  
  21.     </select>  
  22.     <!--这里可以获得刚插入表格的id,为后面attachment的插入提供了mailId字段-->  
  23.     <select id="selectLastId" resultType="int">  
  24.          select LAST_INSERT_ID()   
  25.     </select>  
  26. </mapper>  

AttachmentMapper.xml

Html代码 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  3. <mapper namespace="test.data.AttachmentMapper">  
  4.     <cache />  
  5.       
  6.     <resultMap type="Attachment" id="result">  
  7.         <result property="id" column="id_accessory" />  
  8.         <result property="name" column="name" />  
  9.         <result property="relativePath" column="relative_path" />  
  10.         <result property="mailId" column="id_mail" />  
  11.     </resultMap>  
  12.       
  13.     <insert id="insert" parameterType="Attachment">  
  14.         insert into attachments(id_mail, name, relative_path) values(#{mailId}, #{name}, #{relativePath})  
  15.     </insert>  
  16.     <!--MailMapper中的ResultMap调用这个方法来进行关联-->  
  17.     <select id="selectByMailId" parameterType="int" resultMap="result">  
  18.         select  id, id_mail, name, relative_path  
  19.          from attachments where id_note = #{id}  
  20.     </select>  
  21. </mapper>  

DAO

AttachmentDAO

Java代码 

  1. public class AttachmentDAO {  
  2.     private SqlSessionFactory sqlSessionFactory;  
  3.       
  4.     public AttachmentDAO(){  
  5.         this.sqlSessionFactory = TestConnectionFactory.getSqlSessionFactory();  
  6.     }  
  7.       
  8.     public void insert(Attachment attachment){  
  9.              SqlSession session = sqlSessionFactory.openSession();  
  10.              AttachmentMapper attachmentMapper = session.getMapper(AttachmentMapper.class);   
  11.              try {  
  12.                 attachmentMapper.insert(attachment);  
  13.                 session.commit();  
  14.              } finally {  
  15.                 session.close();  
  16.              }  
  17.     }  
  18. }  

MailDAO

Java代码 

  1. public class MailDAO {  
  2.     private SqlSessionFactory sqlSessionFactory;  

Java代码 

  1. public MailDAO(){  
  2.     sqlSessionFactory = TestConnectionFactory.getSqlSessionFactory();  
  3. }   
  4.   
  5. public void insertMailOnly(Mail mail){  
  6.     SqlSession session = sqlSessionFactory.openSession();  
  7.     MailMapper mailMapper = session.getMapper(MailMapper.class);  
  8.     try {  
  9.         mailMapper.insert(mail);         
  10.         session.commit();  
  11.     } finally {  
  12.         session.close();  
  13.     }  
  14. }   
  15. //inset   
  16. public void insertMail(Mail mail){  
  17.     SqlSession session = sqlSessionFactory.openSession();  
  18.     MailMapper mailMapper = session.getMapper(MailMapper.class);  
  19.     AttachmentMapper attachmentMapper = session.getMapper(AttachmentMapper.class);  
  20.       
  21.     try{  
  22.     mailMapper.insert(mail);  
  23.     //这里必须commit,再执行Attachment的插入操作。否则会导致null pointer异常  
  24.     session.commit();  
  25.     //获得最近插入到note表的id  
  26.     int mailId = mailMapper.selectLastId();  
  27.     for(Attachment attach : mail.getAttachments()){  
  28.         attach.setMailId(String.valueOf(mailId));  
  29.         attachmentMapper.insert(attach);  
  30.     }  
  31.     session.commit();  
  32.     }finally{  
  33.         session.close();  
  34.     }  
  35. }  
  36.   
  37. public ArrayList<Mail> selectAllMails(){        
  38.     ArrayList<Mail> mailList = null;  
  39.     SqlSession session = sqlSessionFactory.openSession();  
  40.     MailMapper mailMapper = session.getMapper(MailMapper.class);  
  41.     try {             
  42.         mailList = mailMapper.selectAllMails();  
  43.         session.commit();  
  44.     } finally {  
  45.         session.close();  
  46.     }  
  47. urn mailList;  
  48. }   
  49.   
  50. public Mail selectMailById(int i){  
  51.     Mail mail = null;  
  52.     SqlSession session = sqlSessionFactory.openSession();  
  53.     MailMapper mailMapper = session.getMapper(MailMapper.class);  
  54.     try {             
  55.         mail = mailMapper.selectById(i);  
  56.         session.commit();  
  57.     } finally {  
  58.         session.close();  
  59.     }  
  60. urn mail;  
  61. }  
  62.   
  63. public int selectLastId(){  
  64.     int id = -1;  
  65.     SqlSession session = sqlSessionFactory.openSession();  
  66.     MailMapper mailMapper = session.getMapper(MailMapper.class);  
  67.     try {             
  68.         id = mailMapper.selectLastId();  
  69.         session.commit();  
  70.     } finally {  
  71.         session.close();  
  72.     }  
  73. urn id;  
  74. }  



 

分享到:  

RCP基础总结 | Ubuntu11.04地址栏调整为文字模式

  • 2012-04-10 17:46

猜你喜欢

转载自blog.csdn.net/verseboys/article/details/83502772