Mybatis的简单联合查询操作:

实体类:

Employee:

package com.test.mybatis;

public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
private Depart depart; public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Depart getDepart() {
return depart;
}
public void setDepart(Depart depart) {
this.depart = depart;
}
@Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", email="
+ email + ", gender=" + gender + ", depart=" + depart + "]";
} }

Depart:

package com.test.mybatis;

public class Depart {
private int id;
private String departName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDepartName() {
return departName;
}
public void setDepartName(String departName) {
this.departName = departName;
}
@Override
public String toString() {
return "Depart [id=" + id + ", departName=" + departName + "]";
} }

mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到 mybatis-config.xml中-->
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
</configuration>

EmployeeMapper接口:

package com.test.mybatis.dao;

import com.test.mybatis.Employee;

public interface EmployeeMapper {

    public Employee getEmpAndDept(Integer id);
}

EmployeeMapper.xml:

对接口进行实现;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mtbatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.mybatis.dao.EmployeeMapper">
<!--
     方法一:
联合查询:级联属性封装结果集
-->
<resultMap type="com.test.mybatis.Employee" id="MyEmp">
<!--
指定主键列的封装规则
id定义主键会底层优化
column:指定哪一列
property:指定对应的JavaBean
-->
<id column="id" property="id"/>
<!-- 普通列封装 -->
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<result column="did" property="depart.id"/>
<result column="dept_name" property="depart.departName"/>
</resultMap>
<!--
    方法二:
使用association定义单个对象的封装规则
-->
<resultMap type="com.test.mybatis.Employee" id="MyEmp2">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<!--
association可以指定联合的Javabean对象
property:指定那个属性是联合的对象
JavaType:指定这个属性对象的类型(不能省略)
-->
<association property="depart" javaType="com.test.mybatis.Depart">
<id column="did" property="id"/>
<id column="dept_name" property="departName"/>
</association>
</resultMap>
<!--
查询Employee的同时查询员工对应的部门
-->
<select id="getEmpAndDept" resultMap="MyEmp2">
SELECT e.id id,e.last_name last_name,e.email email,e.gender gender,d.id did,d.dept_name dept_name
from
tbl_depat d,tbl_employee e
where d.id=e.d_id AND e.id=#{id}
</select>
</mapper>

测试类:

package com.test.mybatis.test;

import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import com.test.mybatis.Employee;
import com.test.mybatis.dao.EmployeeMapper; public class MyBatisTest {
//读取配置文件,得到SQLSessionFactory
public SqlSessionFactory getSqlSessionFactory() throws IOException{
String resource="mybatis-config.xml";
InputStream is=Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(is);
}
@Test
public void test01() throws IOException{
//获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//获取sqlSession
//代表和数据库的一次对话,用完必须关闭,相当于connection,都是非线程安全。每次使用都应该获取新的对象
SqlSession openSession = sqlSessionFactory.openSession();
try{
//获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删查改方法
//mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象
//(将接口和xml进行绑定)
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee emp = mapper.getEmpAndDept(6);
System.out.println(emp+":"+emp.getDepart()); }finally{
openSession.close();
}
} }

Mybatis联合查询(一)的更多相关文章

  1. MyBatis联合查询和使用association 进行分步式查询

    查询Emp的同时,查出emp对应的部门Department 方法1:联合查询,使用级联属性封装结果集 <!-- 联合查询,使用级联属性封装结果集 type:要自定义规则的javaBean类型 i ...

  2. Mybatis 联合查询XML与注解对比

    由于是练习,故只做了感兴趣的一部分测试. 测试类容XML配置转注解方式 实体类为了测试请忽略设计是否合理… User.java @Alias("User")public class ...

  3. mybatis联合查询

    1.有学生实体 @Component @Scope("prototype") public class StudentInfo { private Integer studentI ...

  4. MyBatis联合查询association使用

    1.需求 两张表 channels(频道表)  member(会员表) 频道表里面有会员id,查询频道列表的时候需要关联查询出会员的名称,头像等信息 . 2.channels.xml定义,配置主要在这 ...

  5. Mybatis联合查询记录,左连接参数操作

    公司业务需求要做个列表的排序 而实际排序的字段不再本库中,需要跨库去拿到字段,因为是微服务体系架构,不可能Left join跨库的表,所以决定调用一次跨服务的API拿到排序相关的对象,里面包含需要排序 ...

  6. MyBatis 多表联合查询及优化 以及自定义返回结果集

    下面就来说一下 mybatis 是通过什么来实现多表联合查询的.首先看一下表关系,如图: 这 里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了 ...

  7. MyBatis之三:多表联合查询

    在这篇文章里面主要讲解如何在mybatis里面使用一对一.一对多.多表联合查询(类似视图)操作的例子. 注:阅读本文前请先大概看一下之前两篇文章. 一.表结构 班级表class,学生表student, ...

  8. Mybatis.net与MVC入门配置及联合查询动态SQL拼接和简单事务

    第一次学习Mybatis.net,在博客园也找到好多资料,但是在配置成功之后也遇到了一些问题,尤其是在动态SQl拼接时候,这里把遇到的问题还有自己写的一个Demo贴出来,希望能帮到新手,有不适合的地方 ...

  9. MyBatis 多表联合查询,字段重复的解决方法

    MyBatis 多表联合查询,两张表中字段重复时,在配置文件中,sql语句联合查询时使用字段别名,resultMap中对应的column属性使用相应的别名: <resultMap type=&q ...

随机推荐

  1. Android Json转换类对象,并使用

    长话短说,先上代码(今天的代码是有史以来最短的)(今天的课也是有史以来最精简...) 然后就是介绍Song是啥,上面的网站应该知道,是网易云的,不过为啥会变成这样,因为这是网易云的API网站 反正就是 ...

  2. python4.4模块

    import random                         #import导入,random随机数模块a=random.random()                         ...

  3. PHP入门之数组

    前言 之前几篇文章分别介绍了PHP的运算符,流程控制,函数.有兴趣的可以去看看. PHP入门之类型与运算符 PHP入门之流程控制 PHP入门之函数 接下来简单介绍一下数组. 数组初探 为什么要引进数组 ...

  4. 【av68676164(p41-p42)】内存管理功能

    存储器的功能需求 容量足够大 速度足够快 信息永久保存 多道程序并行 多道程序并行带来的问题 共享:代码和数据共享,节省内存 保护:不允许内存中的程序相互间非法访问 实际存储器体系 三级存储体系 Ca ...

  5. 15、Facade 外观模式

    什么是Facade模式 随着系统越来越复杂,我们需要把细节隐藏起来,给客户端提供一个统一的接口.在这种需求下facade模式诞生了.该模式比较简单,我们只需要在系统变得复杂把它运用上来,这样底层跟客户 ...

  6. PhpStorm配置Apache与php的运行环境详细教程

    本文主要说明如何在phpstorm中配置已经安装好的PHP与apache.首先需要在本地安装php,这里我安装的是phpstudy 进入PHPstorm的界面点击file 下的settings 在La ...

  7. C# BackGroundWorker实现窗体不卡死 进度条功能

    网上的例子少了好多属性的配置,改好了一个能直接用的: using System; using System.Collections.Generic; using System.ComponentMod ...

  8. NLTK库WordNet的使用方法实例

    1.在代码中引入wordnet包 >>>from nltk.corpus import wordnet as wn 2.查询一个词所在的所有词集(synsets) >>& ...

  9. 为什么要写博客(jekyll迁移)

    layout: post title: '为什么要写博客' date: 2019-08-12 author: xiepl1997 tags: 随笔 曾经我写过不少博客,为什么没有坚持下去?不知道. 这 ...

  10. IP-master

    http://www.igotaobao.cn/IP-master/