目录
- 1、实体
- 2、一对一
- 3、一对多
- 4、多对多
- 5、测试
核心:
一对一,注解:@Select @Results @Result @One
一对多 & 多对多,@One改为@Many共同的操作:查询多表时,先查一个表,
把这个实体属性作为查询条件。
然后引用用接口中的方法,查询。
从用户,订单之间说一对一,和多对一的关系
从用户,用户角色,以及两者关系的表,来说多对多
^_^ 多表操作查询 一对一
😀一对多,多对多查询
1、实体
/*** 用户订单表 一对一* 一个订单对应一个用户...* @author echo lovely* @date 2020/9/13 10:26*/
public class Order {private Integer orderId;private Timestamp orderTime;private Double orderMoney;// 当前订单对应的用户..private User user;
}
/*** 多对多关系测试* @author echo lovely* @date 2020/9/13 16:38*/
public class Role {private Integer roleId;private String roleName;}
/*** @author echo lovely* @date 2020/9/11 20:55*/
public class User {private Integer userId;private String userName;private String userPassword;// 一对多 每个用户 有多个订单private List<Order> orderList;// 新增角色表 每个用户有多个角色,每个角色可能对应多个用户private List<Role> roleList;}
2、一对一
查询订单对应的用户
package cn.bitqian.dao;import cn.bitqian.entity.Order;
import cn.bitqian.entity.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 注解 一对一模型*/
public interface OrderMapper {/*@Select("select * from orders, users1 where orders.order_id = users1.userid")@Results({@Result(id = true, property = "orderId", column="order_id"),@Result(property = "orderName", column = "order_name"),@Result(property = "orderMoney", column = "order_money"),@Result(property = "user.userId", column = "userid"),@Result(property = "user.userName", column = "username"),@Result(property = "user.orderPassword", column = "orderpassword")})public List<Order> queryOrder();*/@Select("select * from orders")@Results({@Result(id = true, property = "orderId", column="order_id"),@Result(property = "orderName", column = "order_name"),@Result(property = "orderMoney", column = "order_money"),@Result(property = "user", // 要封装的属性名称column = "order_id", // 根据哪个字段查询user表的数据javaType = User.class, // 要封装的实体类型// select 代表查询对应接口 获得数据one = @One(select="cn.bitqian.dao.UserMapper.queryOneUser"))})List<Order> queryOrder();// 根据uid 查询对应的order@Select("select * from orders where uid = #{uid}")@Results({@Result(id = true, property = "orderId", column = "order_id"),@Result(property = "orderName", column = "order_name"),@Result(property = "orderMoney", column = "order_money")})Order queryOneOrder(int uid);}
3、一对多
查询用户对应的订单
package cn.bitqian.dao;import cn.bitqian.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;public interface UserMapper {@Select("select * from users1")@Results({@Result(property = "userId", column = "userid"),@Result(property = "userName", column = "username"),@Result(property = "userPassword", column="userpassword"),@Result(property = "orderList", // 封装的属性名称为orderListcolumn = "userId",javaType = List.class,// mapper接口中 方法many = @Many(select = "cn.bitqian.dao.OrderMapper.queryOneOrder") // 在OrderMapper里面)})List<User> queryUserAndOrder();// 一对多 (一个用户多个订单)}
4、多对多
查询用户和角色
package cn.bitqian.dao;import cn.bitqian.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;public interface UserMapper {// 用户 & 角色@Select("select * from users1")@Results({@Result(id = true, property = "userId", column = "userId"),@Result(property = "userName", column = "userName"),@Result(property = "userPassword", column = "userPassword"),@Result(property = "roleList", // 要封装的实体属性名称column = "userId",// 根据user id查询role表的数据javaType = List.class, // 要封装的实体类型many = @Many(select = "cn.bitqian.dao.RoleMapper.queryRoleByUserId"))// 查询对应的接口 获取数据})List<User> queryUserAndRole();}
角色接口
package cn.bitqian.dao;import cn.bitqian.entity.Role;
import org.apache.ibatis.annotations.*;import java.util.List;// 角色 & 用户 & 角色关系
public interface RoleMapper {@Select(value = "SELECT r.* FROM user_role ur, role r " +"WHERE ur.role_id = r.role_id " +"AND user_id = #{userId}")@Results({@Result(property = "roleId", column = "role_id"),@Result(property = "roleName", column = "role_name")})List<Role> queryRoleByUserId(int userId);}
5、测试
import cn.bitqian.dao.OrderMapper;
import cn.bitqian.dao.UserMapper;
import cn.bitqian.entity.Order;
import cn.bitqian.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** @author echo lovely* @date 2020/9/13 21:14*/
public class MybatisAnnotationTest {private SqlSession sqlSession;private UserMapper userMapper;@Beforepublic void initSqlSession() {try {InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);sqlSession = sqlSessionFactory.openSession(true);userMapper = sqlSession.getMapper(UserMapper.class);} catch (IOException e) {e.printStackTrace();}}// 一对一测试 注解@Testpublic void oneToOneTest() {OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);List<Order> orderList = orderMapper.queryOrder();for (Order order : orderList) {System.out.println(order);}}// 一对多测试@Testpublic void oneToManyTest() {List<User> userList = userMapper.queryUserAndOrder();for (User user : userList) {System.out.println(user);}}// 多对多测试@Testpublic void manyToMany() {List<User> userAndRoleList = userMapper.queryUserAndRole();for (User userAndRole : userAndRoleList) {System.out.println(userAndRole);}}@Afterpublic void destroySqlSession() {if (sqlSession != null) {sqlSession.close();System.out.println("close session...");}}}