MyBatis多表操作
多表查询即是查询返回结果时它无法自动的对上号,咱就手动的给它封一个Map,手动的人为让数据映射。
以下两张表用于举例
orders表:
users表:
example:一对一查询 一个订单对应一个用户
private int id;
private Date ordertime;
private double total;
// 注意 此处没有直接使用外键 private int uid
// 功能实现上来讲 没问题 但java讲究的是面向对象 uid此处为连接另一个表的外键
// 表与表的关系是通过主外键达成的
// 实体与实体的关系是通过实体的引用去达成的
// 面向对象的思想 通过实体去引用
// 当前订单属于哪一个用户
private User user;
<!-- 此处的type 表示封装的是谁的对象数据 此处封装order实体的
对象数据,故type为order-->
<resultMap id="orderMap" type="order">
<!-- 手动指定字段与实体属性的映射关系
column:数据表的字段名称
property:实体的属性名称
-->
<!-- 此处property的属性是order的属性
查询的结果为order的id
-->
<id column="oid" property="id"></id>
<!-- zhu键id的标签为id ,其他普通属性的标签为result-->
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
<result column="uid" property="user.id"></result>
<result column="username" property="user.username"></result>
<result column="password" property="user.password"></result>
<result column="birthday" property="user.birthday"></result>
</resultMap>
<select id="findAll" resultMap="orderMap">
SELECT *,o.id oid,u.id uid FROM orders o,USER u WHERE o.uid=u.id
</select>
此处是让order表与user表进行连表查询。第二种方法:
<resultMap id="orderMap" type="order">
<!-- 手动指定字段与实体属性的映射关系
column:数据表的字段名称
property:实体的属性名称
-->
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
<result column="uid" property="user.id"></result>
<!--
property:当前实体(order)中的属性名称(private User user)
javaType:当前实体(order)中的属性的类型(User)
下处association 中的property中的user 为order实体中的属性
-->
<association property="user" javaType="user">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
</association>
</resultMap>
example:一对多查询 一个用户对应多个订单
private int id;
private String username;
private String password;
// 描述的是当前用于存在哪些订单
private List<Order> orderList;
public List<Order> getOrderList() {
return orderList;
}
public void setOrderList(List<Order> orderList) {
this.orderList = orderList;
}
<resultMap id="userMap" type="user">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<!-- 配置集合信息
property:集合的名称
ofType:当前集合中的数据类型
-->
<collection property="orderList" ofType="order">
<!-- 封装order的数据-->
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="userMap">
SELECT *,o.id oid FROM USER u,orders o WHERE u.id=o.uid
</select>
example: 多对多查询(三张表),引入一张中间表
example:
在当前user表中引入集合
//当前用户具备哪些角色
private List<Role> roleList;
public List<Role> getRoleList() {
return roleList;
}
public void setRoleList(List<Role> roleList) {
this.roleList = roleList;
}
对xml文件进行编写:
<resultMap id="userRoleMap" type="user">
<id column="userId" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<!-- user的信息-->
<collection property="roleList" ofType="role">
<id column="roleId" property="id"></id>
<result column="roleName" property="roleName"></result>
<result column="roleDesc" property="roleDesc"></result>
</collection>
<!-- user内部的roleList信息-->
</resultMap>
<select id="findUserAndRoleAll" resultMap="userRoleMap">
SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userId AND ur.roleId=r.id
</select>
知识小结:
- 一对一配置:(或者+association标签)
- 一对多配置:+
- 多对多配置:+
MyBatis注解开发
1.1MyBatis的常用注解
@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<User> findAll();
}
使用注解开发,就不需要接口的映射文件,也不需要去加载映射文件。但是仍需要在mybatis核心配置文件中去加载映射关系,例如:
<!-- 加载映射关系 -->
<mappers>
<!-- 指定接口所在的包-->
<package name="com.lxz.mapper"></package>
</mappers>
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<Order> 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<Order> findAll();
一对多:
一个用户多个订单,即上述user表里面一条数据对应order表中多条数据。
private int id;
private String username;
private String password;
private Date birthday;
// 描述的是当前用户具有的订单
private List<Order> orderList;
@Select("select * from orders where uid=#{uid}")
public List<Order> 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<User> 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<Role> roleList;
@Select("SELECT * FROM sys_user_role ur,sys_role r WHERE ur.roleId=r.id AND ur.userId=#{uid}")
public List<Role> 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<User> findUserAndRoleAll();
总结:利用三天时间复习了之前学过的MyBatis
!还是孔子那句话,温故而知新。所以兄弟们,冲冲冲!