JavaEE學習日誌(八十四): MyBatis的一對一映射、一對多映射、多對多映射

JavaEE學習日誌持續更新----> 必看!JavaEE學習路線(文章總彙)

MyBatis

一對一映射(1)

新建賬戶表和用戶表組成一對一關係
在這裏插入圖片描述
方式一:組成一個新的pojo,是account和user的結合,繼承其中一個pojo
注意:此種方法最好不用,如果有相同的屬性名會相當麻煩

<select id="findAllAccountUser" resultType="accountUser">
        SELECT * FROM account a,user u where a.u_id = u.id
    </select>
package com.itheima.domain;

/*
    繼承了Account
 */
public class AccountUser extends Account {
    private Integer id;
    private String username;
    private String password;
    private String sex;
    private String address;
    private String birthday;

    @Override
    public String toString() {
        return "AccountUser{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                ", birthday='" + birthday + '\'' +
                "} " + super.toString();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
}

測試類

@Test
    public void test2(){
        //獲取sqlsession對象
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
        List<AccountUser> accountUserList = accountDao.findAllAccountUser();
        for (AccountUser accountUser : accountUserList) {
            System.out.println(accountUser);
        }
        //關閉資源
        sqlSession.close();
    }

一對一映射(2)

方法二:Account的pojo中加上一個user屬性,一個賬戶對應一個用戶

package com.itheima.domain;

public class Account {
    private Integer id;
    private String name;
    private Float money;
    private Integer u_id;
    //一個賬戶對應一個用戶
    private User user;

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                ", u_id=" + u_id +
                ", user=" + user +
                '}';
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Float getMoney() {
        return money;
    }

    public void setMoney(Float money) {
        this.money = money;
    }

    public Integer getU_id() {
        return u_id;
    }

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

需要添加映射關係:列名和屬性名相同可以省略

<resultMap id="accounts" type="Account">
        <!--<id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <result column="money" property="money"></result>
        <result column="u_id" property="u_id"></result>-->
        <!--映射user中的屬性-->
        <result column="id" property="user.id"></result>
        <result column="username" property="user.username"></result>
        <result column="address" property="user.address"></result>
        <result column="birthday" property="user.birthday"></result>
        <result column="sex" property="user.sex"></result>
        <result column="password" property="user.password"></result>

    </resultMap>

    <select id="findAllAccount" resultMap="accounts">
        SELECT * FROM account a,user u where a.u_id = u.id
    </select>

測試類

@Test
    public void test3(){
        //獲取sqlsession對象
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
        List<Account> accountList = accountDao.findAllAccount();
        for (Account account : accountList) {
            System.out.println(account);
        }
        //關閉資源
        sqlSession.close();
    }

一對一映射(3)

方式三:pojo同第二種,映射方式改變

注意:此種映射,列名和屬性名相同時,也無法省略

標籤<association>映射單個對象

  • property:屬性名
  • javaType:屬性類型
<resultMap id="accounts" type="Account">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <result column="money" property="money"></result>
        <result column="u_id" property="u_id"></result>
        <!--映射user中的屬性-->
        <!--映射單個對象-->
        <association property="user" javaType="user">
            <id column="id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
            <result column="sex" property="sex"></result>
            <result column="password" property="password"></result>
            <result column="birthday" property="birthday"></result>
        </association>

    </resultMap>

    <select id="findAllAccount" resultMap="accounts">
        SELECT * FROM account a,user u where a.u_id = u.id
    </select>
@Test
    public void test3(){
        //獲取sqlsession對象
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
        List<Account> accountList = accountDao.findAllAccount();
        for (Account account : accountList) {
            System.out.println(account);
        }
        //關閉資源
        sqlSession.close();
    }

一對多映射

一對多關係:一個用戶有多個賬戶表
在User的pojo裏添加List集合

private List<Account> accountList;

得到一個新的User的pojo

package com.itheima.domain;

import java.util.List;

/*
    包裝類型:初始值爲null
    基本數據類型:本身的值就是一個狀態
 */
public class User {
    private Integer id;
    private String username;
    private String password;
    private String sex;
    private String address;
    private String birthday;
    /*一個用戶對應多個賬戶*/
    private List<Account> accountList;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                ", birthday='" + birthday + '\'' +
                ", accountList=" + accountList +
                '}';
    }

    public List<Account> getAccountList() {
        return accountList;
    }

    public void setAccountList(List<Account> accountList) {
        this.accountList = accountList;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

添加映射,標籤<collection>

  • property:屬性名
  • ofType:集合的屬性類型
<resultMap id="users" type="user">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="address" property="address"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>
        <result column="sex" property="sex"></result>
        <!--collection映射accountList屬性
            property:屬性名
            ofType:集合的屬性類型
        -->
        <collection property="accountList" ofType="account">
            <id column="id" property="id"></id>
            <result column="name" property="name"></result>
            <result column="money" property="money"></result>
            <result column="u_id" property="u_id"></result>
        </collection>
    </resultMap>

    <select id="findAll" resultMap="users">
        select * from user u left join account a on u.id = a.u_id
    </select>

測試類

@Test
    public void test() {
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
        //獲取動態代理對象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        //執行方法
        List<User> userList = userDao.findAll();
        for (User user : userList) {

            System.out.println(user);
        }
        sqlSession.close();
    }

多對多映射

多對多映射:其實就是兩個一對多映射

一、查看所有user對象,其中包含role信息

注意(非常重要):多表查詢後,如果字段名重複,必須使用字段別名來防止字段名重複,否則查詢的結果會出現錯亂。

pojo中添加role集合

//一個角色對應多個用戶
private List<User> userList;
<resultMap id="users" type="user">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="address" property="address"></result>
        <result column="sex" property="sex"></result>
        <result column="birthday" property="birthday"></result>
        <result column="password" property="password"></result>
        <!--一個用戶對應多個角色-->
        <collection property="roleList" ofType="role">
            <id column="rid" property="id"></id>
            <result column="roleName" property="roleName"></result>
            <result column="roleDesc" property="roleDesc"></result>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="users">
        select r.id rid,r.roleName,r.roleDesc,u.* from user u left JOIN user_role ur on u.id = ur.uid left join role r on r.id = ur.rid
    </select>
@Test
    public void test() {
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
        //獲取動態代理對象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.findAll();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

二、查看所有role對象,其中包含user信息

pojo中添加user集合

//一個角色對應多個用戶
    private List<User> userList;
<resultMap id="roles" type="role">
        <id column="rid" property="id"></id>
        <result column="roleName" property="roleName"></result>
        <result column="roleDesc" property="roleDesc"></result>
        <collection property="userList" ofType="user">
            <id column="id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
            <result column="sex" property="sex"></result>
            <result column="birthday" property="birthday"></result>
            <result column="password" property="password"></result>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="roles">
        select r.id rid,r.roleName,r.roleDesc,u.* from role r left join user_role ur on r.id = ur.rid left join user u on u.id = ur.uid
    </select>
@Test
    public void test2() {
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
        //獲取動態代理對象
        RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
        List<Role> roleList = roleDao.findAll();
        for (Role role : roleList) {
            System.out.println(role);
        }
        sqlSession.close();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章