一对一
的查询(<assocation>
)User
类(用户类)public class User implements Serializable {
private static final long serialVersionUID = 6716332190979093860L;
private Integer id;
private String username;
private String password;
private Integer age;
private Department department; //Department对象
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result
+ ((department == null) ? 0 : department.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
result = prime * result
+ ((username == null) ? 0 : username.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (department == null) {
if (other.department != null)
return false;
} else if (!department.equals(other.department))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (username == null) {
if (other.username != null)
return false;
} else if (!username.equals(other.username))
return false;
return true;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + ", age=" + age + ", department=" + department
+ "]";
}
}
Department
类(部门类)public class Department {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Department other = (Department) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Department [id=" + id + ", name=" + name + "]";
}
}
一个用户只能属于一个部门
,因此这里在User
类中只是使用了Department
对象,而不是个集合
sql
语句为:select * from user u left join department d on u.department_id=d.id;
。但是我们在mybaits中如果使用这条语句查询,那么返回的结果类型是什么呢?如果是User
类型的,那么查询结果返回的还有Department
类型的数据,那么肯定会对应不上的。resultMap
解决对应问题resultMap
解决查询结果的对应问题
resultMap
将每一个字段和查询结果返回的字段对应上,否则此时的结果就为null
<!-- 定义resultMap -->
<resultMap type="cn.tedu.spring.entity.User" id="UserDepartment">
<!-- 配置id的对应 -->
<id column="id" property="id"/>
<!-- 配置其他字段的对应关系
column: 查询结果中的列名字,如果没有起别名,那么就是表中的字段名
property: java类中的属性名称
-->
<result column="password" property="password"/>
<result column="age" property="age"/>
<result column="username" property="username"/>
<!-- 配置对1的数据类型,即User类中的Department对象是单一的具体类型
property: 这个是在User类中的字段名称
javaType: 这个是java类的全名,是Department类的全名
-->
<association property="department" javaType="cn.tedu.spring.entity.Department">
<id column="id" property="id"/>
<result column="name" property="name"/>
</association>
</resultMap>
<!--
User findUserAndDepartment();
resultMap: 指定上面resultMap的id的值
-->
<select id="findUserAndDepartment" resultMap="UserDepartment">
select * from user u left join department d on u.department_id=d.id
</select>
@Test
public void testFindUserAndDepartment() {
//加载Spring的配置文件
AbstractApplicationContext ac
= new ClassPathXmlApplicationContext(
"spring-mvc.xml",
"spring-dao.xml");
//获取UserMapper的bean,这个是spring通过扫描mapper.xml文件自动为mybatis自动创建的,首字母小写
UserMapper userMapper
= ac.getBean(
"userMapper", UserMapper.class);
List<User> users=userMapper.findUserAndDepartment();
for (User user : users) {
System.out.println(user);
}
ac.close();
}
一对多
的查询(<collection>
)一对多
查询Student
类public class Student implements Serializable {
private static final long serialVersionUID = 8673238196042278929L;
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
Dormitory
类
Set<Student>
集合用来存储学生对象public class Dormitory implements Serializable{
private static final long serialVersionUID = 1359749532219773083L;
private Integer id;
private String number; //编号
private Set<Student> students; //学生集合,一个宿舍可以住多个学生
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((number == null) ? 0 : number.hashCode());
result = prime * result
+ ((students == null) ? 0 : students.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dormitory other = (Dormitory) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (number == null) {
if (other.number != null)
return false;
} else if (!number.equals(other.number))
return false;
if (students == null) {
if (other.students != null)
return false;
} else if (!students.equals(other.students))
return false;
return true;
}
@Override
public String toString() {
return "Dormitory [id=" + id + ", number=" + number + ", students="
+ students + "]";
}
}
create table student(id int primary key auto_increment,name varchar(10) not null unique,age int,dormitory_id int);
create table dormitory(id int primary key auto_increment,number varchar(20) not null unique);
public interface DormitoryMapper {
//查询所有的宿舍信息
List<Dormitory> findDormitories();
//根据id查询宿舍信息
Dormitory findDormitory(Integer id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<!-- MyBatis的接口映射文件,根节点是mapper -->
<!-- 接口映射文件是与Java接口文件(interface)相对应的 -->
<!-- 根节点的namespace属性用于指定Java接口文件 -->
<mapper namespace="cn.tedu.spring.mapper.DormitoryMapper">
<!-- 定义resultMap
-->
<resultMap type="cn.tedu.spring.entity.Dormitory" id="DormitoryStudentRs">
<id column="id" property="id"/>
<result column="number" property="number"/>
<!-- 因为Dormitoy中的Student使用set集合存储的,因此这里使用collection标签
property : Java类中的集合对象
ofType: 集合对象的泛型类型
-->
<collection property="students" ofType="cn.tedu.spring.entity.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</collection>
</resultMap>
<!-- List<Dormitory> findDormitories();
查询所有的宿舍信息
resultMap: 指定前面定义的resultMap
-->
<select id="findDormitories" resultMap="DormitoryStudentRs">
select * from student s left join dormitory d on s.dormitory_id=d.id
</select>
<!--
Dormitory findDormitory(Integer id);
-->
<select id="findDormitory" resultType="cn.tedu.spring.entity.Dormitory">
select * from dormitory where id=#{id}
</select>
</mapper>
spring
配置文件中添加DormitoryMapper.xml
文件 <!-- 配置SqlSessionFactoryBean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据源:如何连接数据库等 -->
<property name="dataSource"
ref="dataSource" />
<!-- 配置XML文件的位置,其中的值是一个数组 -->
<property name="mapperLocations">
<array>
<value>classpath:mappers/UserMapper.xml</value>
<value>classpath:mappers/DormitoryMapper.xml</value>
</array>
</property>
</bean>
@Test
public void testFindDormitory() {
//加载Spring的配置文件
AbstractApplicationContext ac
= new ClassPathXmlApplicationContext(
"spring-mvc.xml",
"spring-dao.xml");
//获取DormitoryMapper对象
DormitoryMapper dormitoryMapper=ac.getBean("dormitoryMapper",DormitoryMapper.class);
//执行查询方法
List<Dormitory> dormitories=dormitoryMapper.findDormitories();
for (Dormitory dormitory : dormitories) {
System.out.println(dormitory);
}
ac.close();
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。