Mybatis注解的使用后(对象的一对一,一对多以及多对多)

首先建立maven项目
pom.xml依赖

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.44</version>
</dependency>

pom.xml导入后建立好directory(给予对应权限)和file
Mybatis注解的使用后(对象的一对一,一对多以及多对多)

建立接口并在resource内xml文件里进行配置

<mappers>
    <mapper class="com.dj.mapper.CatMapper"></mapper>
    <mapper class="com.dj.mapper.DogMapper"></mapper>
    <mapper class="com.dj.mapper.PdogmanMapper"></mapper>
    <mapper class="com.dj.mapper.HouseMapper"></mapper>
    <mapper class="com.dj.mapper.CardMapper"></mapper>
    <mapper class="com.dj.mapper.ManMapper"></mapper>
</mappers>

做完准备工作我们来测试一**解sql的一对一,一对多以及多对多
1一对一
一对一的表设计(左边表为’身份证’右边为’人’)
Mybatis注解的使用后(对象的一对一,一对多以及多对多)

由于要用注解设定一对一关系这里写了一个根据id的条件查询 那么在查到card的同时需要查到一个man并将对象加入于card的实体类 代码中@Result部分id部分也就是主键部分是不可省略的 而其他本表中的存在并不需要从其他地方拿值的属性在此处省略

 @Select("select * from card where cid=#{cid}")
@Results({
        @Result(property = "cid",column = "cid",id = true),
        @Result(property = "man",column = "cid",one = @One(select ="com.dj.mapper.ManMapper.seefornoe"))
})
public Card findone(int cid);

以下便是one=one(一对一)对应的方法

 @Select("select * from man where cid=#{cid}")
    public Man seefornoe(int id);

2一对多
一对多的表设计(左边为宠物狗右边为宠物狗主人)
Mybatis注解的使用后(对象的一对一,一对多以及多对多)

这边通过条件id查询拿到pdogman(宠物狗主人)

@Select("select * from Pdogman where pid=#{pid}")
    @Results({
            @Result(property = "pid",column = "pid",id = true),
            @Result(property = "dogs",column = "pid",many = @Many(select = "com.dj.mapper.DogMapper.findDogByid"))
    })
    public Pdogman seepamnbyid(int id);

同时也是通过另一个查询方法拿到狗主人养的多条狗

@Select("select * from dog where pid=#{pid}")
    public List<Dog> findDogByid(int id);

3多对多
多对多表设计(左边为’猫’中间为’猫和猫屋关系对应表’右边为’猫屋’)
Mybatis注解的使用后(对象的一对一,一对多以及多对多)

通过id条件查询到一只猫

@Select("select * from cat where cid=#{cid}")
    @Results({
            @Result(property = "cid",column = "cid",id = true),
            @Result(property = "houses",column = "cid",many = @Many(select = "com.dj.mapper.HouseMapper.findhouseByid"))
    })
    public Cat seeforid(int id);

以下则为通过第三关系表利用猫的id拿到猫可以居住的所有猫屋

 @Select("select * from house h,cat_house ch where h.hid=ch.hid and ch.cid=#{cid}")
    public List<House> findhouseByid();

测试

public class fucktest {
private SqlSession sqlSession;
            @Before
            public void before(){
                SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis.xml"));
                sqlSession=factory.openSession();
            }
            @Test
            public void test(){
          
            //查询 猫 拿 猫可居住的猫屋
	    		CatMapper catMapper=sqlSession.getMapper(CatMapper.class);
		        Cat cat=catMapper.seeforid(1);
		        List<House> houses=cat.getHouses();
		        for (House house : houses) {
	            System.out.println(house.getHname());
	        }
            //查询 狗主人 拿 狗
	            PdogmanMapper pdogmanMapper=sqlSession.getMapper(PdogmanMapper.class);
		        Pdogman pdogman=pdogmanMapper.seepamnbyid(1);
		        List<Dog> dogs=pdogman.getDogs();
		        for (Dog dog : dogs) {
		            System.out.println(dog.getDname());
		        }
              //查询 人 拿 身份证
                ManMapper manMapper=sqlSession.getMapper(ManMapper.class);
		        Man man=manMapper.seeotherone(1);
		        System.out.println(man.getCard().getCname());
            	}

Mybatis注解的使用后(对象的一对一,一对多以及多对多)