更多精彩文章歡迎關注公眾號“Java之康庄大道”
場景:查詢部門的同時,要求查詢此部門下的所有用戶。
部門(Department)
private Integer id; private String departmentName; private List<Blogger> bloggers;//關聯List集合。部門下所有bloggers
用戶(Blogger)
private Integer id; private String username; private String password; private String profile; private String nickname; private String sign; private String imagename; private Department dep;
方法一:結果集下collection關聯
接口DepartMapper.java
package com.yunqing.mybatis.dao; import com.yunqing.mybatis.bean.Department; public interface DepartmentMapper { Department getDepByIdStep2(Integer id); Department getDepAndBloggers(Integer id); Department getDepStep(Integer id); }
DepartmentMapper.xml
<resultMap id="map" type="com.yunqing.mybatis.bean.Department"> <id column="did" property="id"/> <result column="department" property="departmentName"/> <collection property="bloggers" ofType="com.yunqing.mybatis.bean.Blogger"> <id column="bid" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> </collection> </resultMap> <select id="getDepAndBloggers" resultMap="map"> SELECT d.id did,d.department,b.id bid,b.username,b.`password` FROM t_dep d LEFT JOIN t_blogger b ON d.id=b.depId WHERE d.id=#{id} </select>
測試類
public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "conf/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); return sqlSessionFactory; } @Test public void getDepAndBlogger() throws IOException { SqlSession sqlSession = getSqlSessionFactory().openSession(); DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class); Department depAndBloggers = mapper.getDepAndBloggers(1); System.out.println(depAndBloggers); System.out.println(depAndBloggers.getBloggers()); }
方法二:分布查詢
BloggerMapper.java
//根據部門id查詢此部門下的人
package com.yunqing.mybatis.dao; import com.yunqing.mybatis.bean.Blogger; import com.yunqing.mybatis.bean.User; import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Map; public interface BloggerMapper { @Select("select * from t_blogger") List<Blogger> getAllBlogger(); @MapKey("username") Map<String,Blogger> getAllBloggerReturnMap(); Blogger getBloggerAndDepById(Integer id); Blogger getBloggerAndDepByIdAss(Integer id); Blogger getBloggerByIdStep1(Integer id); List<Blogger> getBloggersByDepId(Integer depId); }
BloggerMapper.xml
<resultMap id="mapp" type="com.yunqing.mybatis.bean.Blogger"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> </resultMap> <select id="getBloggersByDepId" resultMap="mapp"> SELECT id,username,password FROM t_blogger WHERE depId=#{depId} </select>
再根據部門id查詢部門
DepartmentMapper.java
package com.yunqing.mybatis.dao; import com.yunqing.mybatis.bean.Department; public interface DepartmentMapper { Department getDepByIdStep2(Integer id); Department getDepAndBloggers(Integer id); Department getDepStep(Integer id); }
DepartmentMapper.xml
<resultMap id="maop" type="com.yunqing.mybatis.bean.Department"> <id column="did" property="id"/> <result column="department" property="departmentName"/> <collection property="bloggers" select="com.yunqing.mybatis.dao.BloggerMapper.getBloggersByDepId" column="did"> </collection> </resultMap> <select id="getDepStep" resultMap="maop"> SELECT id did,department FROM t_dep WHERE id=#{id} </select>
測試類
@Test public void getDepStep() throws IOException { SqlSession sqlSession = getSqlSessionFactory().openSession(); DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class); Department depStep = mapper.getDepStep(1); System.out.println(depStep); System.out.println(depStep.getBloggers()); }
結果打印:
分布查詢時如果需要傳遞多列值,可以
<resultMap id="maop" type="com.yunqing.mybatis.bean.Department"> <id column="did" property="id"/> <result column="department" property="departmentName"/> <collection property="bloggers" select="com.yunqing.mybatis.dao.BloggerMapper.getBloggersByDepId" column="{depId=did}" fetchType="eager"> </collection> </resultMap> <select id="getDepStep" resultMap="maop"> SELECT id did,department FROM t_dep WHERE id=#{id} </select>
傳遞多列值,column="{column1=key1,column2=key2}"
cloumn1的來源是,select的里的方法的傳遞的參數。
List<Blogger> getBloggersByDepId(Integer depId);
雖然在設置中已經開啟了延遲加載,但是在此處的fetchType也可以控制是否延遲加載,lazy延遲加載,eager立即加載。