mybatis一对多查询(多个条件查询多值)

本文介绍使用MyBatis实现一对多查询的方法,通过具体示例讲解如何查询用户及其特定类型的手机信息。涉及数据库设计、实体类定义及映射文件配置。

    对于一对多查询,网上书上的例子大多都是传入一个条件的,比如有两个表,一个用户表,一个手机表,一个用户可以有多个手机,我们就可以在用户的实体类

中放一个手机的list,用一对多查询,就可以查询一个用户的所有手机信息,但是呢,如果手机有各种类型,如果查询用户特定类型的手机呢?这个时候就需要传入

两个参数了,如何解决呢?

看下面一个例子(对这个一对多查询我是有疑惑的,因为这看起来更是一个普通查询,应该是mybatis底层能进行很好的封装吧)

数据库:

Person表

mysql> desc person;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(55) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

Phone表:

mysql> desc phone;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| name       | varchar(55) | YES  |     | NULL    |                |
| phone_type | varchar(55) | YES  |     | NULL    |                |
| person_id  | int(11)     | YES  | MUL | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

实体类:

public class Person {
private int id;
private String name;
private List<Phone> phones=new ArrayList<>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Phone> getPhones() {
return phones;
}
public void setPhones(List<Phone> phones) {
this.phones = phones;
}
public String toString(){
return "["+name+","+phones+"]";
}

}

public class Phone {
private int id;
private String name;
private String phone_type;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone_type() {
return phone_type;
}
public void setPhone_type(String phone_type) {
this.phone_type = phone_type;
}
public String toString(){
return "["+name+","+phone_type+"]";
}
}

配置文件:

<mapper namespace="org.fkit.mapper.PersonMapper">
<resultMap type="org.fkit.domain.Person" id="personBean">
<id column="personid" property="id"/>
<result column="personname" property="name"/>
<collection property="phones" ofType="org.fkit.domain.Phone">
<id column="phoneid" property="id"/>
<result column="phonename" property="name"/>
<result column="phone_type" property="phone_type"/>
</collection>
</resultMap>
<select id="selectPersonById" parameterType="hashmap" resultMap="personBean">
select p.id as personid,p.name as personname,o.id as phoneid,
o.name as phonename,phone_type from person p, phone o where p.id=o.person_id
and o.phone_type=#{phone_type}  and p.id in(1,2);
</select>
</mapper>

测试:

public class ToManyTest {


public static void main(String[] args) {
// TODO Auto-generated method stub
SqlSession session=FKSqlSessionFactory.getSqlSession();
PersonMapper mapper=session.getMapper(PersonMapper.class);
Map<String, Object> map=new HashMap<>();
map.put("phone_type", "mi");
List<Person> persons=mapper.selectPersonById(map);
System.out.println(persons);
}


}


效果:

[[tom,[[mi6,mi], [mi4,mi], [Redmi,mi]]], [jack,[[RedMi,mi], [RedMi3,mi], [RedMi4,mi]]]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值