Mybatis中如何实现一对一,一对多的关联查询? |
您所在的位置:网站首页 › mybatis一对一查询 › Mybatis中如何实现一对一,一对多的关联查询? |
MyBatis实现一对一、一对多关联查询一般有两种方式: 方式一:sqlMapper配置文件 一对一:在resultMap标签中使用 association 标签 一对多:在resultMap 标签中使用collection 标签 方式二:注解 一对一:在@Results 注解中的@Result注解中使用@One注解 一对多:在@Results 注解中的@Result 注解中使用@Many注解 接下来,我们一起来看看这两种方式分别是怎么用代码实现的? 这里需要用到学生student和班级class两张表,如下图所示: 一、一对一查询(sqlMapper配置文件) 1. 需求 一个学生相对应一个专属班级,所以学生Student对班级Banji是一对一的关系; 查询需求:查询一个学生,与此同时查询出该学生所属的班级信息(用sqlMapper的方式) 2. 创建Student和Banji实体类Student.java public class Student { private int sid; private String sname; private Date birthday; private String ssex; private int classid; // 外部属性 private Banji bj; // 省略无参、有参、get、set、toString方法 }Banji.java public class Banji { private int classid; private String classname; // 省略无参、有参、get、set、toString方法 } 3. 创建StudentMapper接口 public interface StudentMapper { //定义方法 public List findAllStudent(); } 4. 配置 StudentMapper.xmlPS:查询的返回值类型使用的resultMap,和上面resultMap标签中的id名必须保持一致 select * from student inner join class on student.classid=class.classid 5. 测试 Test public class Test01 { public static void main(String[] args) { SqlSession sqlSession = DaoUtil.getSqlSession(); StudentMapper sm = sqlSession.getMapper(StudentMapper.class); //一对一查询 List slist = sm.findAllStudent(); for (Student s:slist) { System.out.println(s); } //释放资源 DaoUtil.closeSource(sqlSession); }输出结果为: 二、一对一查询(注解) 1. 需求 一个学生相对应一个专属班级,所以学生Student对班级Banji是一对一的关系; 查询需求:查询一个学生,与此同时查询出该学生所属的班级信息(用注解的方式) 2. 创建Student和Banji实体类Student.java public class Student { private int sid; private String sname; private Date birthday; private String ssex; private int classid; // 外部属性 private Banji bj; // 省略无参、有参、get、set、toString方法 }Banji.java public class Banji { private int classid; private String classname; // 省略无参、有参、get、set、toString方法 } 3. 创建StudentMapper接口 public interface StudentMapper { //学生对班级一对一,做映射 @Results({ @Result(column = "classid",property = "classid"), @Result(column = "classid",property = "bj", one=@One(select ="com.ape.mapper.BanjiMapper.findBanjiByClassid" )) }) @Select("select * from student") public List findAllStudent(); } 4. 创建BanjiMapper接口 public interface BanjiMapper { //学生对班级,找班级对象 @Select("select * from class where classid=#{v}") public Banji findBanjiByClassid(int classid); } 5. 测试 Test public class Test01 { public static void main(String[] args) { SqlSession sqlSession = DaoUtil.getSqlSession(); StudentMapper sm = sqlSession.getMapper(StudentMapper.class); List slist = sm.findAllStudent(); for(Student s:slist) { System.out.println(s); } DaoUtil.closeSource(sqlSession); } }输出结果为: 三、一对多查询(sqlMapper配置文件) 1. 需求 一个班级对应多个学生,所以班级Banji对学生Student是一对多的关系; 查询需求:查询一个班级,与此同时查询出该班级所有的学生信息(用sqlMapper的方式) 2. 创建Banji和Student实体类Banji.java public class Banji { private int classid; private String classname; //外部属性 private List slist; // 省略无参、有参、get、set、toString方法 }Student.java public class Student { private int sid; private String sname; private Date birthday; private String ssex; private int classid; // 省略无参、有参、get、set、toString方法 } 3. 创建BanjiMapper接口 public interface BanjiMapper { //班级对学生,一对多 public List findAllBanji(); } 4. 配置BanjiMapper.xml select * from class left join student on class.classid=student.classid order by class.classid 5. 测试 Test public class Test01 { public static void main(String[] args) { SqlSession sqlSession = DaoUtil.getSqlSession(); BanjiMapper bm = sqlSession.getMapper(BanjiMapper.class); List blist = bm.findAllBanji(); for (Banji b:blist) { System.out.println("班级编号"+b.getClassid()+","+"班级名称"+b.getClassname()); for(Student s:b.getSlist()) { System.out.println(s); } System.out.println("===================================="); } //释放资源 DaoUtil.closeSource(sqlSession); } }输出结果为: 四、一对多查询(注解) 1. 需求 一个班级对应多个学生,所以班级Banji对学生Student是一对多的关系; 查询需求:查询一个班级,与此同时查询出该班级所有的学生信息(用注解的方式) 2. 创建Banji和Student实体类Banji.java public class Banji { private int classid; private String classname; //外部属性 private List slist; // 省略无参、有参、get、set、toString方法 }Student.java public class Student { private int sid; private String sname; private Date birthday; private String ssex; private int classid; // 省略无参、有参、get、set、toString方法 } 3. 创建BanjiMapper接口 public interface BanjiMapper { //班级对学生一对多,做映射 @Results({ @Result(column = "classid",property = "classid"), @Result(column = "classid",property = "slist", many=@Many(select="com.ape.mapper.StudentMapper.findStudentByClassid")) }) @Select("select * from class") public List findAllBanji(); } 4. 创建StudentMapper接口 public interface StudentMapper { //班级对学生一对多,找学生对象 @Select("select * from student where classid=#{v}") public Student findStudentByClassid(int classid); } 5. 测试 Test public class Test01 { public static void main(String[] args) { SqlSession sqlSession = DaoUtil.getSqlSession(); BanjiMapper bm = sqlSession.getMapper(BanjiMapper.class); List blist = bm.findAllBanji(); for (Banji b:blist) { System.out.println("班级编号"+b.getClassid()+","+"班级名称"+b.getClassname()); for(Student s:b.getSlist()) { System.out.println(s); } System.out.println("===================================="); } //释放资源 DaoUtil.closeSource(sqlSession); } }输出结果为: 其实,日常这样的例子也不少: 一对一: 一个人对应一张身份证 一张身份证对应一个人 一个课程对应一个老师 一个员工对应一个部门 …… 一对多: 一个用户可以有多个订单 一个用户可以有账户 一个学生可以学多个课程 一个球队有多个球员 …… 以上就是Mybatis的多表关联查询(一对一、一对多)的全部内容。 看完如果对你有帮助,点赞支持一下呀!
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |