MyBatis3一对一单向关联出问题

J2EE 码拜 8年前 (2016-03-17) 1160次浏览
users表
+–+–+–+
| user_id | user_name | user_sex |
+–+–+–+
|       1 | 李雯静    | 女       |
|       3 | 刘诗诗    | 女       |
+–+–+–+
phones表
+–+–+–+
| phone_id | phone       | user_id |
+–+–+–+
|        1 | 13629715184 |       1 |
|        3 | 15340532900 |       3 |
+–+–+–+
测试正常:phone_id=1而不是0,下面会一直为0,好烦。
+–+–+–+–+–+
| phone_id | phone       | user_id | user_name | user_sex |
+–+–+–+–+–+
|        1 | 13629715184 |       1 | 李雯静    | 女       |
+–+–+–+–+–+

/*
 * 一个电话号码对应一个User,但一个Use可以r对应多个电话号码。这里只考虑一对一单向关联。
 */
public class Phone {
	private int phone_id;
	private String phone;
	private User user;

	public int getPhone_id() {
		return phone_id;
	}
	public void setPhone_id(int phone_id) {
		this.phone_id = phone_id;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String toString(){
		return "{phone : phone_id="+this.phone_id+",phone="+this.phone+", [id="+this.user.getId()+",username="+this.user.getUsername()+",sex="+this.user.getSex()+"]}";
	}
}
<!-- PhoneMapper.xml -->
<mapper namespace="com.dk.mybatis.mapper.PhoneMapper">
       <resultMap type="Phone" id="phoneResultMap">
              <association property="user" javaType="User">   <!-- Phone中的确关联了一个user属性 -->
                     <id property="id" column="user_id" />
                     <result property="username" column="user_name"/>
                     <result property="sex" column="user_sex"/>
              </association>
       </resultMap>
       
       <select id="getPhone" parameterType="int" resultMap="phoneResultMap">
              select p.phone_id, p.phone, u.user_id, u.user_name, u.user_sex from phones as p, users as u where p.user_id=u.user_id and p.phone_id=#{phone_id}
       </select>
</mapper>  
//单元测试
public class Test4 {
	@Test
	public void testQuery() {
		SqlSession session=MyBatisUtils.getSqlSession();
		String statement = "com.dk.mybatis.mapper.PhoneMapper.getPhone";
		Phone phone = session.selectOne(statement, 1);
		Phone phone2 = session.selectOne(statement, 3);
		session.close();
		System.out.println(phone);		//{phone : phone_id=0,phone=null, [id=1,username=刘诗诗,sex=女]}
		System.out.println(phone2);	//{phone : phone_id=0,phone=null, [id=3,username=李雯静,sex=女]}

		/*
		 * 为什么查询结果中phone_id总是等于0啊啊啊啊啊啊啊······
		 * 
		 */
	}
}
解决方案

10

有意思,  resultMapper里面P


hone的栏位都没加上你还想得到它。换成这样试一次吧。

<!-- PhoneMapper.xml -->
<mapper namespace="com.dk.mybatis.mapper.PhoneMapper">
	   <id property="id" column="phone_id" />
	   <result property="phone" column="phone"/>
       <resultMap type="Phone" id="phoneResultMap">
              <association property="user" javaType="User">   <!-- Phone中的确关联了一个user属性 -->
                     <id property="id" column="user_id" />
                     <result property="username" column="user_name"/>
                     <result property="sex" column="user_sex"/>
              </association>
       </resultMap>
        
       <select id="getPhone" parameterType="int" resultMap="phoneResultMap">
              select p.phone_id, p.phone, u.user_id, u.user_name, u.user_sex from phones as p, users as u where p.user_id=u.user_id and p.phone_id=#{phone_id}
       </select>
</mapper>

10

引用:
Quote: 引用:

上面应该就是正确的了

高手,首先谢谢你,解决了,本人之所以省略是原因是实体类属性和数据表字段是完全一样的,没想到出问题了!
但是本人下面的没有省略为什么还有这种问题,一直是000000000000···

/*
 * 导师对硕士生是一对多单项关联
 */
public class Professor {

	private int id;
	private String name;
	private String sex;
	private int age;
	private List<Master> masters;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public List<Master> getMasters() {
		return masters;
	}
	public void setMasters(List<Master> masters) {
		this.masters = masters;
	}

	@Override
	public String toString(){
		return "{\n"+"  导师编号:"+this.id+", \n  导师姓名:"+this.name+", \n  性别:"+this.sex+", \n  年龄:"+this.age+", \n  硕士生:"+this.masters+"\n}";
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC 
       "-//mybatis.org//DTD Mapper 3.3//EN" 
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
       
<!-- namespace的值命名格式建议如下:包名+XML映射文件名 -->
<mapper namespace="com.dk.mybatis.mapper.ProfessorMapper">
       <resultMap type="Professor" id="professorResultMap">
              <id property="id" column="prof_id"/>
              <result property="name" column="prof_name"/>
              <result property="sex" column="prof_sex"/>
              <result property="age" column="prof_age"/>
              <collection property="masters" ofType="Master">   <!-- Professor中的确关联了一个masters属性,ofType指定List中保存的类型 -->
                     <id property="id" column="ma_id" />
                     <result property="name" column="ma_name"/>
              </collection>
       </resultMap>
       
       <select id="getProf" parameterType="int" resultMap="professorResultMap">
              select p.prof_id, p.prof_name, p.prof_sex, p.prof_age,m.ma_name 
                     from professors as p, masters as m 
                            where p.prof_id=m.prof_id and p.prof_id=#{prof_id}
       </select>
       
</mapper>  

[code=java]
{
导师编号:1,
导师姓名:杨丰瑞,
性别:男,
年龄:55,
硕士生:[[id:0, name:杜奎], [id:0, name:庄园], [id:0, name:刘雄风], [id:0, name:刘婷]]
}
select 语句添加m.ma_id字段试下


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明MyBatis3一对一单向关联出问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)