ssm一对多查询,如一个用户可以有多个购物订单
1.用户表,三个字段,然后将对应的明细表useinfo映射到user类里
package com.xqbk.model;
import java.io.Serializable;
import java.util.List;
public class User implements Serializable {
private int uId;
private String password;
private String username;
private List<UserInfo> userinfo;
public int getId() {
return uId;
}
public void setId(int uId) {
this.uId = uId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public List<UserInfo> getUserinfo() {
return userinfo;
}
public void setUserinfo(List<UserInfo> userinfo) {
this.userinfo = userinfo;
}
}
2.userinfo表
package com.xqbk.model;
import java.io.Serializable;
public class UserInfo implements Serializable {
private Integer id;
private Integer userId;
private String orderName;
private String orderTime;
private User user;//
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName == null ? null : orderName.trim();
}
public String getOrderTime() {
return orderTime;
}
public void setOrderTime(String orderTime) {
this.orderTime = orderTime == null ? null : orderTime.trim();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
3.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">
<!-- 设置为IUserDao接口方法提供sql语句配置 -->
<mapper namespace="com.xqbk.dao.IUserDao">
<!-- 引入redis二级缓存,同时在需要缓存的语句上加 useCache="true" -->
<!--<cache type="com.xqbk.util.RedisCache"></cache> -->
<!-- 根据id查询user-->
<select id="selectUser" resultType="User" parameterType="String" >
SELECT * FROM user WHERE password = #{id}
</select>
<!-- 定义数据库字段与实体对象的映射关系 -->
<!-- columnw为数据库字段名,property为实体类里属性 -->
<resultMap id="UserBean" type="User" >
<id column="u_id" property="uId"/>
<result column="password" property="password"/>
<result column="username" property="username"/>
<!-- 一对多的关系 -->
<!-- property: 指的是集合属性的值, ofType:指的是集合中元素的类型 -->
<collection property="userinfo" ofType="UserInfo">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="order_name" property="orderName"/>
<result column="order_time" property="orderTime"/>
</collection>
</resultMap>
<!-- 关联查询语句 -->
<select id="selectUserInfoByName" parameterType="string" resultMap="UserBean" >
SELECT * FROM USER,user_info WHERE user.u_id=user_info.user_id AND user.username=#{username};
</select>
</mapper>
4.service和dao接口里这样定义
User selectUserInfoByName(String username);
5.controller里测试
User user=this.userService.selectUserInfoByName("测试名字");
System.out.println("获取user长度---------"+user.getUserinfo().size());
List<UserInfo> userInfoList=user.getUserinfo();
for (UserInfo userinfo : userInfoList) {
System.out.println("集合里:"+userinfo.getOrderName());
}
备注:
如果发现应该是多条数据,结果就查出一条,
原因:主表和明细表的id字段名相同造成的
解决方案:修改主表或者明细表的id名,保证不一致就行