1. 程式人生 > >MyBatis(三)多表操作之一對一

MyBatis(三)多表操作之一對一

多表操作之一對一

1、由於MyBatis是半自動ORM,所以這裡我們還是需要手動建庫
User表:
這裡寫圖片描述
userInfo表:
這裡寫圖片描述
2、建立資料庫對應實體類:
由於是多表查詢,資料庫表與表的關係,在程式碼裡就體現的是類與類之間的關係
User實體類:

public class User implements Serializable{
    private int userId;
    private String userName;
    private String userPwd;
    private UserInfo info;  //使用者詳細資訊

    public
UserInfo getInfo() { return info; } public void setInfo(UserInfo info) { this.info = info; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return
userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPwd() { return userPwd; } public void setUserPwd(String userPwd) { this.userPwd = userPwd; } @Override public String toString() { return
"User [userId=" + userId + ", userName=" + userName + ", userPwd=" + userPwd + ", info=" + info + "]"; } }

UserInfo實體類:

public class UserInfo {
    private int infoId;
    private String infoAddress; //使用者地址
    private String infoPhone;   //  使用者電話
    private int infoUserID;     //對應使用者主表ID
    public int getInfoId() {
        return infoId;
    }
    public void setInfoId(int infoId) {
        this.infoId = infoId;
    }
    public String getInfoAddress() {
        return infoAddress;
    }
    public void setInfoAddress(String infoAddress) {
        this.infoAddress = infoAddress;
    }
    public String getInfoPhone() {
        return infoPhone;
    }
    public void setInfoPhone(String infoPhone) {
        this.infoPhone = infoPhone;
    }
    public int getInfoUserID() {
        return infoUserID;
    }
    public void setInfoUserID(int infoUserID) {
        this.infoUserID = infoUserID;
    }
    @Override
    public String toString() {
        return "UserInfo [infoId=" + infoId + ", infoAddress=" + infoAddress + ", infoPhone=" + infoPhone
                + ", infoUserID=" + infoUserID + "]";
    }
}

3、新建工具類,用於獲取SqlSession會話

public class DBUtil {
    /**
     * 每個資料庫對應一個SqlSessionFactory
     */
    private static SqlSessionFactory sqlSessionFactory;

    /**
     * 1、靜態塊初始化,通過位元組輸入流讀取配置檔案
     */
    static {
        InputStream is=null;

        try {
            is=Resources.getResourceAsStream("sqlMapConfig.xml");
            /**
             * 2、獲得SqlSessionFactory
             */
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 3、通過SqlSessionFactory獲得SqlSession會話
     */
    public static SqlSession getsqlsession() {
        return sqlSessionFactory.openSession();
    }

}

4、建立實體類對應的介面,配置對映檔案
這裡寫圖片描述
UserMapper:

public interface UserMapper {
    /**
     * 通過使用者id查詢使用者所有資訊(一對一查詢)
     * @param id 使用者id
     * @return user使用者物件
     */
    public User findUserAndInfo(int id);
    }

配置User對映檔案:UserMapper.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.zh.mapper.UserMapper">
    <!-- (多表查詢,一對一查詢) -->
    <resultMap type="User" id="UserAndInfo">
        <id property="userId" column="user_id" javaType="int"></id>
        <result property="userName" column="user_name" javaType="java.lang.String"></result>
        <result property="userPwd" column="user_pwd" javaType="java.lang.String"></result>
        <!-- 對映多表,select對應從表查詢方法 -->
        <association property="info" column="user_id" javaType="UserInfo"
            select="com.zh.mapper.UserInfoMapper.findInfoById"></association>
    </resultMap>

<!-- 通過使用者ID查詢使用者的所有資訊(一對一查詢) -->
    <select id="findUserAndInfo" resultMap="UserAndInfo">
        select * from t_user where user_id=#{id}
    </select>
    </mapper>

接著我們寫從表的對映檔案,首先寫從表的實現介面:
UserInfoMapper:

public interface UserInfoMapper {
    /**
     * 通過ID查詢所有資訊
     * @param id使用者ID
     * @return 使用者資訊物件
     */
    public UserInfo findInfoById(int id);
    }

從表對映配置:UserInfoMapper.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.zh.mapper.UserInfoMapper">
    <!-- 單表查詢,一對一查詢 -->
    <resultMap type="UserInfo" id="userInfoMap">
        <id property="infoId" column="info_id" javaType="int"></id>
        <result property="infoAddress" column="info_address" javaType="java.lang.String"></result>
        <result property="infoPhone" column="info_phone" javaType="java.lang.String"></result>
        <result property="infoUserID" column="info_userID" javaType="int"></result>
    </resultMap>


    <select id="findInfoById" resultMap="userInfoMap">
        select * from t_userInfo where info_userID=#{id}
    </select>
    </mapper>

5、接下來是實現層:
UserService:

public class UserService {
    // 呼叫實現sqlsession會話
    SqlSession sqlsession = DBUtil.getsession();
    // 介面不能直接new,通過session的getMapper方法實現,引數為介面的class檔案
    UserMapper mapper = sqlsession.getMapper(UserMapper.class);

    // 通過ID查詢使用者的所有資訊(一對一)
    public User findUserAndInfo(int id) {
        User user = mapper.findUserAndInfo(id);
        return user;
    }
}

UserInfoService:

public class UserInfoService {
    // 呼叫實現sqlsession會話
    SqlSession sqlsession = DBUtil.getsession();
    // 實現對應的mapper介面
    UserInfoMapper mapper = sqlsession.getMapper(UserInfoMapper.class);

    public UserInfo findInfoById(int id) {
        return mapper.findInfoById(id);
    }
}

6、寫到這裡,基本上就完工了,接下來就開始測試:
新建測試類:UserAction:

public class UserAction {
    //例項化UserService
    private static UserService service=new UserService();

    public static void main(String[] args) {
        //呼叫service的方法
        User user=service.findUserAndInfo(1);
        System.out.println(user);
    }
}

7、獲得結果:
這裡寫圖片描述

最後,總結下:由於我們需要查兩張表的資料,每張表對應一個實體類,而我們需要查每個類裡面的屬性,所以我們就需要建立單表個的查詢,然後通過對映,把兩個類相關聯,最後就查詢出我們需要的資料了。