MyBatis中xml文件配置以及demo案例(含多表查詢)

前言

其中還使用了lombok插件

試題,demo實現多表以及單表操作

1.找出所有女性學員信息
2. 找出年齡在20-25歲之間,男性學員的信息
3. 找出所有帶過女性學員的老師信息(去重複,同一個老師不重複出現)
4. 找出所有帶過女性學員的老師帶過的班級信息(去重複)
5.找出1807班所有學員及帶班老師信息(學員及帶班老師信息可重複)
6.找出只有一個老師帶過的班級
7.找出老江帶過的學員信息

結構分析

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

idea項目結構

在這裏插入圖片描述

1.pom文件引入mybatis

<dependencies>
    <!--  mybatis核心包  -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.3.0</version>
    </dependency>
    <!-- mysql驅動包 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.40</version>
    </dependency>
    <!-- junit測試包 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <!-- 日誌文件管理包 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.12</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.12</version>
    </dependency>
<!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

2.在resource文件夾中配置文件

<?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>
    <!--引入mysql配置文件-->
    <properties resource="mysql.properties"/>
    <settings>
        <!--全局性設置懶加載。如果設爲‘false’,則所有相關聯的都會被初始化加載,默認值爲false-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--當設置爲‘true’的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。默認值爲true-->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!--控制檯打印日誌-->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    <typeAliases>
        <!-- 其實就是將bean的替換成一個短的名字-->
       <!-- 例如<typeAlias type="edu.bean.User" alias="User"/>-->
    </typeAliases>
    <!--對事務的管理和連接池的配置-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED"><!--POOLED:使用Mybatis自帶的數據庫連接池來管理數據庫連接-->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--mapping文件路徑配置-->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>

</configuration>

3.(重點)配置映射文件mapper

注意接口中方法名應與這裏的id一致

<?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="edu.dao.IArticDao"> <!--Dao接口-->
 
    <!--找出所有女性學員信息-->
    <select id="findBySex" parameterType="java.lang.String" resultType="edu.bean.StuInfo">
        select * from  stuinfo where  stusex= #{stusex}

    </select>
    <!--找出年齡在20-25歲之間,男性學員的信息-->
    <select id="findBySexAndAge" parameterType="java.util.HashMap" resultType="edu.bean.StuInfo">
        select * from  stuinfo
        <where>
            <if test="sex !=null">
                and stusex = #{sex}
            </if>

            <if test="betweenAge !=null and endAge !=null">
                and stuage between #{betweenAge}  and #{endAge}
            </if>
        </where>

    </select>

    
<!--查詢所有帶過女性學員的老師信息 去重複-->
<select id="teachWomenInfo" resultType="edu.bean.TeacherInfo">

		SELECT  distinct t1.*
		from     teacherinfo t1
		JOIN stu_teach t2 on t1.teacherId = t2.teacherId
		join   stuinfo t3 on t3.stuId = t2.stuId
		where stusex ='女'
</select>
    
<!--所有帶過女性學員的老師帶過的班級信息(去重複)-->
   <select id="findTakeWomanClassInfo" resultType="edu.bean.ClassInfo">
       SELECT DISTINCT t1.*
	 FROM classinfo t1 JOIN stuinfo t2 on t1.classid =t2.classid
	 JOIN stu_teach t3 on t3.stuId =t2.stuId
	 WHERE teacherId in (

       SELECT   t1.teacherId
       from     teacherinfo t1
       JOIN stu_teach t2 on t1.teacherId = t2.teacherId
       join   stuinfo t3 on t3.stuId = t2.stuId
       where stusex ='女'

	 )
   </select>

    <!--老師 => 學生多對多關係-->
    <resultMap id="teacherStuMapper" type="edu.bean.TeacherInfo" >
        <id property="teacherId" column="teacherId"/>
        <result property="teacherName" column="teacherName"/>


        <collection property="stuInfoList" ofType="edu.bean.StuInfo">
            <id property="stuId" column="stuId"/>
            <result property="classid"    column="classid"/>
            <result property="stuname" column="stuname"/>
            <result property="stuage" column="stuage"/>
            <result property="stusex" column="stusex"/>
        </collection>

    </resultMap>
    <!--1807班所有學員及帶班老師信息(學員及帶班老師信息可重複)-->
<select id="Find1807Info" resultMap="teacherStuMapper">
    	select t2.*,t4.*
		FROM classinfo t1
		JOIN stuinfo t2 on t1.classname ='Java1807'
		JOIN stu_teach t3  on t2.stuId=t3.stuId
		JOIN teacherinfo t4 on t3.teacherId=t4.teacherId


</select>


    <!--找出只有一個老師帶過的班級-->
    <select id="findByOneTeacher" resultType="edu.bean.ClassInfo">
		SELECT t2.*
		FROM stuinfo t1
		JOIN classinfo t2  ON	 t1.classid =t2.classid
		JOIN stu_teach t3  ON   t1.stuId =t3.stuId
		GROUP BY className
		HAVING count(DISTINCT(teacherId)) =1

    </select>

    <!--找出老江帶過的學員信息-->
    <select id="findByJiaoStuInfo" resultType="edu.bean.StuInfo">
       SELECT t3.*
	  from	teacherinfo t1
		JOIN  stu_teach  t2  on t1.teacherId =t2.teacherId and t1.teacherName='老江'
		JOIN  stuinfo t3 on t2.stuId =t3. stuId
    </select>
</mapper>

4.由於mybatis的DataSource配置是引入外部文件,所以需要創建mysql的配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/homework
jdbc.username=root
jdbc.password=root.

5.配置接口IArticDao

package edu.dao;

import edu.bean.ClassInfo;
import edu.bean.StuInfo;
import edu.bean.TeacherInfo;

import java.util.List;
import java.util.Map;

public interface IArticDao {
    List<StuInfo> findBySex(String sex);

    List<StuInfo>findBySexAndAge(Map<String ,Object> map);

   List<TeacherInfo> teachWomenInfo();

   List<ClassInfo> findTakeWomanClassInfo();

   List<Object> Find1807Info();
   List<ClassInfo> findByOneTeacher();
   List<StuInfo>findByJiaoStuInfo();
}

6.配置實體類

配置均使用lambok插件

6.1 班級表ClassInfo

package edu.bean;

import lombok.Data;
import lombok.ToString;

import java.util.List;

@Data
@ToString
public class ClassInfo {
    private int classid;
    private String classname;
    private String desc;
    private List<StuInfo>stuInfoList;

    private List<TeacherInfo> teacherInfoList;
}

6.2 中間表Stu_teach

package edu.bean;

import lombok.Data;
import lombok.ToString;

import java.util.List;

@Data
@ToString
public class Stu_teach {
    private int stId;
    private  int stuId;
    private int teacherId;
    private List<StuInfo>stuInfoList;
    private List<TeacherInfo>teacherInfoList;

}

6.3 學生表StuInfo

package edu.bean;


import lombok.Data;
import lombok.ToString;

import java.util.List;

@ToString
@Data
public class StuInfo {
    private int stuId;
    private int classid;
    private  String stuname;
    private int stuage;
    private String stusex;
    private ClassInfo classInfo;
    private List<Stu_teach> stu_teach;


}

6.4 教師表TeacherInfo

package edu.bean;

import lombok.Data;
import lombok.ToString;

import java.util.List;

@Data
@ToString
public class TeacherInfo {
    private int teacherId;
    private String teacherName;
    private List<Stu_teach> listStu_teach;
    private List<StuInfo> stuInfoList;

    private List<ClassInfo> classInfoList;


}

7.測試代碼

import edu.bean.ClassInfo;
import edu.bean.StuInfo;
import edu.bean.TeacherInfo;
import edu.dao.IArticDao;
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 java.io.IOException;
import java.io.Reader;
import java.util.*;

public class StuTest {

    public static void main(String[] args) {

        String filename="mybatis-config.xml";
        Reader resourceAsReader =null;
        try {
            resourceAsReader = Resources.getResourceAsReader(filename);

        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader);
        SqlSession sqlSession = build.openSession();
        IArticDao mapper = sqlSession.getMapper(IArticDao.class);
         findBySex(mapper);
			  /*以下皆爲測試方法*/
       /*     findBySexAndAge(mapper);
          teachWomenInfo(mapper);
         findTakeWomanClassInfo(mapper);
        Find1807Info(mapper);
        findByOneTeacher(mapper);
            findByJiaoStuInfo(mapper);*/

    }

    private static void findByJiaoStuInfo(IArticDao mapper) {
        List<StuInfo> byJiaoStuInfo = mapper.findByJiaoStuInfo();
        for (StuInfo stuInfo : byJiaoStuInfo) {
            System.out.println(stuInfo);
        }
    }

    private static void findByOneTeacher(IArticDao mapper) {
        List<ClassInfo> byOneTeacher = mapper.findByOneTeacher();
        for (ClassInfo classInfo : byOneTeacher) {
            System.out.println(classInfo.getClassname());
        }
    }

    private static void Find1807Info(IArticDao mapper) {
        List<Object> objects = mapper.Find1807Info();
        System.out.println(objects);
    }

    private static void findTakeWomanClassInfo(IArticDao mapper) {
        List<ClassInfo> takeWomanClassInfo = mapper.findTakeWomanClassInfo();
        System.out.println(takeWomanClassInfo);
    }

    private static void teachWomenInfo(IArticDao mapper) {
         List<TeacherInfo> allInfo = mapper.teachWomenInfo();
        for (TeacherInfo teacherInfo : allInfo) {
            System.out.println(teacherInfo.getTeacherName());
        }
    }

    private static void findBySex(IArticDao mapper) {

        List<StuInfo> sex = mapper.findBySex("女");
        System.out.println(sex);

    }


    private static void findBySexAndAge(IArticDao mapper) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("sex","男");
        map.put("betweenAge",20);
        map.put("endAge",25);
        mapper.findBySexAndAge(map);
    }




}

其一方法運行結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章