4.1 嵌套查询 vs 连接查询sql不同:连接查询:涉及多表连接, 当出现重复列时 需要对重复的列进行 列的重命名嵌套查询: 就是单表查询参与的mapper文件不同:连接查询: 在一个mapper文件中 配置即可嵌套查询: 需要 在 association或collection 中 通过 select 调用 另外的mapper执行效率:连接查询: 直接查询, 多表连接查嵌套查询: 是 每执行一个Product 就会查一个Category练习: emp 与 dept 的 一对一的嵌套查询4.1 1对多 关联查询及嵌套查询1对1 或 1对多 都是 ResultMap的配置1. 1对多 关联查询(连接查询) 基本是 90%与 一对一 关联查询类似product 与 category一个 product 属于 一个 category Product.java 增加 Category cate 属性 一个 category 可以包含多个 producta. 修改 Category.java 增加 一个 List<Product> proList 属性 b. 修改 查询方法CategoryMapper.java修改 findAll() 方法, 进行 查询 类别时 显示 该类别下的productc. 修改 CategoryMapper.xml为 resultMap 增加 collection 子标签collection 需要 配置 property 及 ofTypeproperty : 指 实体中的属性名, 区分大小写ofType: 需要写 property 对应的属性的类型, 如果是 List 多个,则写一个注意事项: 如果 sql 中 存在重复列, 记得 必须将列进行 重命名配置一对多 使用 collection ,必须配置 property 及 ofType
package entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;import java.util.List;/*** 实体层-- 与数据库的表 进行 映射**/@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
public class Category {private int cno;// 类别编号private String name;//类别名称 注意 数据库表 category中 使用的是 cname// 1对多private List<Product> proList;}
package entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;/**** 实体层 :* 无参构造* 全参构造* 每个属性 get/set* 重写toString()** 因为在pom.xmlzhong 增加了 lombok.jar** 因此 以上内容 采用 注解实现*/
@ToString //重写 同String()
@NoArgsConstructor //无参构造
@AllArgsConstructor //全参构造
@Data //get/set
public class Product {private int id;//idprivate String titleInfo;//titleprivate double oldPrice;//oldpriceprivate double p; //priceprivate int cateId;// cidprivate int rate;//rateprivate String url;private Category cate; //一对一,}
package mapper;import entity.Category;import java.util.List;public interface CategoryMapper {/*** 查询全部类别信息* @return*/List<Category> findAll();/*** 按照主键id进行查询* @param id* @return*/Category findById(int id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="mapper.CategoryMapper"><!-- 方法1: 当 属性与列名不一致时, 使用 对列进行 重命名--><!--<select id="findAll" resultType="Category">select id as cno,cname name from category</select>--><!--声明一个resultMap表 category 包含 id,cname类 Category 包含 cno,name--><!--方法2: 使用resultMap 来解决 属性与列名不一致的问题--><resultMap id="categoryMap" type="Category"><id property="cno" column="cno"/><result property="name" column="cname"/><!--配置 1对多 --><collection property="proList" ofType="Product"><id property="id" column="id"/><result property="titleInfo" column="title"/><result property="oldPrice" column="oldprice"/><result property="p" column="price"/><result property="cateId" column="cid"/><result property="rate" column="rate"/><result property="url" column="imgurl"/></collection></resultMap><select id="findAll" resultMap="categoryMap">select c.id cno,c.cname,p.*from category c,product pwhere c.id = p.cid</select><select id="findById" parameterType="int" resultMap="categoryMap">select * from category where id=#{id}</select></mapper>
@Testpublic void testFindAll(){CategoryMapper mapper = session.getMapper(CategoryMapper.class);List<Category> list = mapper.findAll();for(Category c:list){System.out.println(c.getName()+"包含以下 商品");for(Product p:c.getProList()){System.out.println(p.getTitleInfo()+"----"+p.getP());}}}