多表查询即是查询返回结果时它无法自动的对上号,咱就手动的给它封一个Map,手动的人为让数据映射。
以下两张表用于举例
orders表:
users表:
example:一对一查询 一个订单对应一个用户
private int id;
private Date ordertime;
private double total;
// 注意 此处没有直接使用外键 private int uid
// 功能实现上来讲 没问题 但java讲究的是面向对象 uid此处为连接另一个表的外键
// 表与表的关系是通过主外键达成的
// 实体与实体的关系是通过实体的引用去达成的
// 面向对象的思想 通过实体去引用
// 当前订单属于哪一个用户
private User user;
SELECT *,o.id oid,u.id uid FROM orders o,USER u WHERe o.uid=u.id
此处是让order表与user表进行连表查询。第二种方法:
example:一对多查询 一个用户对应多个订单
private int id;
private String username;
private String password;
// 描述的是当前用于存在哪些订单
private List orderList;
public List getOrderList() {
return orderList;
}
public void setOrderList(List orderList) {
this.orderList = orderList;
}
example: 多对多查询(三张表),引入一张中间表
example:
在当前user表中引入集合
//当前用户具备哪些角色
private List roleList;
public List getRoleList() {
return roleList;
}
public void setRoleList(List roleList) {
this.roleList = roleList;
}
对xml文件进行编写:
知识小结:
- 一对一配置:(或者+association标签)一对多配置:+多对多配置:+
@Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询
@Result:实现结果集封装 @Results:可以与@Result一起使用,封装多个结果集
@One:实现一对一结果集封装 @Many:实现一对多结果集封装
example:
public interface UserMapper {
@Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
public void save(User user);
@Update("update user set username=#{username},password=#{password} where id=#{id}")
public void update(User user);
@Delete("delete from user where id=#{id}")
public void delete(int id);
@Select("select * from user where id = #{id}")
public User findById(int id);
@Select("select * from user")
public List findAll();
}
使用注解开发,就不需要接口的映射文件,也不需要去加载映射文件。但是仍需要在mybatis核心配置文件中去加载映射关系,例如:
1.2MyBatis的注解实现复杂映射开发
使用@Results @One @Many注解组合完成复杂的关系的配置
example:
一对一:
一个用户对应一个订单
@Select("select * from orders o,user u where o.uid=u.id")
@Results({
@Result(column="oid",property="id"),
@Result(column="ordertime",property="ordertime"),
@Result(column="total",property="total"),
@Result(column="uid",property="user.id"),
@Result(column="username",property="user.username"),
@Result(column="password",property="user.password")
})
public List findAll();
第二种方式:
@Select("select * from orders o,user u where o.uid=u.id")
@Results({
@Result(column="oid",property="id"),
@Result(column="ordertime",property="ordertime"),
@Result(column="total",property="total"),
@Result(
property="user",//要封装的属性名称
column="uid",//根据那个字段去查询user表的数据
javaType = User.class, //要封装的实体类型
// select 属性 代表查询那个接口的方法去获得数据
one = @One(select = "com.lxz.mapper.UserMapper.findById")//嵌套查询 查询中又含一个查询
)
})
public List findAll();
一对多:
一个用户多个订单,即上述user表里面一条数据对应order表中多条数据。
private int id;
private String username;
private String password;
private Date birthday;
// 描述的是当前用户具有的订单
private List orderList;
@Select("select * from orders where uid=#{uid}")
public List findByUid(int uid);
@Select("select * from user")
@Results({
@Result(id=true,column="id",property="id"),
@Result(column="username",property="username"),
@Result(column="password",property="password"),
@Result(
property = "orderList",
column = "id",
javaType = List.class,
many = @Many(select = "com.lxz.mapper.OrderMapper.findByUid") //嵌套查询
)
})
public List findUserAndOrderAll();
多对多:
一个用户有多个角色,一个角色可以被多个用户所用。
查询需求:查询用户的时候同时查出该用户的多种角色。
user表:
sys_user_role表:
sys_role表:
SELECT * FROM USER" SELECt * FROM sys_user_role ur,sys_role r WHERe ur.roleId=r.id AND ur.userId=上一句sql结果的id的值
private int id;
private String username;
private String password;
private Date birthday;
//当前用户具备哪些角色
private List roleList;
@Select("SELECT * FROM sys_user_role ur,sys_role r WHERe ur.roleId=r.id AND ur.userId=#{uid}")
public List findByUid(int uid);
@Select("SELECT * FROM USER")
@Results({
@Result(id=true,column="id",property="id"),
@Result(column = "username",property="username"),
@Result(column = "password",property="password"),
@Result(
property = "roleList",
column = "id",
javaType = List.class,
many = @Many(select="com.lxz.mapper.RoleMapper.findByUid")
)
})
public List findUserAndRoleAll();
总结:利用三天时间复习了之前学过的MyBatis
!还是孔子那句话,温故而知新。所以兄弟们,冲冲冲!



