MyBatis(三)多表操作之一對一
阿新 • • 發佈:2018-12-25
多表操作之一對一
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、獲得結果:
最後,總結下:由於我們需要查兩張表的資料,每張表對應一個實體類,而我們需要查每個類裡面的屬性,所以我們就需要建立單表個的查詢,然後通過對映,把兩個類相關聯,最後就查詢出我們需要的資料了。