(一)一对一查询
需求:查询两张表一对一关联查询结果
方案一:
步骤:
(1)实体类
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
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 getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
(2)mapper.xml
<!-- id : resultMap 唯一标识
type : 将查询出数据放入指定对象中
注意:手动映射 需要指定数据库中表的字段名 与 java pojo类中属性名的对应关系
-->
<resultMap type ="cn.itheima.pojo.Orders" id="orderAndUserResultMap">
<!-- id:指定主键字段对应关系
column:列,数据库中对应的名称
property:java pojo类中属性名-->
<id column = "id" property = "id"/>
<!-- 指定非主键字段的对应关系 -->
<result column = "user_id" property = "userId"/>
<result column = "number" property = "number"/>
<result column = "createtime" property = "createtime"/>
<result column = "note" property = "note"/>
<!-- 指定单个对象的对应关系
property:指定将数据放入Orders的user属性中
javaType:user属性的类型
-->
<association property ="user" javaType = "cn.itheima.pojo.User">
<id column = "uid" property = "id"/>
<result column = "username" property = "username"/>
<result column = "birthday" property = "birthday"/>
<result column = "sex" property = "sex"/>
<result column = "address" property = "address"/>
</association>
</resultMap>
<select id = "findOrdersAndUser2" resultMap= "orderAndUserResultMap">
SELECT a.*,b.id uid,username,birthday,sex,address FROM orders a,USER b
WHERE a.user_id = b.id
</select>
(3)mapper.java
public interface UserMapper {
public User findUserById(Integer id);
//动态代理形势中,如果返回结果集问List,那么mybatis会在生成实现类的使用会自动调用selectList方法
public List<Orders> findOrdersAndUser2();
}
(4)mappertest.java
public class UserMapperTest {
private SqlSessionFactory factory;
//作用:在测试方法前执行这个方法
@Before
public void setUp() throws Exception{
String resource = "SqlMapConfig.xml";
//通过流将核心配置文件读取进来
InputStream inputStream = Resources.getResourceAsStream(resource);
//通过核心配置文件输入流来创建会话工厂
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testfindOrdersAndUser2() throws Exception{
SqlSession openSession = factory.openSession();
//通过getMapper方法来实例化接口
UserMapper mapper = openSession.getMapper(UserMapper.class);
List<Orders> list = mapper.findOrdersAndUser2();
System.out.println("list====="+list);
}
}
方案二:
一种继承的方式 将两个实体类放在一起,但是java是单继承,作用有限
步骤:
(1)实体类
public class CustomerOrders extends Orders{
private int uid;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
(2)mapper.xml
<select id = "findOrdersAndUser1" resultType = "cn.itheima.pojo.CustomerOrders">
SELECT a.*,b.id uid,username,birthday,sex,address FROM orders a,USER b
WHERE a.user_id = b.id
</select>
(3)mapper.java
public List<CustomerOrders> findOrdersAndUser1();
(4)mappertest.java
@Test
public void testfindOrdersAndUser1() throws Exception{
SqlSession openSession = factory.openSession();
//通过getMapper方法来实例化接口
UserMapper mapper = openSession.getMapper(UserMapper.class);
List<CustomerOrders> list = mapper.findOrdersAndUser1();
System.out.println("list====="+list);
}
(二)一对多查询
(1)实体类
public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
private List<Orders> orderList;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
public List<Orders> getOrderList() {
return orderList;
}
public void setOrderList(List<Orders> orderList) {
this.orderList = orderList;
}
}
(2)mapper.xml
<!-- 一对多 -->
<resultMap type = "cn.itheima.pojo.User" id = "userAndOrdersResultMap" >
<id column = "id" property = "id"/>
<result column = "username" property = "username"/>
<result column = "birthday" property = "birthday"/>
<result column = "sex" property = "sex"/>
<result column = "address" property = "address"/>
<!-- 指定对象集合关系映射
property:将数据放入User对象orderList中
ofType :指定集合对象的泛型
-->
<collection property = "orderList" ofType = "cn.itheima.pojo.Orders">
<id column = "oid" property = "id"/>
<result column = "user_id" property = "userId"/>
<result column = "number" property = "number"/>
<result column = "createtime" property = "createtime"/>
</collection>
</resultMap>
<select id="findUserAndOrders" resultMap = "userAndOrdersResultMap" >
SELECT a.*,b.id oid,user_id,number,createtime FROM USER a,orders b WHERE a.id = b.user_id
</select>
(3)mapper.java
public List<User> findUserAndOrders();
(4)testmapper.java
@Testpublic void testFindUserAndOrders() throws Exception{
SqlSession openSession = factory.openSession();
//通过getMapper方法来实例化接口
UserMapper mapper = openSession.getMapper(UserMapper.class);
List<User> list = mapper.findUserAndOrders();
System.out.println("list====="+list);
}