Mybatis框架中的注解应用之关系映射

使用开发工具:mysql +IDEA

MyBatis实例:

目录结构

一:先导依赖,导入mysql和mybatis的jar包

<!-- Mysql依赖-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.43</version>
</dependency>
<!--MyBatis依赖-->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId
  <version>3.4.5</version>
</dependency>


二:创建并配置MyBatis的配置文件

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>

    <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="123456"/>
            </dataSource>
        </environment>
    </environments>
<mappers>
    <!-- xml映射 -->
    <!--<mapper resource="com/entity/Person.xml"/>-->

    <!-- PersonDao注解 -->
    <mapper class="com.dao.PersonDao"/>

    <!-- 用户配置 -->
    <mapper resource="com/entity/usera.xml"/>

    <!-- 角色配置 -->
    <mapper resource="com/entity/roles.xml"/>

</mappers>

</configuration>
三:写实体类

1.一对一映射
Person表和Card表一对一(实体类)
Person实体类
package com.entity;
public class Person{
    private int pid;  //编号
    private String pname; //名字
    private int page; //年龄
    private Card card;

    public Card getCard() {
        return card;
    }
    public void setCard(Card card) {
        this.card = card;
    }
    public Person() {
    }
    public Person(int pid, String pname, int page) {
        this.pid = pid;
        this.pname = pname;
        this.page = page;
    }
    //get和set方法
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public int getPage() {
        return page;
    }
    public void setPage(int page) {
        this.page = page;
    }
    @Override
    public String toString() {
        return "Person{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", page=" + page +
                '}';
    }
}
Card实体类
package com.entity;
public class Card {
    private int cid; //编号
    private String cnum; //身份证号码

    public Card() {

    }
    public Card(int cid, String cnum) {
        this.cid = cid;
        this.cnum = cnum;
    }
    //get和set方法
    public int getCid() {
        return cid;
    }
    public void setCid(int cid) {
        this.cid = cid;
    }
    public String getCnum() {
        return cnum;
    }
    public void setCnum(String cnum) {
        this.cnum = cnum;
    }
    @Override
    public String toString() {
        return "Card{" +
                "cid=" + cid +
                ", cnum='" + cnum + '\'' +
                '}';
    }
}
四:在映射文件中实现关系映射操作
Person.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.dao.PersonDao">
    <resultMap id="myPersonMap" type="com.entity.Person">
    <id property="pid" column="pid"></id>
    <result property="pname" column="pname"></result>
    <result property="page" column="page"></result>
    <association property="card" javaType="com.entity.Card">
    <id property="cid" column="cid"></id>
    <result property="cnum" column="cnum"></result>
    </association>
    </resultMap>

    <!-- 一对一关系映射  -->
    <select id="getPersonAndCardById" parameterType="int" resultMap="myPersonMap">
         select p.*,c.cnum from person p,card c where p.uid = c.uid and p.pid=#{0}
    </select>
</mapper>
五:实现数据
package com.test;

import com.dao.PersonDao;
import com.dao.RolesDao;
import com.dao.UseraDao;
import com.entity.Roles;
import com.entity.Usera;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.util.List;

public class TestMyBatis {

    @Test
    public void testSelect(){
        //读取配置文件
        //获取SqlsessionFactory对象
        try {
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //通过sessionFactory获得Sqlsession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            
            PersonDao personDao=sqlSession.getMapper(PersonDao.class);

            //一对一
            Person person = personDao.getPersonAndCardById(1);
             System.out.println(person);
            System.out.println(person.getCard().getCnum());

调用Dao的一对一方法:

先写dao的接口:

package com.dao;

import com.entity.Person;
import com.entity.Province;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Set;

public interface PersonDao {

      //查询getPersonAndCardByIdy一对一
    public Person getPersonAndCardById(int pid);
运行结果如下:

2. 一对多映射

一:写实体类
Province表和City表一对多(实体类)
Province表
package com.entity;
import java.util.Set;

public class Province {

    private int pid;      //编号
    private String pname; //省份名

    private Set<City> cities;
    public Set<City> getCities() {
        return cities;
    }
    public void setCities(Set<City> cities) {
        this.cities = cities;
    }
    public Province() {
    }
    public Province(int pid, String pname) {
        this.pid = pid;
        this.pname = pname;
    }
    //get和set方法
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    @Override
    public String toString() {
        return "Province{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                '}';
    }
}
City表
package com.entity;

public class City {

    private int cid;      //编号
    private String cname; //市
    private int pid;  //编号

    public City() {

    }
    public City(int cid, String cname, int pid) {
        this.cid = cid;
        this.cname = cname;
        this.pid = pid;
    }
    //get和set方法
    public int getCid() {
        return cid;
    }
    public void setCid(int cid) {
        this.cid = cid;
    }
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname;
    }
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
}
二:在映射文件中实现关系映射操作
Person.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 <mapper namespace="com.dao.PersonDao">
    <resultMap id="myPersonMap" type="com.entity.Person">
    <id property="pid" column="pid"></id>
    <result property="pname" column="pname"></result>
    <result property="page" column="page"></result>
    <association property="card" javaType="com.entity.Card">
    <id property="cid" column="cid"></id>
    <result property="cnum" column="cnum"></result>
    </association>
    </resultMap>

    <!-- 一对一关系映射  -->
     <select id="getPersonAndCardById" parameterType="int" resultMap="myPersonMap">
          select p.*,c.cnum from person p,card c where p.uid = c.uid and p.pid=#{0}
     </select>
   <resultMap id="myProvinceMap" type="com.entity.Province">
   <id property="pid" column="pid"></id>
   <result property="pname" column="pname"></result>
   <collection property="cities" ofType="com.entity.City">
   <id property="cid" column="cid"></id>
   <result property="cname" column="cname"></result>
  <!-- 一对多关系映射  -->
    <select id="getProvinceAndCityByid" parameterType="int" resultMap="myProvinceMap">
         select p.*,c.cname from province p,city c where p.pid and p.pid=#{pid}
   </select>
</collection>
</resultMap>

三:实现数据
package com.test;

import com.dao.PersonDao;
import com.dao.RolesDao;
import com.dao.UseraDao;
import com.entity.Roles;
import com.entity.Usera;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.util.List;

public class TestMyBatis {

    @Test
    public void testSelect(){
        //读取配置文件
        //获取SqlsessionFactory对象
        try {
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //通过sessionFactory获得Sqlsession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            
            PersonDao personDao=sqlSession.getMapper(PersonDao.class);

            //一对一
            Person person = personDao.getPersonAndCardById(1);
            System.out.println(person);
            System.out.println(person.getCard().getCnum());
            //一对多
           Province province = personDao.getProvinceAndCityByid(1);
           for (City city : province.getCities()) {
           System.out.println(city.getCname());
        }

调用Dao的一对多方法:

先写dao的接口:

package com.dao;

import com.entity.Person;
import com.entity.Province;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Set;

public interface PersonDao {

     //查询getPersonAndCardByIdy一对一
    public Person getPersonAndCardById(int pid);
    //查询getProvinceAndCityByid一对多
    public Set<Province> getProvinceAndCityByid(int pid);
运行结果如下:

3. 多对多映射

一:写实体类
Usera用户表和Roles角色表以及U_R关系表多对多(实体类)
Usera用户表
package com.entity;
import java.util.Set;

public class Usera {

    private int uid;
    private String uname;

    //多对多关系
    private Set<Roles> roles;

    public Set<Roles> getRoles() {
        return roles;
    }
    public void setRoles(Set<Roles> roles) {
        this.roles = roles;
    }
    public Usera(){

    }
    //get和set方法
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
      }
}

Roles角色表
package com.entity;
import java.util.Set;

public class Roles {

    private int rid;
    private String rname;

    //多对多关系
    private Set<Usera> usera;

    public Roles() {
    }
    //get和set方法
    public int getRid() {
        return rid;
    }
    public void setRid(int rid) {
        this.rid = rid;
    }
    public String getRname() {
        return rname;
    }
    public void setRname(String rname) {
        this.rname = rname;
    }
    public Roles(Set<Usera> usera) {
        this.usera = usera;
    }
}
U_R关系表
package com.entity;
public class u_r {

    private Usera usera;
    private Roles roles;
    public u_r(){

    }
    //get和set方法
    public Usera getUsera() {
        return usera;
    }
    public void setUsera(Usera usera) {
        this.usera = usera;
    }
    public Roles getRoles() {
        return roles;
    }
    public void setRoles(Roles roles) {
        this.roles = roles;
    }
}
二:在映射文件中实现关系映射操作
Usera.xml用户表
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.dao.UseraDao">

    <resultMap type="com.entity.Usera" id="useraMap">
        <id property="uid" column="uid" />
        <result property="uname" column="uname" />

    </resultMap>

    <resultMap type="com.entity.Usera" id="useraRolesMap" extends="useraMap">
        <collection property="roles" ofType="com.entity.Roles">
            <id property="rid" column="rid" />
            <result property="rname" column="rname" />
        </collection>
    </resultMap>

    <select id="selectAllUser" resultMap="useraMap">
        select * from usera
    </select>

    <select id="selectuseraRoles" parameterType="int" resultMap="useraRolesMap">
        select u.uid,u.uname,r.rid,r.rname
        from users u left join u_r ur on u.uid=ur.uid
        left join roles r on ur.rid=r.rid where u.uid =#{uid}
    </select>
</mapper>

Roles.xml角色表
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.dao.RolesDao">

    <resultMap type="com.entity.Roles" id="rolesMap">
        <id property="rid" column="rid" />
        <result property="rname" column="rname" />
    </resultMap>

    <resultMap type="com.entity.Roles" id="rolesUseraMap" extends="rolesMap">
        <collection property="usera" ofType="com.entity.Usera">
            <id property="uid" column="uid" />
            <result property="uname" column="uname" />
        </collection>
    </resultMap>

    <select id="selectAllRoles" resultMap="rolesMap">
        select * from roles
    </select>
</mapper>
三:实现数据以及运行结果如下:
package com.test;

import com.dao.PersonDao;
import com.dao.RolesDao;
import com.dao.UseraDao;
import com.entity.Roles;
import com.entity.Usera;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.util.List;

public class TestMyBatis {

    @Test
    public void testSelect(){
        //读取配置文件
        //获取SqlsessionFactory对象
        try {
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //通过sessionFactory获得Sqlsession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            
            PersonDao personDao=sqlSession.getMapper(PersonDao.class);

            //一对一
            Person person = personDao.getPersonAndCardById(1);
            System.out.println(person);
            System.out.println(person.getCard().getCnum());
            //一对多
           Province province = personDao.getProvinceAndCityByid(1);
           for (City city : province.getCities()) {
           System.out.println(city.getCname());

           //多对多:
           //用户
           UseraDao useraDao=sqlSession.getMapper(UseraDao.class);
           List<Usera> us=useraDao.selectuseraRoles(1);
             for (Usera usera : us) {
           System.out.println(usera.getUname());
              for (Roles roles : usera.getRoles()) {
           System.out.println(roles.getRname());
         }
     }


         //角色
          RolesDao rolesDao=sqlSession.getMapper(RolesDao.class);
          List<Roles> ro=rolesDao.selectAllRoles();
         for (Roles roles : ro) {
             System.out.println(roles.getRname());
         }


调用Dao的注解方法:

先写dao的接口:

注解一对一和一对多
package com.dao;

import com.entity.Person;
import com.entity.Province;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Set;

public interface PersonDao {

    //查询getPersonAndCardByIdy一对一
    @Select("select * from person where pid = #{pid}")
    public Person getPersonAndCardById(int pid);

    //查询getProvinceAndCityByid一对多
    @Select("select * from province")
    public Set<Province> getProvinceAndCityByid(int pid);

}
实现数据以及运行结果如下:
package com.test;

import com.dao.PersonDao;
import com.dao.RolesDao;
import com.dao.UseraDao;
import com.entity.Roles;
import com.entity.Usera;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.util.List;

public class TestMyBatis {

    @Test
    public void testSelect(){
        //读取配置文件
        //获取SqlsessionFactory对象
        try {
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //通过sessionFactory获得Sqlsession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            
            PersonDao personDao=sqlSession.getMapper(PersonDao.class);

            //一对一
       //     Person person = personDao.getPersonAndCardById(1);
       //      System.out.println(person);
       //     System.out.println(person.getCard().getCnum());
            //一对多
        //   Province province = personDao.getProvinceAndCityByid(1);
        //   for (City city : province.getCities()) {
        //  System.out.println(city.getCname());

           //多对多:
           //用户
           UseraDao useraDao=sqlSession.getMapper(UseraDao.class);
           List<Usera> us=useraDao.selectuseraRoles(1);
             for (Usera usera : us) {
           System.out.println(usera.getUname());
              for (Roles roles : usera.getRoles()) {
           System.out.println(roles.getRname());
         }
     }
         //角色
          RolesDao rolesDao=sqlSession.getMapper(RolesDao.class);
          List<Roles> ro=rolesDao.selectAllRoles();
         for (Roles roles : ro) {
             System.out.println(roles.getRname());
         }
         //通过dao方法注解方式进行一对一
        //用注解方式实现(一对一)
           PersonDao personDao1=sqlSession.getMapper(PersonDao.class);
           Person person = personDao.getPersonAndCardById(1);
           System.out.println(person);


         //通过dao方法注解方式进行一对多
         //用注解方式实现(一对多)
         Set<Province> set = personDao.getProvinceAndCityByid(1);
         for (Province provinces : set) {
          System.out.println(provinces);
     }
}

ok,就到这里结束了








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值