MyBatis 3中实现一对多的插入和查询
来源:互联网 发布:php iterator接口 编辑:程序博客网 时间:2024/06/02 16:35
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_path from 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表的id int 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; }}
- MyBatis 3中实现一对多的插入和查询
- mybatis中实现一对一,一对多查询
- Mybatis关联查询一对一和一对多的实现
- Mybatis关联查询一对一和一对多的实现
- Mybatis关联查询一对一和一对多的实现
- Mybatis关联查询一对一和一对多的实现
- Mybatis关联查询一对一和一对多的实现
- Mybatis关联查询一对一和一对多的实现
- mybatis 实现关联查询的一对多和多对多查询
- MyBatis实现一对多和多对一的关联关系的查询
- MyBatis(三)---实现一对一和一对多的关联表查询
- SSM搭建-Mybatis关联查询一对一和一对多的实现(19)
- 22、SSM框架-Mybatis关联查询一对一和一对多的实现(4)
- mybatis实现两张表的连接查询(一对多)
- mybatis中如何查询一对多的关联列表数据
- ssm框架学习---mybatis中一对多关系的查询
- mybatis的一对多和多对多查询
- mybatis的一对多和多对多查询
- infoQ 百度技术沙龙第25期回顾:海量数据处理技术解析
- NSPredicate的用法
- case用法
- Android地图开发:自定义地图弹出框内容
- linux的文件系统及Inode详解
- MyBatis 3中实现一对多的插入和查询
- PHP+memcache安装使用例子
- MYSQL笔记120410
- .net发展历程~
- 下面一段代码竟然引起反复打开的时候IE进程挂起
- sizeof用法汇总(经典)
- Objective-C简介
- 微软笔试和面试题(技术类)
- frameset 实现无刷新聊天室技术实现方法