Mybatis多表联查

pom.xml

<!-- 统一版本管理 -->
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.junit>4.12</project.junit>
		<project.mybatis>3.4.6</project.mybatis>
		<project.jdbc.connector>8.0.11</project.jdbc.connector>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>${project.junit}</scope>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${project.mybatis}</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${project.jdbc.connector}</version>
		</dependency>
	</dependencies>

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>   
          
<!-- 为java类型起别名,在配置文件中就可以使用别名 目的:书写简单方便-->
 <typeAliases>
	<typeAlias type="com.xalo.model.Student" alias="Student"/>
</typeAliases>
	 
<!--调用log4j 打印sql语句 --> 
<settings>
     <setting name="logImpl" value="STDOUT_LOGGING"/>     
</settings> 
      
<!-- 数据库环境配置,一个环境对应一个数据库,将来和spring整合之后,就不在配置-->  
<environments default="development">
  <environment id="development">
    <!-- 事物类型配置	  JDBC:使用JDBC的事物管理 -->
  	<transactionManager type="JDBC"></transactionManager>
  	<!-- 数据源的配置 POOLED:使用mybatis默认的数据源-->
  	<dataSource type="POOLED">
  	    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>          <!-- useSSL=false: 是否使用加密 -->
  	    <property name="url" value="jdbc:mysql://localhost:3306/mb?useUnicode=true&amp;characterEncoding=UTF8&amp;useSSL=false"/>
  	   <property name="username" value="root"/>
  	   <property name="password" value="12345678"/>
  	</dataSource>
   </environment>
</environments>
  		
  		
  		<!-- 映射文件的导入 -->
  		<mappers>
  		  <!-- 1.接口必须和映射文件必须在同一个包下
  		       2.接口名和映射文件名必须一致
  		   -->
  			    <package name="com/xalo/dao"/>   			  
  		</mappers>
  		 		
  </configuration>

  (1)一对多

创建一张老师表(一方)和一张学生表(多方).

<1>老师实体类:

         1.定义变量: 

         2.和学生关联的属性: List<Student> student;

         3.提供无参有参的构造方法,setter和getter方法,重写toString()方法

<2>学生实体类:

         1.定义变量: 

         2.和老师关联的属性: private Teacher teacher;

         3.提供无参有参的构造方法,setter和getter方法,重写toString()方法

<3>在Mysql中建库建表,以及插入数据

(1)建库:

create database if not exists mb character set utf8 collate utf8_general_ci;
   

(2)建表

create table if not exists teacher
   (tid Integer primary key auto_increment,
    tname varchar(20),
    cname varchar(25),
    tphone varchar(11)) charset=utf8;

create table if not exists student
   (sid Integer primary key auto_increment,
    sname varchar(20),
    sage Integer,
    s_t_id Integer,
  constraint student_teacher_foreign foreign key(s_t_id) references teacher(tid)) charset=utf8;

(3) 插入数据

insert into teacher (sname,cname,tphone) values('碧瑶','java',15235233333);

insert into student (cname,cage,s_t_id) values ('张小凡',20,1);

<4>创建接口跟映射文件(xml)

       1.接口必须和映射文件在同一包

        2.接口名和映射文件名最好一致

public interface TeacherDao{
   //查询某个老师信息
  public abstract Teacher queryTeacherById(Integer tid);
   }

public interface StudentDao {
   //查询某个学生信息
	public abstract Student queryStudentById(Integer sId);
}

teacherDao.xml

<!--namespase: 需要写成接口的完成类名 + 包名-->
<mapper namespase="com.xalo.dao.TeacherDao">
   <!--建立多表的关联-->
   <resultMap type="com.xalo.entity.Teacher" id="teacherMap">
       <!--teacher的属性映射文件-->
      <id column="tid", property="tid"/>
      <result column="tname", property="tname"/>
      <result column="cname", property="cname"/>
      <result column="tphone", property="tphone"/>  
   <!--学生表的关联查询设置等同于设置teacher实体中的list集合 
            property:集合属性的名称   ofType: 集合中元素的类型-->
    <collecation property="students" ofType="com.xalo.entity.Student">
        <!--学生实体和查询出来的字段的匹配-->
         <id column="sid" property="sid"/>
         <result column="sname", property="sname"/>
         <result column="sage", property="sage"/>
    </collecation>
   </resultMap>

 <select id="queryTeacherById" parameterType="Integer" resultMap="teacherMap">
       select 
           teacher.*,
           student.sid,
           studnet.sname,
           student.sage
        from
           teacher,
           student
         where 
            teacher.tid=#{arg0}
          and 
             teacher.tid = student.s_t_id;
 </select>
</mapper>

studentDao.xml

<!-- namespase:需要写成接口的完整类名+包名 -->
<mapper namespace="com.xalo.dao.StudentDao">
	<!-- 建立多表的关系 -->
 <resultMap type="com.xalo.entity.Student" id="studentMap">
	    <!-- student的属性映射关系 -->
	  <id column="sid" property="sid" />
	  <result column="sname" property="sname" />
	  <result column="sage" property="sage" />

	<association property="teacher" javaType="com.xalo.entity.Teacher">
		<!--老师实体和查询出来的字段的匹配关系 -->
		<result column="tid" property="tid"/>
		<result column="tname" property="tname" />
		<result column="cname" property="cname" />
		<result column="tphone" property="tphone" />
	</association>
</resultMap>
  <select id="queryStudentById" parameterType="Integer" resultMap="studentMap">
      select 
          teacher.*,
          student.sid,
          student.sname,
          student.sage
       from
          teacher,
          student
       where
           student.sid = #{arg0}
       and
           teacher.tid = student.s_t_id;
   </select>
</mapper>

<5>测试

public class OneToManyTest{
   
  @Before
  public void before() throws Exception {
    private SqlSessionFactory sf;
	private SqlSession session;
    //读取配置文件
   InputStream in = Resources.getResourceAsStream("mybatis_config.xml");
    //加载配置文件并创建session工厂
     sf = new SqlSessionFactoryBuilder().build(inputStream);
    }

  @Test
 public void test() throws Exception {
	//创建session对象
	session = sf.openSession();
	TeacherDao tDao = session.getMapper(TeacherDao.class);
	Teacher teacher = tDao.queryTeacherById(1);			   
	session.commit();
	if (session != null) {
		session.close();
	   }
	System.out.println(teacher);
	} 

  @After
 public void after() throws Exception {

	}
}

(2) 多对多

创建玩家跟英雄表

<1>玩家实体类

       1.定义变量

       2.和英雄相关联的属性  private List<Hero> heros;

       3.提供无参有参方法,setter和getter方法,重写toString()方法

<2>英雄实体类

      1.定义变量

      2.和玩家相关联的属性 private List<Player> players;

      3.提供无参有参方法,setter和getter方法,重写toString()方法

<3>在Mysql中建表,以及插入数据

1.建表

//建玩家表
create table if not exists player 
  (pid Integer key auto_increment,
   pname varchar(20) ) charset=utf8;

//建英雄表
create table if not exists hero
  (hid Integer key auto_increment,
   hname varchar(25) )charset=utf8;

//建立中间表
create table if not exists p_h_rel
 (rid Integer key auto_increment,
  p_f_id Integer,
  h_f_id Integer,
  constraint player_rel_foreign foreign key(p_f_id)references player(pid),
  constraint hero_rel_foreign foreign key(h_f_id) references hero (hid))charset=utf8;

2.插入数据

insert into player (pname) values('张三'),('李四');

insert into hero (hname) values('张小凡'),('碧瑶');

insert into p_h_rel (p_f_id, h_f_id) values (1,1),(1,2),(2,1),(2,2);

<4>创建接口跟映射文件(xml)

       1.接口必须和映射文件在同一包

        2.接口名和映射文件名最好一致

public interface PlayerDao {
   public abstract Player queryPlayerById(Integer pid);
}

public interface HeroDao {
   public abstract Hero queryHeroById(Integer hid);
}

 playerDao.xml

<mapper namespace = "com.xalo.dao.PlayerDao">
 
   <!--建立多表的关系-->
 <resultMap type="com.xalo.entity.Player" id = "playerMap">
     <id column = "pid" property = "pid"/>
     <result column = "pname" property = "pname"/>

   <collection property="heros" ofType="com.xalo.entity.Hero">
      <id column="hid" property="hid" />
      <result column="hname" property="hname" />
   </collection>
 </resultMap>
 
<select id="queryPlayerById" parameterType="Integer" resultMap="playerMap">
      select 
          player.*,
           hero.*
       from
           player,
            hero, 
           p_h_rel
       where
           player.pid = #{arg0}
       and
            player.pid = p_h_rel.p_f_id
       and
           hero.hid = p_h_rel.h_f_id; 
</select>
  
</mapper>

heroDao.xml

<mapper namespace="com.xalo.dao.HeroDao">
  <!-- 建立多表的关系 -->
  <resultMap type="com.xalo.entity.Hero" id="heroMap">
	 <id column="hid" property="hid" />
	 <result column="hname" property="hname" />
	
	<collection property="players" ofType="com.xalo.entity.Player">
		<!-- player实体和查询出来实体的匹配 -->
		<id column="pid" property="pid" />
		<result column="pname" property="pame" />
	</collection>
  </resultMap>
  
 <select id="queryHeroById" parameterType="Integer" resultMap="heroMap">
       select
            player.*,
             hero.*,  
             p_f_id
        from
             player,
              hero,
             p_h_rel
        where 
             hero.pid = #{arg0}
         and 
             player.pid = p_h_rel.p_f_id
         and 
              hero.hid = p_h_rel.h_f_id;
 </select>
</mapper>

<5>测试

public class ManyToManyTest {
	private SqlSessionFactory sf;
	private SqlSession session;

  @Before
  public void before() throws Exception {
	// 读取配置文件
   InputStream inputStream = Resources.getResourceAsStream("mybatis_config.xml");
    // 加载配置文件并创建session工厂
   sf = new SqlSessionFactoryBuilder().build(inputStream);
	} 

   @Test
   public void test() throws Exception {
	// 创建session对象
	session = sf.openSession();
	PlayerDao pDao = session.getMapper(PlayerDao.class);
	Player player = pDao.queryPlayerById(1);
	session.commit();
	if (session != null) {
		session.close();
	   }
     System.out.println(player);
  }
  
  @After
  public void after() throws Exception {

	}
 
 }

(3) 一对一

创建员工跟电脑表

<1>员工实体类

     1.定义变量

     2.和员工相关联的属性 private Computer computer;

     3.提供无参有参的构造方法, setter和getter方法,toString()方法

<2>电脑实体类

    1.定义变量

    2.和电脑相关联的属性 private Employee employee;

    3.提供无参有参的构造方法, setter和getter方法,toString()方法

<3>在Mysql中建表以及插入数据

1.建库

create table if not exists employee 
   (eid Integer primary key auto_increment,
    ename varchar(20) ) charset = utf8;

//在表2中增加一个字段是表1的外键,并且加唯一约束
create table if not exists computer
    (cid integer primary key auto_increment,
     cname varchar(26),
     c_e_id Integer unique,   //建立约束
   constraint computer_employee_foreign foreign key (c_e_id) references employee (eid))charset=utf8;

2.建表

insert into employee (ename) values ("周帅"),("碧瑶");

insert into computer (cname,c_e_id)values("联想",1),("苹果",2);

<4>创建接口跟映射文件(xml)

       1.接口必须和映射文件在同一包

        2.接口名和映射文件名最好一致

  

public interface EmployeeDao {
   public abstract Employee queryEmployeeById(Integer eid);
}


public interface ComputerDao {
     public abstract Computer queryComputerById(Integer cid);
}

employee.xml

 <mapper namespace="com.xalo.dao.EmployeeDao">
   <!-- 建立多表的关联 -->
   <resultMap type="com.xalo.entity.Employee" id="employeeMap">
      <id column="eid" property="eid"/>
      <result column="ename" property="ename"/>

     <association property="computer" javaType="com.xalo.entity.Computer">
        <id column="cid" property="cid"/>
        <result column="cname" property="cname"/>
     </association>
   </resultMap>

  <select id="queryEmployeeById" parameterType="Integer" resultMap="employeeMap">
            select 
                employee.*,
                computer.*
             from 
                employee,
                computer
             where
                employee.eid=#{arg0}
              and
                computer.c_e_id = employee.eid;
   </select>

computer.xml

<mapper namespace="com.xalo.dao.ComputerDao">
  <!-- 建立多表的关联 -->
  <resultMap type="com.xalo.entity.Computer" id="computerMap">
     <id column="cid" property="cid"/>
     <result column="cname" property="cname"/>

   <association property="employee" javaType="com.xalo.entity.Employee">
      <id column="eid" property="eid"/>
      <result column="ename" property="ename"/>
   </association>
 </resultMap>

 <select id="queryComputerById" parameterType="Integer" resultMap="computerMap">
       select 
           employee.*,
           computer.*
       from 
           employee,
           computer
      where
           computer.cid=#{arg0}
       and
          computer.c_e_id = employee.eid;
 </select>
</mapper>

<5>测试

public class OneToOneTest {

	private SqlSessionFactory sf;
	private SqlSession session;
 
  @Before
  public void before() throws Exception {
     // 读取配置文件
	InputStream inputStream = Resources.getResourceAsStream("mybatis_config.xml");
     // 加载配置文件并创建session工厂
	sf = new SqlSessionFactoryBuilder().build(inputStream);
	}

   @Test
	public void test() throws Exception {
		// 创建session对象
		session = sf.openSession();
//		EmployeeDao eDao = session.getMapper(EmployeeDao.class);
//		Employee employee = eDao.queryEmployeeById(1);
		
		ComputerDao cDao = session.getMapper(ComputerDao.class);
		Computer computer = cDao.queryComputerById(1);
		session.commit();
		if (session != null) {
			session.close();
		}
//		System.out.println(employee);
		System.out.println(computer);
	}
 
    @After
	public void after() throws Exception {

	}
 }

 

猜你喜欢

转载自blog.csdn.net/zs1342084776/article/details/82771515
今日推荐