目录
4、在emp这个接口对应的xml,(即在3中定义方法的那个接口)写出相应SQL(最好先看第5不,在返回来看4好点)
5、在接口dept对应的xml中编写SQL查询,此SQL查询不需要在接口中有实现方法
特别注意:一定要把xml和接口相匹配,即一个xml的SQL方法只能对应其命名空间指定的接口,切不可弄混(血与泪的教训)
1、方法一(使用SQL语句连接查询)
ps:这种方式理解起来超级简单(简单),下面直接写例子:
1、数据库中的表(两表的链接关系:dept_id=id)
1、empt表
2、dept表
2、创建实体类
ps:这个实体类要包含两个表中的所有字段信息,这样才能存储查询出来的信息(id为重复字段,写一个即可)
(@Getter @Setter @ToString 分别是用注解实现get、set、tostring方法,需要插件lombok)
package com.test.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class HaveDeptAndEmp {
private int id;
private int jobid;
private int deptid;
private String ename;
private int gender;
private double salary;
private double bonus;
private String joindate;
private int mgr;
private String deptname;
private String loc;
}
3、接口中定义方法
(接口用的是sqlSession代理,自动实现方法,前边以讲过,略)
4、在xml中实现SQL查询
<resultMap id="UseFirst" type="com.test.domain.HaveDeptAndEmp">
<id column="id" property="id"/>
<result column="job_id" property="jobid"/>
<result column="dept_id" property="deptid"/>
<result column="ename" property="ename"/>
<result column="gender" property="gender"/>
<result column="salary" property="salary"/>
<result column="bonus" property="bonus"/>
<result column="join_date" property="joindate"/>
<result column="mgr" property="mgr"/>
<result column="name" property="deptname"/>
</resultMap>
<select id="FirstMethord" resultMap="UseFirst">
SELECT
*
FROM
`emp` e
LEFT JOIN dept d ON e.dept_id = d.id
</select>
注:resultMap是建立的是数据库列名和实体类中的属性名的对应,其实只需要建立两个名字不一样的即可(resultMap不介绍)
下面是SQL语句查询
5、建立测试查询
//使用SQL语句实现一对一查询
@Test
public void ccc(){
List<HaveDeptAndEmp> list=mapper.FirstMethord();
for (HaveDeptAndEmp o:list
) {
System.out.println(o);
}
}
6、查询结果
此处截取部分
2、方法二(在xml中建立映射查询)
1、数据库中的表
表仍然为上述两个表
2、建立实体类
1、建立表dept对应的实体类
package com.test.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class dept {
private int id;
private String name;
private String loc;
}
2、建立表empt对应的实体类
注:此处加入了类dept的复合,(下述代码可看出),用以存储查询出来的dept信息
package com.test.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class TestEmpt {
private int id;
private int jobid;
private int deptid;
private String ename;
private int gender;
private double salary;
private double bonus;
private String joindate;
private int mgr;
private dept dept;
@Override
public String toString() {
return "TestEmpt{" +
"id=" + id +
", jobid=" + jobid +
", deptid=" + deptid +
", ename='" + ename + '\'' +
", gender=" + gender +
", salary=" + salary +
", bonus=" + bonus +
", joindate='" + joindate + '\'' +
", mgr=" + mgr +
", dept=" + dept +
'}';
}
}
3、在接口中定义方法
4、在emp这个接口对应的xml,(即在3中定义方法的那个接口)写出相应SQL(最好先看第5不,在返回来看4好点)
<resultMap id="EmpUseresultmap" type="com.test.domain.TestEmpt">
<id column="id" property="id"/>
<result column="job_id" property="jobid"/>
<result column="dept_id" property="deptid"/>
<result column="ename" property="ename"/>
<result column="gender" property="gender"/>
<result column="salary" property="salary"/>
<result column="bonus" property="bonus"/>
<result column="join_date" property="joindate"/>
<result column="mgr" property="mgr"/>
<association property="dept" select="com.test.dao.dept.findgetbyid"
column="dept_id" javaType="com.test.domain.dept">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="loc" property="loc"/>
</association>
</resultMap>
<select id="selcetempAndDept" resultMap="EmpUseresultmap" >
select * from emp
</select>
注:resultMap中的字段不解释,其中的association这个字段中,property这个是TestEmpt中的一个属性,就是那个复合,存dept值的那个
select中存的是五中的查询方法:方式是(命名空间.id),字段解析com.test.dao.dept是五中的xml的命名空间,findgetbyid是五中select的自己命名的id名
column是要传入的字段,如果传入多个字段应该是这种形式column="{dept_id=id,ename=name}"
javaType是dept的类型,此处为一个类的对象
后面是一些字段的映射
最下面是SQL语句的执行
5、在接口dept对应的xml中编写SQL查询,此SQL查询不需要在接口中有实现方法
<select id="findgetbyid" resultType="com.test.domain.dept">
select * from dept
where id=#{id}
</select>
注:id=“findgetbyid”是一个自己起的名字,唯一标识,resultType为返回值类型,是一个对象。SQL语句中#{id}是四中所传递
6、写测试方法
//查询关联信息
@Test
public void selcetEmpAndDept() {
List<TestEmpt> list = mapper.selcetempAndDept();
for (TestEmpt o : list) {
System.out.println(o);
}
}
7、结果(截取部分)
注:控制台打印的是 属性名=值 的方式,可以看到最后一个复合类对象存的是dept的信息