1. 程式人生 > >MyBatis中對映檔案和註解的關係查詢(一對一,一對多,多對多)

MyBatis中對映檔案和註解的關係查詢(一對一,一對多,多對多)

對映關係的查詢

一對一查詢:(案例--人和卡

User實體類

package com.entity;

public class User {

    private int uid;
    private String uname;
    private  String upass;

    //一對一關係  
private Card card;

    public Card getCard() {
        return card;
    }

    public void setCard(Card card) {
        this.card = card;
    }
    
    public 
User() { } public User(int uid, String uname, String upass) { this.uid = uid; this.uname = uname; this.upass = upass; } 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; } public String getUpass() { return upass; } public void setUpass(String upass) { this.upass = upass; } @Override public String toString() { return "User{" + "uid="
+ uid + ", uname='" + uname + '\'' + ", upass='" + upass + '\'' + '}'; } }

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;
    }

    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 + '\'' +
                '}';
    }
}

mybatis-config.xml配置檔案:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--設定別名-->
<typeAliases>
        <package name="com.entity"></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="123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/entity/User.xml"/>
        <!-- 註冊UserMapper對映介面-->
    </mappers>

</configuration>

UserDao--介面

public User getMyUserAndCardById(int uid);

User.xml對映檔案

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.UserDao">
    
    <!--一對一關係-->
<resultMap id="myUserMap" type="com.entity.User">
         <id property="uid" column="uid"></id>
         <result property="uname" column="uname"></result>
         <result property="upass" column="upass"></result>
         <association property="card" javaType="com.entity.Card">  //物件標籤association
          <result property="cid" column="cid"></result>
          <result property="cnum" column="cnum"></result>
         </association>
     </resultMap>

    <!--一對一的查詢-->
<select id="getMyUserAndCardById" parameterType="int" resultMap="myUserMap">
        select u.*,c.cnum from user u,card c where u.uid=c.cid and u.uid=#{uid};
    </select>

</mapper>

一對一測試類:

//載入配置檔案並得到SQLsessionfactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
//得到sqlsession
SqlSession sqlSession=sqlSessionFactory.openSession();

//得到dao的介面類
UserDao userDao=sqlSession.getMapper(UserDao.class);

//查詢一對一的關係
User user=userDao.getMyUserAndCardById(1);
System.out.println(user);
System.out.println(user.getCard().getCnum());

sqlSession.close();

一對多查詢:(案例--省和城市

Locations實體類:

package com.entity;

import java.util.Set;

public class Locations {

    private int loc_id;
    private String loc_name;

    //一對多關係
private Set<Citys> citys;

    public Set<Citys> getCitys() {
        return citys;
    }

    public void setCitys(Set<Citys> citys) {
        this.citys = citys;
    }

    public Locations() {
    }

    public Locations(int loc_id, String loc_name) {
        this.loc_id = loc_id;
        this.loc_name = loc_name;
    }

    public int getLoc_id() {
        return loc_id;
    }

    public void setLoc_id(int loc_id) {
        this.loc_id = loc_id;
    }

    public String getLoc_name() {
        return loc_name;
    }

    public void setLoc_name(String loc_name) {
        this.loc_name = loc_name;
    }

    @Override
public String toString() {
        return "Locations{" +
                "loc_id=" + loc_id +
                ", loc_name='" + loc_name + '\'' +
                '}';
    }
}

Citys實體類:

package com.entity;

public class Citys {

    private int cit_id;
    private String cit_name;
    private  int loc_id;


    public Citys() {
    }

    public Citys(int cit_id, String cit_name, int loc_id) {
        this.cit_id = cit_id;
        this.cit_name = cit_name;
        this.loc_id = loc_id;
    }

    public int getCit_id() {
        return cit_id;
    }

    public void setCit_id(int cit_id) {
        this.cit_id = cit_id;
    }

    public String getCit_name() {
        return cit_name;
    }

    public void setCit_name(String cit_name) {
        this.cit_name = cit_name;
    }

    public int getLoc_id() {
        return loc_id;
    }

    public void setLoc_id(int loc_id) {
        this.loc_id = loc_id;
    }

    @Override
public String toString() {
        return "Citys{" +
                "cit_id=" + cit_id +
                ", cit_name='" + cit_name + '\'' +
                ", loc_id=" + loc_id +
                '}';
    }
}

Dao方法:

//通過省份得到城市
public Locations getCitysById(int loc_id);

User.xml中配置:

<resultMap id="myLocationsMap" type="com.entity.Locations">
   <id property="loc_id" column="loc_id"></id>
   <result property="loc_name" column="loc_name"></result>
    <collection property="citys" ofType="com.entity.Citys">
        <id property="cit_id" column="cit_id"></id>
        <result property="cit_name" column="cit_name"></result>
    </collection>
</resultMap>

<!--一對多的查詢-->
<select id="getCitysById" parameterType="int" resultMap="myLocationsMap">
    select l.*,c.* from locations l,citys c  where l.loc_id=c.loc_id and l.loc_id=#{loc_id};
 </select>

測試類:

//查詢一對多的關係
Locations locations=userDao.getCitysById(2);
for (Citys citys : locations.getCitys()) {
    System.out.println(citys);
}

多對多查詢:(案例--使用者和角色

Tb_user實體類

package com.entity;

import java.util.Set;

public class Tb_user {

    private int u_id;
    private String u_name;

     private Set<Tb_jues> tb_jues;

    public Set<Tb_jues> getTb_jues() {
        return tb_jues;
    }


    public void setTb_jues(Set<Tb_jues> tb_jues) {
        this.tb_jues = tb_jues;
    }

    public Tb_user() {
    }

    public Tb_user(int u_id, String u_name) {
        this.u_id = u_id;
        this.u_name = u_name;
    }

    public int getU_id() {
        return u_id;
    }

    public void setU_id(int u_id) {
        this.u_id = u_id;
    }

    public String getU_name() {
        return u_name;
    }

    public void setU_name(String u_name) {
        this.u_name = u_name;
    }

    @Override
public String toString() {
        return "Tb_user{" +
                "u_id=" + u_id +
                ", u_name='" + u_name + '\'' +
                '}';
    }
}

Tb_jues實體類:

package com.entity;

import java.util.Set;

public class Tb_jues {

    private int j_id;
    private String j_name;

    private Set<Tb_user> tb_users;

    public Set<Tb_user> getTb_users() {
        return tb_users;
    }

    public void setTb_users(Set<Tb_user> tb_users) {
        this.tb_users = tb_users;
    }

    public Tb_jues() {
    }

    public Tb_jues(int j_id, String j_name) {
        this.j_id = j_id;
        this.j_name = j_name;
    }

    public int getJ_id() {
        return j_id;
    }

    public void setJ_id(int j_id) {
        this.j_id = j_id;
    }

    public String getJ_name() {
        return j_name;
    }

    public void setJ_name(String j_name) {
        this.j_name = j_name;
    }

    @Override
public String toString() {
        return "Tb_jues{" +
                "j_id=" + j_id +
                ", j_name='" + j_name + '\'' +
                '}';
    }
}

Dao方法:

  //通過使用者編號得到有關的所有角色public Tb_user getALLj(int u_id);

User.xml對映檔案的配置:

<!--查詢所有的使用者-->
<resultMap id="getall" type="com.entity.Tb_user">
       <id property="u_id" column="u_id"></id>
       <result property="u_name" column="u_name"></result>
       <collection property="tb_jues" ofType="com.entity.Tb_jues">
           <id property="j_id" column="j_id"></id>
           <result property="j_name" column="j_name"></result>

       </collection>
   </resultMap>
   

   <select id="getALLj" parameterType="int" resultMap="getall">
    select u.*,j.j_name from tb_user u,tb_jues j,u_j uj where uj.u_id=j.j_id and u.u_id=#{u_id};
</select>

測試類:

Tb_user tb_user=userDao.getALLj(1);
for (Tb_jues tb_jues : tb_user.getTb_jues()) {
    System.out.println("::"+tb_jues.getJ_name());
}

通過註解實現關係查詢:

不需要對映檔案了

UserDao的介面方法:

 //通過註解方式實現一對一關係查詢
 //查詢卡
@Select("select * from card where cid=#{uid}")
 public Card getCardById(int uid);
 //通過使用者id得到使用者資訊和卡號@Select("select * from user where uid=#{uid}")
 @Results({
         @Result(id=true, column="uid", property="uid"),
         @Result(column="uname", property="uname"),
         @Result(property="card", column="uid",  //column為主表的id
                 one=@One(select="com.dao.UserDao.getCardById"))  //呼叫查詢卡的方法
 })
 public User getMyUserAndCardById_zhujie(int uid);




//通過註解實現一對多的關係
 //查詢省份下面的所有城市
 //先查詢城市
@Select("select * from citys where loc_id=#{loc_id}")
 @Results({
         @Result(id=true, column="cit_id", property="cit_id"),
         @Result(column="cit_name", property="cit_name")
 })
 public List<Citys> getAllCitysZ(int loc_id);


  //查詢省份
@Select("select * from locations where loc_id=#{loc_id}")
  @Results({
         @Result(id=true, column="loc_id", property="loc_id"),
         @Result(column="loc_name", property="loc_name"),
         @Result(property="citys", column="loc_id", //主表id
                  many=@Many(select="com.dao.UserDao.getAllCitysZ"))  //呼叫得到城市的方法
        })
 public Locations getLocationsZhujie(int loc_id);



  //通過註解實現多對多關係查詢
  //先查詢角色
@Select("select * from tb_jues where j_id in (select j_id from u_j where u_id = #{u_id})")  //u_j為關係表

  @Results({
         @Result(id=true, column="j_id", property="j_id"),
         @Result(column="j_name", property="j_name")
 })
 public List<Tb_jues> gettbjues(int u_id);


 //查詢使用者
@Select("select * from tb_user where u_id=#{u_id}")
 @Results({
         @Result(id=true,column="u_id",property="u_id"),
         @Result(column="u_name",property="u_name"),
         @Result(column="u_id",property="tb_jues",many=@Many(select="com.dao.UserDao.gettbjues",fetchType=FetchType.LAZY))  //呼叫查詢角色的方法
 })
 public Tb_user getAllTbUSER(int u_id);

然後在mybatis-config.xml檔案<mappers>標籤中加入

<mappers>
    <!--<mapper resource="com/entity/User.xml"/>-->
    <!-- 註冊UserMapper對映介面-->
<mapper class="com.dao.UserDao"/>
</mappers>

測試類中在呼叫方法測試就可以了!

//註解方法 一對一
User user=userDao.getMyUserAndCardById_zhujie(1);
System.out.println(user);
System.out.println(user.getCard().getCnum());


//註解方法 一對多
Locations locations=userDao.getLocationsZhujie(2);
System.out.println(locations);
for (Citys citys : locations.getCitys()) {
    System.out.println(citys);
}


//註解方法 多對多
Tb_user tb_user=userDao.getAllTbUSER(1);
System.out.println(tb_user);
for (Tb_jues tb_jues : tb_user.getTb_jues()) {
    System.out.println(tb_jues);
}