mybatis用注解实现 一对一,一对多,多对多哟

先给大家看一下我的项目 整个的一个 构造:

mybatis用注解实现 一对一,一对多,多对多哟


好,然后 开始我的mybatis关系,用的是mysql


1.首先,先导入依赖:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.5</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.43</version>
</dependency>

2.然后,连接数据库,写mybatis-config.xml配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--  懒加载 -->
<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
    <setting name="cacheEnabled" value="true"/>
</settings>

<!--设置别名-->
    <typeAliases>
        <!--<typeAlias type="com.desert.Dto.MyPerson" alias="a"></typeAlias>-->
        <package name="com.desert"></package>
    </typeAliases>


    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- Q  加载dao方法 -->

        <!--一对一-->
            <mapper class="com.desert.dao.ICardDao"/>
            <mapper class="com.desert.dao.IPersonDao"/>

        <!--一对多-->
        <mapper class="com.desert.dao.ICityDao"></mapper>
        <mapper class="com.desert.dao.IProvincesDao"></mapper>

        <!--多对多-->
        <mapper class="com.desert.dao.IUserDao"></mapper>
        <mapper class="com.desert.dao.IRolesDao"></mapper>

    </mappers>
</configuration>

一:说一下 我的一对一关系:

一对一我那Person和Card拿来做实列:

Person表:

private String pname;
private int pid;
private int page;

private Card card;

-------------------------------------------------------------

Person数据库:

mybatis用注解实现 一对一,一对多,多对多哟


然后 再是我的Card表:(也可以定义一个Person属性,这里我就不定义了)

private int uid;
private String cnumber;

------------------------------------
数据库:


然后,再是我的dao方法:
IPersonDao:

public interface IPersonDao {

    @Select("select * from person where pid = #{pid}")
    @Results({
            @Result(id=true,column="pid",property="pid"),
            @Result(column="pname",property="pname"),
            @Result(column="page",property="page"),
            @Result(column="pid",property="card",one=@One(select="com.desert.dao.ICardDao.getCard",fetchType= FetchType.EAGER))
    })
   public Person getPerson(int pid);

}

ICardDao:

public interface ICardDao {

    @Select("select * from card where uid = #{uid} ")
    public Card getCard(int uid);

}

这样,一个简单的一对一关系就好了。
然后,再是去测试

@Test   //一对一
public void Testonttoone() throws IOException {

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config"));
    SqlSession sqlSession = sqlSessionFactory.openSession();

    IPersonDao iPersonDao=sqlSession.getMapper(IPersonDao.class);
    // 根据id查询Person对象,同时需要获得关联的Card对象
   Person person=iPersonDao.getPerson(1);
    System.out.println(person);
    System.out.println(person.getCard().getCnumber());
    sqlSession.close();

}

二:再说一下 一对多的关系:

这里 我拿省份(Provinces)和城市(Citys)拿来做实列:

Provinces表:

private int pid;
private String pname;

private Set<Citys> citysSet;
--------------------------------
数据库:
mybatis用注解实现 一对一,一对多,多对多哟

Citys表:

private int cid;

private String cname;

private int pid;
--------------------------------------------
数据库:


然后,再是我的dao方法:

IProvincesDao:

public interface IProvincesDao {


    @Select("select * from provinces where pid = #{pid}")
    @Results({
            @Result(id=true,column="pid",property="pid"),
            @Result(column="pname",property="pname"),
            @Result(column="pid",property="citysSet",
                    many=@Many(
                            select="com.desert.dao.ICityDao.getCitybypid",
                            fetchType= FetchType.LAZY
                    )
            )
    })
    public Provinces getProvincesByid(int pid);

}

ICitysDao:

public interface ICityDao {

    @Select("select * from city where pid=#{pid}")
    public List<Citys> getCitybypid(int pid);

}

之后,再mybatis-config加载之后,就可以测试了:

测试类:

@Test   //一对多
public void Testonttomany() throws IOException {

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config"));
    SqlSession sqlSession = sqlSessionFactory.openSession();

    IProvincesDao iProvincesDao=sqlSession.getMapper(IProvincesDao.class);

    Provinces provinces=iProvincesDao.getProvincesByid(1);
    System.out.println(provinces.getPname());

    for (Citys citys : provinces.getCitysSet()) {
        System.out.println(citys.getCname());
    }

    sqlSession.close();

}

三:再是我的多对多,这里,拿用户(Users)和角色(Roles)来做实列:

Users:

private int uid;
private String uname;

private Set<Roles> roles;
------------------------------------------------
数据库:



Roles:

private int rid;
private String rname;

private Set<Users> users;
-----------------------------------------

数据库:

mybatis用注解实现 一对一,一对多,多对多哟


然后 再是我的IUsersDao:

public interface IUserDao {

    //根据id得到用户:
    @Select("select * from users where uid = #{uid}")
    @Results({
            @Result(id=true,column="uid",property="uid"),
            @Result(column="uname",property="uname"),
            @Result(column="uid",property="roles",
                    many=@Many(
                            select="com.desert.dao.IRolesDao.getAllRolesByuid",
                            fetchType= FetchType.LAZY
                    )
            )
    })
    public Users getUsersById(int uid);


}

我的IRolesDao:

public interface IRolesDao {

    //根据用户id得到所有的角色:

    @Select("select * from roles where rid in(select rid from u_r where uid=1)")
    public List<Roles> getAllRolesByuid(int uid);


}

然后,在mybatis-config加载好配置文件 就可以直接去测试了:

@Test   //多对多
public void Testmanytomany() throws IOException {

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config"));
    SqlSession sqlSession = sqlSessionFactory.openSession();

    IUserDao iUserDao=sqlSession.getMapper(IUserDao.class);
    Users users=iUserDao.getUsersById(1);
    System.out.println(users.getUname());

    for (Roles roles : users.getRoles()) {
        System.out.println(roles.getRname());
    }

    sqlSession.close();

}

其实个人觉得 mybatis中注解比xml配置文件 好用些