MyBatis —— Learn(三)关联查询

(一)一对一查询

需求:查询两张表一对一关联查询结果

方案一:

步骤:

(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:列,数据库中对应的名称

     propertyjava 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:指定将数据放入Ordersuser属性中

 javaTypeuser属性的类型

 -->

 <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

@Test
public 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);
}

猜你喜欢

转载自blog.csdn.net/qq_29153851/article/details/79330390
今日推荐