思想:设每个员工对应一个部门,而我将员工查询出来要带出相应的部门信息
我的emp表:
我的dept表:
设我有一个部门表的实体类:
Dept.java
public class Dept {
private int deptNo;
private String dname;
private List<Emp> emp;
public int getDeptNo() {
return deptNo;
}
public void setDeptNo(int deptNo) {
this.deptNo = deptNo;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public List<Emp> getEmp() {
return emp;
}
public void setEmp(List<Emp> emp) {
this.emp = emp;
}
@Override
public String toString() {
return "Dept [deptNo=" + deptNo + ", dname=" + dname + ", emp=" + emp + "]";
}
}
部门对应的接口类:
public interface deptMapper {
public Dept queryDept(int deptNo);
}
员工对应的接口类
public interface EmpMapper {
}
员工的实体类:
Emp.java
public class Emp {
private int empno;
private String ename;
private String myJob;
private Dept dept;
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public String getMyJob() {
return myJob;
}
public void setMyJob(String myJob) {
this.myJob = myJob;
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", myJob=" + myJob + ", dept=" + dept + "]";
}
}
mybatis的confing.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 打印出运行日志 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!-- 设置一段路径的别名,可以在映射的xml文件中使用 -->
<typeAliases>
<typeAlias type="com.pk.resultMap.Emp" alias="emps" />
</typeAliases>
<!-- 这里是资源文件路径 -->
<properties resource="jdbc.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbcDriver}" />
<property name="url" value="${jdbcUrl}" />
<property name="username" value="${jdbcUsername}" />
<property name="password" value="${jdbcPassword}" />
</dataSource>
</environment>
</environments>
<!-- 路径需要自己设 -->
<mappers>
<mapper resource="com/pk/resultMap/empMapping.xml" />
</mappers>
</configuration>
部门表dept的映射文件:deptMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pk.resultMap.deptMapper">
<!-- autoMapping属性设置是否启动自动映射功能 -->
<resultMap type="com.pk.resultMap.Dept" id="depts" autoMapping="true">
<!-- 将主键的值映射到实体类中的字段 -->
<result column="deptNo" property="deptNo" />
<!-- collection标签:往这个标签定义的 ‘类’ 的 list 属性中设置值, 如何设置值? 还要根据其 select="selectAuthority" , 把值查询出来。 -->
<!--
property:实体类中的字段
javaType:返回的类型,list
select:调用方法
column:往方法里面传参
-->
<collection property="emp" javaType="list"
select="com.pk.resultMap.EmpMapper.queryByDeptNo" column="deptNo" />
</resultMap>
<!-- 一对多:当我查询一个部门的时候带出多个员工 -->
<select id="queryDept" parameterType="int" resultMap="depts">
select *
from dept where deptNo = #{0}
</select>
</mapper>
员工表emp的映射文件:empMapping.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pk.resultMap.EmpMapper">
<!-- 一对多 -->
<select id="queryByDeptNo" resultType="com.pk.resultMap.Emp">
select e.* from emp e
where e.deptNo = #{0}
</select>
</mapper>
测试:
package com.pk.resultMap;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
/**
* mybatis的终极思想:1.为了解决sql语句硬编码的问题(约定大于配置) 2.解决面向对象设计问题(面向接口编程)
* 每个对象对应一个xml文件(映射文件 MAPPING) 设:emp表 emp.xml dept表 dept.xml
*
* @author
*
* 2018年11月10日上午9:06:27
*/
public class TestMybatis {
// 获取SqlSession对象
public static SqlSession getSession() {
String resource = "config.xml";
InputStream resourceAsStream = TestMybatis.class.getResourceAsStream(resource);
// session工厂 负责产生会话
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 会话就是打开了和数据库的链接
SqlSession openSession = sqlSessionFactory.openSession();
return openSession;
}
@Test
public void test4() {
// 一对一多 查询部门带出员工
SqlSession session = getSession();
deptMapper mapper = session.getMapper(deptMapper.class);
Dept queryDept = mapper.queryDept(1);
System.out.println(queryDept);
}
}