以下测试类都用到的工具类MyBatisUtil.java

public class MyBatisUtil {private static SqlSessionFactory sessionFactory;public static SqlSession getSqlSession() {SqlSession sqlSession = null;if(sqlSession==null) {           try {//加载主配置文件InputStream inputStream = Resources.getResourceAsStream("mybatisconfig.xml");//创建SqlSession工厂sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取SqlSessionsqlSession = sessionFactory.openSession();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}     }return sqlSession;}
}

一、一对多查询

实体类:Student.java

public class Student {private Integer sid;//学生idprivate String sname;//学生姓名private Integer sage;//年龄private Character ssex;//性别//一个学生对应一个班级private Clbum clbum;//班级对象

实体类:Clbum.java班级类

public class Clbum {private Integer cid;//班级idprivate String cname;//班级名称//一个班级有多个学生private List<Student> students;//存放该班级的所有学生

DAO接口类:ClassDAO.java

public interface ClassDAO {Clbum selectClassByCid(int cid);
}

xml映射文件:ClassDAO.xml

<mapper namespace="com.woniu.dao.ClassDAO"><!-- 一步查询 --><!-- <resultMap type="Clbum" id="ClassMapper"><id column="cid" property="cid"/><result column="cname" property="cname" />collection:一对多关系property:需要赋值的属性ofType:属性的数据类型<collection property="students" ofType="Student"><id column="sid" property="sid"/><result column="sname" property="sname"/><result column="sage" property="sage" /><result column="ssex"  property="ssex"/></collection></resultMap><select id="selectClassByCid" resultMap="ClassMapper">SELECT * FROM class c,student s WHERE c.cid=s.cid AND c.cid=#{cid}</select><select id="selectClbum" resultMap="ClassMapper">SELECT * FROM class c,student s WHERE c.cid=s.cid</select>  --><!-- 分步查询 --><select id="selectClassByCid" resultMap="ClassMapper">SELECT * FROM class WHERE cid=#{cid}</select><resultMap type="Clbum" id="ClassMapper"><id column="cid" property="cid"/><result column="cname" property="cname" /><collection property="students" ofType="Student" select="selectStudentsBycid" column="cid" /></resultMap><!-- select:指定第二次查询 column:将表某列的值,传递给下一次查询 --><select id="selectStudentsBycid" resultType="Student">select * from student where cid=#{cid}</select><select id="selectClbum" resultMap="ClassMapper">select * from class</select>
</mapper>

测试类

public class ClassDAOImpTest {SqlSession sqlSession;ClassDAO ClassDaoImp;    @Beforepublic void setUp() {sqlSession=MyBatisUtil.getSqlSession();//getMapper:底层就是使用动态代理,生成接口的实现类ClassDaoImp = sqlSession.getMapper(ClassDAO.class);}    @Afterpublic void tearDown() {if(sqlSession!=null) {sqlSession.close();}}@Testpublic void selectClassByCid() {System.out.println(ClassDaoImp.selectClassByCid(1));}
}

二、多对一查询

实体类:Student.java

public class Student {private Integer sid;//学生idprivate String sname;//学生姓名private Integer sage;//年龄private Character ssex;//性别//一个学生对应一个班级private Clbum clbum;//班级对象

实体类:Clbum.java班级类

public class Clbum {private Integer cid;//班级idprivate String cname;//班级名称//一个班级有多个学生private List<Student> students;//存放该班级的所有学生

DAO接口类:StudentDAO.java

public interface StudentDao {Student selectStuBySid(int sid);List<Student> selectAllStudent();
}

xml映射文件:StudentDAO.xml

<mapper namespace="com.woniu.dao.StudentDao"><!-- 一步查询 --><!-- <resultMap type="Student" id="stuMapper"><id column="sid" property="sid"/><result column="sname" property="sname"/><result column="sage" property="sage" /><result column="ssex" property="ssex"/><association property="clbum" javaType="Clbum"><id column="cid" property="cid" /><result column="cname" property="cname" /></association></resultMap><select id="selectStuBySid" resultMap="stuMapper">SELECT * FROM class c,student s WHERE c.cid=s.cid AND s.sid=#{sid} </select> --><!-- 分布查询 --><select id="selectStuBySid" resultMap="stuMapper">SELECT * FROM student  WHERE sid=#{sid}</select><resultMap type="Student" id="stuMapper"><id column="sid" property="sid" /><result column="sname" property="sname"/><result column="sage" property="sage" /><result column="ssex" property="ssex"/><association property="clbum" javaType="Clbum" select="selectClbum" column="cid" /></resultMap><select id="selectClbum" resultType="Clbum">SELECT * FROM class WHERE cid=#{cid}</select>
</mapper>

测试类:

public class StudentDAOImpTest {SqlSession sqlSession;StudentDao StuDaoImp;@Beforepublic void setUp() {sqlSession=MyBatisUtil.getSqlSession();//getMapper:底层就是使用动态代理,生成接口的实现类StuDaoImp = sqlSession.getMapper(StudentDao.class);}@Afterpublic void tearDown() {if(sqlSession!=null) {sqlSession.close();}}@Testpublic void selectStuBySid() {System.out.println(StuDaoImp.selectStuBySid(1));}@Testpublic void selectClbum() {System.out.println(StuDaoImp.selectAllStudent());}
}

三、多对多查询

实体类:成绩Score.java

public class Score {private Integer scno;//成绩编号//域属性:一条成绩属于一个学生,属于一门课程//一个学生有多门课程,一门课程有多个学生private Student student;//学生private Course course;//课程private int score;//成绩

实体类:学生Student.java

public class Student {private String sno;//学生idprivate String sname;//学生姓名private Integer sage;//年龄private Character ssex;//性别//一个学生有多门课程private List<Course> course;

实体类:课程Course.java

public class Course {private String cno;//课程编号private String cname;//课程名称//一门课程有多个学生private List<Student> students;//所有学生

1、根据成绩编号查询学生信息和课程信息

Score接口类:ScoreDAO.java

public interface ScoreDAO {Score selectScoreByScid(int scno);
}

xml映射文件:

<mapper namespace="com.woniu.dao.ScoreDAO"><select id="selectScoreByScid" resultMap="scoreMapper">select * from sc where scno=#{scno}</select><resultMap type="Score" id="scoreMapper"><id column="scno" property="scno"/><result column="score" property="score" /><association property="student" javaType="Student" select="selectStu" column="sno" /><association property="course" javaType="Course" select="selectCou" column="cno" /></resultMap><select id="selectStu" resultType="Student">select * from student where sno=#{sno}</select><select id="selectCou" resultType="Course">select * from course where cno=#{cno}</select>
</mapper>

测试类:

public class ScoreDAOImpTest {SqlSession sqlSession;ScoreDAO scoreDaoImp;@Beforepublic void setUp() {sqlSession=MyBatisUtil.getSqlSession();//getMapper:底层就是使用动态代理,生成接口的实现类scoreDaoImp = sqlSession.getMapper(ScoreDAO.class);}@Afterpublic void tearDown() {if(sqlSession!=null) {sqlSession.close();}}@Testpublic void selectScoreByScid() {System.out.println(scoreDaoImp.selectScoreByScid(1));}@Testpublic void selectClbum() {System.out.println();}
}

2、根据学生编号查询出学的所有课程

StudentDAO.java接口类:

public interface StudentDAO {Student selectAllCourseBySno(String sno);
}

映射文件xml:

<mapper namespace="com.woniu.dao.StudentDAO"><select id="selectAllCourseBySno" resultMap="stuMapper">select * from student where sno=#{sno} </select><resultMap type="Student" id="stuMapper"><id column="sno" property="sno" /><result column="sname" property="sname" /><result column="sage" property="sage"/><result column="ssex" property="ssex"/><collection property="course" ofType="Course" select="selectCourse" column="sno"></collection></resultMap><select id="selectCourse" resultType="Course">select * from sc s,course c where s.cno=c.cno and s.sno=#{sno}</select>
</mapper>

测试类:

public class StudentDAOImpTest {SqlSession sqlSession;StudentDAO studentDaoImp;@Beforepublic void setUp() {sqlSession=MyBatisUtil.getSqlSession();//getMapper:底层就是使用动态代理,生成接口的实现类studentDaoImp = sqlSession.getMapper(StudentDAO.class);}@Afterpublic void tearDown() {if(sqlSession!=null) {sqlSession.close();}}@Testpublic void selectAllCourseBySno() {System.out.println(studentDaoImp.selectAllCourseBySno("s001"));}@Testpublic void selectClbum() {System.out.println();}
}

四、订单查询

传统项目:

​ 后台管理系统

​ 数据库设计:满足三阶范式

互联网项目

​ 电商,点餐

​ 数据库设计:不满足三阶范式,数据容易大,重复数据库,DAO很多单表操作

查询五张表:goods(商品表)、goodstype(商品类型表)、orderform(订单表)、orderitem(订单项表)、user(用户表)

实体类

商品:

public class Goods {private Integer id;//商品编号private String name;//名称private Double price;//价格private String image;//图片private String description;//描述private Integer stock;//库存//一个商品对应一个类型private GoodsType goodstype;

商品类型:

public class GoodsType {private Integer id;//商品类型编号private String name;//名称private String image;//图片private String description;//描述

订单:

public class OrderForm {private Integer id;private String orderNumber;private String payNumber;private Date createTime;private Integer state;//一个订单属于一个用户,有一个邮寄信息private User user;//一个订单有一个邮寄信息private Postal postal;//一个订单有多个订单项private List<OrderItem> orderItem;

订单项:

public class OrderItem {private Integer id;private Goods goods;//商品//订单private OrderForm orderForm;private Integer number;private Double totalprices;

用户:

public class User {private Integer id;private String account;private String password;

订单DAO接口类

public interface OrderDAO {List<OrderForm> selectOrderByUid(int id);
}

订单映射文件xml

<mapper namespace="com.woniu.dao.OrderDAO"><select id="selectOrderByUid" resultMap="orderMapper">select * from orderform where userid=#{id}</select><resultMap type="OrderForm" id="orderMapper"><id column="id" property="id" /><result column="orderNumber" property="orderNumber" /><result column="payNumber" property="payNumber" /><result column="createTime" property="createTime" /><result column="state" property="state" /><association property="user" javaType="User" select="selectUser" column="userid" /><collection property="orderItem" ofType="OrderItem" select="selectOrderItem" column="id"/></resultMap><!-- 查询用户信息 --><select id="selectUser" resultType="User" >select * from user where id=#{userid}</select><!-- 查询订单项 --><select id="selectOrderItem" resultMap="orderItemMapper">select * from orderitem where orderid=#{id}</select><resultMap type="orderItem" id="orderItemMapper"><id column="id" property="id" /><result column="number" property="number"/><result column="totalprices" property="totalprices" /><collection property="goods" ofType="Goods" select="selectGoods" column="goodsid"/></resultMap><select id="selectGoods" resultMap="goodsMapper">select * from goods where id=#{goodsid}</select><resultMap type="Goods" id="goodsMapper"><id column="id" property="id" /><result column="name" property="name"/><result column="price" property="price"/><result column="image" property="image"/><result column="description" property="description"/><result column="stock" property="stock"/><association property="goodstype" javaType="GoodsType" select="selectGoodsType" column="id"/></resultMap><select id="selectGoodsType" resultType="GoodsType">select * from goodstype where id=#{id}</select>
</mapper>

测试类

public class OrderDAOTest {SqlSession sqlSession;OrderDAO orderDaoImp;@Beforepublic void setUp() {sqlSession=MyBatisUtil.getSqlSession();//getMapper:底层就是使用动态代理,生成接口的实现类orderDaoImp = sqlSession.getMapper(OrderDAO.class);}@Afterpublic void tearDown() {if(sqlSession!=null) {sqlSession.close();}}@Testpublic void selectOrderByUid() {System.out.println(orderDaoImp.selectOrderByUid(1));}}

MyBatis--对象的联合查询相关推荐

  1. SpringBoot+MyBatis多表联合查询

    SpringBoot+MyBatis多表联合查询 写在前面 联合查询在实际工作中用的并不多,因为很多表的数据比较大,或者说未来比较大的表,都要谨慎使用联合查询 数据准备 建表语句 create tab ...

  2. MyBatis 多表联合查询及优化

    关于优化 对于优化嘛,我这里简单的提几点,大家可以考虑一下.首先,就是对表的设计,在设计表初期,不仅仅要考虑到数据库的规范性,还好考虑到所谓的业务,以及对性能的影响,比如,如果从规范性角度考虑的话,可 ...

  3. mybatis主从表关联查询,返回对象带有集合属性

    昨天有同事让我帮着看一个问题,mybatis主从表联合查询,返回的对象封装集合属性.我先将出现的问题记录一下,然后再讲处理方法也简单说明一下: VersionResult为接收返回数据对象,get\s ...

  4. Mybatis实现联合查询(六)

    1. 疑问 在之前的章节中我们阐述了如何用Mybatis实现检查的查询,而我们实际的需求中,绝大部分查询都不只是针对单张数据表的简单查询,所以我们接下来要看一下Mybatis如何实现联合查询. 2. ...

  5. MyBatis框架 多表联合查询实现

    三种方式: ①业务装配 对两个表编写单表查询语句,在业务层(Serivce)把查询的两个结果进行关联 ②使用Auto Mapping特性 在实现两表联合查询时通过别名完成映射,使用Maybatis的& ...

  6. 一个mybatis动态 SQL查询的完整小案例。包含多表联合查询。

    多表联合查询 一个根据机场查询航线的例子.有两张表,机场表包含机场信息:机场id.机场名字.机场城市. 航班包含航线信息:航班id.飞机编号.飞行时间.票价.起飞机场id.降落机场id. 需要查询的结 ...

  7. Mybatis联合查询

    为什么80%的码农都做不了架构师?>>>    案例 一个博客系统中,用户可以任意发表博文(Post),用户还可以对博文进行评论(Comment).于是在这个系统中,存在以下的关系: ...

  8. springboot+mybatis+mysql 多表联合查询

    ###springboot+mybatis+mysql 多表查询 这里有两张表 用户表和用户信息表user.info 两个实体类展示他们一对一的关系 通过springboot注解的方式实现多表联合查询 ...

  9. mybatis学习五-mybatis的多表联合查询

    1. 一对一的关系 首先先看数据库 tb_user tb_orders 执行这条sql: 也就是查询所有的订单, 并每一个订单都联系上用户数据, 并再一次附上订单的id 也就是说, 从后面看, 就是每 ...

  10. Mybatis系列(三):Mybatis实现关联表查询

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 ...

最新文章

  1. 计算机辅助制造实验感想6,中南大学计算机辅助制造实验报告1
  2. sqoop同步hdfs与mysql端口_使用Sqoop将数据在HDFS与MySQL互导
  3. 图论--Dijkstra算法总结
  4. CF1556E-Equilibrium【栈,树状数组】
  5. mysql全文索引thinkphp_ThinkPHP5 使用迅搜 (XunSearch) 实现全文检索实例指导
  6. opencv3.1.0 编译H3516A 成功后调用时出现的问题
  7. CenOS 6.5 RPM 安装 elasticsearch 6.3.1
  8. python 中self
  9. 《游戏设计师修炼之道:数据驱动的游戏设计》一3.2 漏洞管理计划和技术开发...
  10. vt功能对计算机有影响吗,win7怎么开启vt模拟器?电脑开vt有什么坏处?
  11. python 标准库库
  12. 同步四进制加法计数器(JK)
  13. 通过安卓逆向来学习安卓开发
  14. Android 《手机卫士》随听笔记
  15. 前后端分离解决CSRF问题
  16. access阿里云 mysql_access数据库字段最大
  17. 破解android 九宫格锁
  18. 7个半月股价涨了40%多,DXC做对了什么?
  19. 实现婚恋交友app源码,开发一个数字气泡的效果
  20. MySQL【四】---案例实战{拆分多表、外键创建等}

热门文章

  1. 华为云:修炼防控内力,竖起游戏文娱行业安全之盾
  2. 别让“鼠标手”伸向你
  3. 游戏界面设计艺术性的思考
  4. 分享深入学习MongoDB pdf版
  5. 【蓝桥杯】【Python】次数差
  6. 网页设计——美食博客
  7. 老男孩第58期马帅琦
  8. 新装修的房子多久能入住
  9. 纸箱外观设计 包装盒版面设计 纸箱尺寸设计 纸箱纸盒包装设计 纸箱设计图
  10. 锐龙r76800h和酷睿i512500h核显对比 r7 6800h和i5 12500h哪个好