mybatis一对多查询过程只查询了一个结果
2016-11-28 18:16
387 查看
新学mybatis,在一对多关联查询过程中出现了一点bug
首先附上我的代码
User.java
Car.java
Order.java//订单类
然后是user,orders,car的三个表的表结构
出于清晰明了,我这里直接截图
user 表:
car表
orders表
UserMapper.xml中的相关查询代码如下:
测试:
输出台部分输出:
在navicat执行该sql:
可以看到这个user下面有两个与之关联的订单 但是java执行却只显示一个
这不是mybatis配置问题 也不是sql语句问题
而是user表和ordesr表的主键名都为id所引起的,不知道mybatis内部是什么机制去处理的 改为不同名的主键便ok了
具体原因得在日后深入源码学习再来这里公布
mybatis一对多具体的请看:http://www.tuicool.com/articles/M3QJvu
首先附上我的代码
User.java
public class User { public User() { // TODO Auto-generated constructor stub } private String userName; private String passWord; private int id; private Car car; private List<Order> orders;//订单 public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public String toString() { return "User [userName=" + userName + ", passWord=" + passWord + ", id=" + id + ", car=" + car + ", orders=" + orders + ", age=" + age + "]"; } public List<Order> getOrders() { return orders; } public void setOrders(List<Order> orders) { this.orders = orders; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } private int age; }
Car.java
public class Car { private int id; private int pid; private String name; @Override public String toString() { return "Car [id=" + id + ", pid=" + pid + ", name=" + name + "]"; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Car() { // TODO Auto-generated constructor stub } }
Order.java//订单类
public class Order { private int id; private int price; private int cid; public void setId(int id) { this.id = id; } @Override public String toString() { return "Order [id=" + id + ", price=" + price + ", cid=" + cid + "]"; } public int getId() { return id; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } }
然后是user,orders,car的三个表的表结构
出于清晰明了,我这里直接截图
user 表:
car表
orders表
UserMapper.xml中的相关查询代码如下:
<select id="selectUser" resultMap="userMap"> select * from user u inner join car on u.id=pid inner join orders on u.id=cid where u.id = #{id} </select> <resultMap type="u" id="userMap"> <id column="id" property="id"/> <result column="userName" property="userName"/> <result column="passWord" property="passWord"/> <result column="age" property="age"/> <association property="car" javaType="com.zzc.po.Car">//一对一的关联pojo <id column="id" property="id"/> <result column="name" property="name"/> <result column="pid" property="pid"/> </association> <collection property="orders" ofType="com.zzc.po.Order" >//一对多的关联pojo <id column="id" property="id"/> <result column="cid" property="cid"/> <result column="price" property="price"/> </collection> </resultMap>
测试:
SqlSession session = null; @Before public void before() throws IOException{ String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); session = sqlSessionFactory.openSession(); } public Tests() { // TODO Auto-generated constructor stub } @Test public void demo1() throws IOException{ UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUser(2); System.out.println(user); // System.out.println(mapper.insertUser("323", "111", 11)); // User u = new User(); // u.setPassWord("asas"); // u.setUserName("q323"); // System.out.println(mapper.insertUser2(u)); // System.out.println(mapper.insertUserGetKey(u)); // System.out.println(u.getId()); } @After public void after(){ session.commit(); session.close(); }
输出台部分输出:
2016 十一月 28 18:13:25,622 DEBUG selectUser:145 - ==> Preparing: select * from user u inner join car on u.id=pid inner join orders on u.id=cid where u.id = ? 2016 十一月 28 18:13:25,691 DEBUG selectUser:145 - ==> Parameters: 2(Integer) 2016 十一月 28 18:13:25,719 DEBUG selectUser:145 - <== Total: 2 User [userName=www, passWord=123, id=2, car=Car [id=2, pid=2, name=rrr], orders=[Order [id=2, price=2000, cid=2]], age=101]
在navicat执行该sql:
可以看到这个user下面有两个与之关联的订单 但是java执行却只显示一个
这不是mybatis配置问题 也不是sql语句问题
而是user表和ordesr表的主键名都为id所引起的,不知道mybatis内部是什么机制去处理的 改为不同名的主键便ok了
具体原因得在日后深入源码学习再来这里公布
mybatis一对多具体的请看:http://www.tuicool.com/articles/M3QJvu
相关文章推荐
- 创建一个包,其中定义一个过程,可以查询得到编号为7900的员工的姓名ename、薪水sal、佣金comm、上司编号mgr (通过OUT类型的参数将结果返回并打印) (注意包有包头部分的声明和包体部分的
- mybatis mysql 关于调用存储过程获取查询结果
- 三种方法实现从“一个(组)查询过程中返回两个表的查询结果”
- 三种方法实现从“一个(组)查询过程中返回两个表的查询结果”
- 可在任何一个表(或视图)中按任何一个字段值进行查询的通用存储过程(精确查询)
- 判断一个查询的结果是否为空
- 生成XML格式的查询结果,保存到一个XML文本中
- 将次查询结果合并到一个ds中
- oracle 将查询结果中的一列合并为一个字符串
- 不显示查询问题的解决(太完美了,新建一个图层,表示查询结果)
- 一个传入查询的存储过程
- SQLSERVER,不使用BCP,把查询结果输出为txt文本文件的存储过程
- 如何对一个RichEdit查询,并把查询出来的结果放到另一个RichEdit里,
- 查询预警中的一个较为复杂的存储过程--dhg
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- 在一个存储过程A中调用另外一个存储过程B返回的结果集
- SQL SERVER 2005的一个怪问题: 在查询结果面板中编辑失败.
- select 查询存储过程结果
- 如何判断一个查询的结果是否为空
- 传递一个查询并处理结果