就简单地说,你多表查出来的其它字段数据,而你接收的实体对象不存在这个属性,而你又需要映射这个数据,简单的做法就是实体对象你多加字段属性,或者是重复id单表操作然后映射成vo的类去返回前端
查询出的字段在相应的pojo中必须有和它相同的字段对应,或者基本数据类型
适合简单查询
association:映射到POJO的某个复杂类型属性,比如订单order对象里面包含user对象
像一些傻子操作是,你sql查询两个表,它们肯定是有关联关系的啊,但还是正常先根据id查询一个表,查出来数据之后根据这个表关联应一个表的id去查另一张表,查出另一张表结果后再赋值到实体对象中的另一个对象里,虽然这种操作也是普遍的,但是会造成很多冗余代码,而且后期不好维护,你不如直接联表操作,然后将结果映射到里面。
省略了get、set和toString()方法 自己自行加上就好了
至于数据库字段名称我这写的都是对应的,没有改变,数据大家也可以自己加上
/**
* 用户实体
*/
public class User {
private int id;
/**
* 用户名称
*/
private String username;
/**
* 密码
*/
private String userpwd;
/**
* 手机号
*/
private String phone;
/**
* 用户头像
*/
private String head_img;
/**
* 用户创建时间
*/
private Date usercreate_time;
}
/**
* 订单实体
*/
public class VideoOrder {
private int id;
/**
* 订单流水号
*/
private String out_trade_no;
/**
* 订单状态(1支付-0未支付)
*/
private int state;
/**
* 订单创建时间
*/
private Date create_time;
/**
* 订单金额
*/
private int total_fee;
/**
* 视频主键id
*/
private int video_id;
/**
* 标题字段冗余
*/
private String video_title;
/**
* 图片字段冗余
*/
private String video_img;
/**
* 用户主键id
*/
private int user_id;
/**
* 用户实体
*/
private User user;
}
public interface VideoOrderMapper {
/**
* 查询全部订单关联用户信息
* @return
*/
List queryVideoOrderList();
}
不要忘记之前的mybatis-config.xml配置,不然映射不到对应的dao层。不懂得可以看我之前的博文
注意:两表之间映射字段不要有相同名称。要么就起别名 不然映射可能出问题
这里直接使用main函数测试,并没有做service层之类的操作
public class SqlSessionDemo {
public static void main(String [] args) throws IOException {
String resouce = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resouce);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession sqlSession = sqlSessionFactory.openSession()){
VideoOrderMapper videoOrderMapper = sqlSession.getMapper(VideoOrderMapper.class);
//一对一订单查询 包含用户信息
List videoOrderList = videoOrderMapper.queryVideoOrderList();
System.out.println(videoOrderList);
}
}
}
断点调试给大家看一下结果
可以看到一条订单信息,对应一条用户信息
collection:一对多查询结果映射,诸多app中,你的订单里肯定是有多个订单的,也就是一个用户对应多个订单的关系
/**
* 用户实体
*/
public class User {
private int id;
/**
* 用户名称
*/
private String username;
/**
* 密码
*/
private String userpwd;
/**
* 手机号
*/
private String phone;
/**
* 用户头像
*/
private String head_img;
/**
* 用户创建时间
*/
private Date usercreate_time;
/**
* 订单集合实体对象
*/
private List videoOrderList;
}
public interface UserMapper {
/**
* 查询所有用户信息以及包含所有订单
* @return
*/
List queryOrderUser();
}
一定要注意映射的id 我采用了起别名的方式
和上面一对一测试同样,这里直接上调试结果
以上的两个例子是解释association和collecion最好的例子