zoukankan      html  css  js  c++  java
  • 【MyBatis】-----【MyBatis】---表级联系【一对多】

    一、核心配置文件

    <?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>
         <!-- 最开始加载引用db.properties文件 -->
        <properties resource="db.properties"/>
        <!-- 取别名    以下情况别名为类名 -->
         <typeAliases>
             <package name="com.myBatis.entity"/>
         </typeAliases>
        <!-- 
            development : 开发模式
            work : 工作模式
         -->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <!-- 配置数据库连接信息 -->
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}" />
                    <property name="url" value="${url}" />
                    <property name="username" value="${username}" />
                    <property name="password" value="${password}" />
                </dataSource>
            </environment>
        </environments>
        <!-- 引用映射文件 -->
        <mappers >
            <mapper resource="com/myBatis/mapper/classesMapper.xml"/>
            <mapper resource="com/myBatis/mapper/teacherMapper.xml"/>
            
        </mappers>
    </configuration>

    二、实体类

      Classes

    package com.myBatis.entity;
    
    import java.util.List;
    
    
    public class Classes {
        private int id; // id===>c_id
        private String name; // name===>c_name
        /**
         * class表中有一个teacher_id字段,所以在Classes类中定义一个teacher属性,
         * 用于维护teacher和class之间的一对一关系,通过这个teacher属性就可以知道这个班级是由哪个老师负责的
         */
        private Teacher teacher;
        
        //使用一个List<Student>集合属性表示班级拥有的学生
         private List<Student> students;
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Teacher getTeacher() {
            return teacher;
        }
        public void setTeacher(Teacher teacher) {
            this.teacher = teacher;
        }
        
        public List<Student> getStudents() {
            return students;
        }
        public void setStudents(List<Student> students) {
            this.students = students;
        }
        @Override
        public String toString() {
            return "Classes [id=" + id + ", name=" + name + ", teacher=" + teacher + ", students=" + students + "]";
        }
        
        //增删改要用到的两个构造方法
        public Classes(String name, Teacher teacher) {
            super();
            this.name = name;
            this.teacher = teacher;
        }
        public Classes() {
            super();
        }
        
        
    }

      Teacher

    package com.myBatis.entity;
    
    public class Teacher {
        // 定义实体类的属性,与teacher表中的字段对应
        private int id; // id===>t_id
        private String name; // name===>t_name
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Teacher [id=" + id + ", name=" + name + "]";
        }
        public Teacher() {
            super();
        }
        public Teacher(int id) {
            super();
            this.id = id;
        }
        
        
    }

      Student

    package com.myBatis.entity;
    
    public class Student {
    
        //定义属性,和student表中的字段对应
        private int id;            //id===>s_id
        private String name;    //name===>s_name
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + "]";
        }
    }

    三、映射文件

      classessMapper.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,namespace的值习惯上设置成包名+sql映射文件名,
        这样就能够保证namespace的值是唯一的 
        -->
        <mapper namespace="com.myBatis.mapper.classesMapper">
        <!-- 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
                 封装联表查询的数据(去除重复的数据) 
                 根据id查询得到一个user对象 -->
            <select id="getclassess" parameterType="int" resultMap="ClassResultMap">
                 select * from classes c, teacher t where c.t_id=t.t_id and c.c_id=#{id}
            </select>
            <!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
            <resultMap type="Classes" id="ClassResultMap">
                <id property="id" column="c_id"/>
                <result property="name" column="c_name"/>
                <association property="teacher" javaType="Teacher">
                    <id property="id" column="t_id"/>
                    <result property="name" column="t_name"/>
                </association>
            </resultMap>
            <!--  根据id查询删除一个class 的t_id -->
            <delete id="deleteClasses" parameterType="Classes">
                delete from classes where c_id=#{id}
            </delete>
              <!-- 添加(Create) -->
            <insert id="addClasses" parameterType="Classes">
                insert into classes values(null,#{name},#{teacher.id})
            </insert>
             <!-- 修改班级所对应的老师(Update) -->
            <update id="updateClasses" parameterType="Classes">
                update classes set t_id=#{teacher.id} where c_id=#{id}
            </update>
            
         
         <!--一对多 -->   
            <!-- 
                根据classId查询对应的班级信息,包括学生,老师
             -->
        <!-- 
            嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集
            SELECT * FROM class c, teacher t,student s WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND  c.c_id=1
         -->
        <select id="getClass3" parameterType="int" resultMap="ClassResultMap3">
            select * from classes c, teacher t,student s where c.t_id=t.t_id and c.c_id=s.class_id and  c.c_id=#{id}
        </select>
        <resultMap type="Classes" id="ClassResultMap3">
            <id property="id" column="c_id"/>
            <result property="name" column="c_name"/>
            <association property="teacher" column="t_id" javaType="Teacher">
                <id property="id" column="t_id"/>
                <result property="name" column="t_name"/>
            </association>
            <!-- ofType指定students集合中的对象类型 -->
            <collection property="students" ofType="Student">
                <id property="id" column="s_id"/>
                <result property="name" column="s_name"/>
            </collection>
        </resultMap>
            
        </mapper>
        

      teacherMapper.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,namespace的值习惯上设置成包名+sql映射文件名,
        这样就能够保证namespace的值是唯一的 
        -->
        <mapper namespace="com.myBatis.mapper.teacherMapper">
            <!-- 根据id查询得到一个user对象 -->
            <select id="getteacher" parameterType="int" resultMap="TeacherResultMap">
                select * from classes c, teacher t where c.t_id=t.t_id and t.t_id=#{id}
            </select>
            <!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
            <resultMap type="teacher" id="TeacherResultMap">
                <id property="id" column="t_id"/>
                <result property="name" column="t_name"/>
            </resultMap>
            
             <insert id="addTeacher" parameterType="Teacher">
                insert into teacher values(#{t_name})
            </insert>
            
        </mapper>
        

    四、封装类

    package com.myBatis.util;
    
    
    import java.io.IOException;
    import java.io.Reader;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    public class myBtaisUtil {
        static Reader reader=null;
        static SqlSessionFactory sqlSessionFactory= null;
        static SqlSession sqlSession = null;
        /**
         * 加载核心配置文件
         * 获取SqlSessionFactory
         * @return SqlSessionFactory
         */
        public static SqlSessionFactory getsqlSessionFactory() {
            try {
                reader = Resources.getResourceAsReader("SqlMapConfig.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return sqlSessionFactory;
        }
        /**
         * 获取SqlSession
         * @return SqlSession
         */
        public static SqlSession getsqlSession() {
            return sqlSession= getsqlSessionFactory().openSession(true);
        }
    }

    五、测试类

    package myBatisTest;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import com.myBatis.entity.Classes;
    import com.myBatis.entity.Teacher;
    import com.myBatis.util.myBtaisUtil;
    
    public class TestUser {
        //查询
        @Test
        public void testGetClasses() {
            SqlSession sqlSession=myBtaisUtil.getsqlSession();
            String select = "com.myBatis.mapper.classesMapper.getClass3";
            Classes classes = sqlSession.selectOne(select, 1);
            System.out.println(classes);
        }
    }
  • 相关阅读:
    数据中台
    mlog$_
    Vue.js_判断与循环
    Vue.js_数据绑定
    Javascript-构造函数
    Javascript-Canvas实现三角函数曲线动画图
    Javascript-Canvas图片填充之预加载
    同步和异步的理解
    JavaScript-rem字体自适应
    JavaScript-获取屏窗与视窗、文档宽高
  • 原文地址:https://www.cnblogs.com/angelye/p/7464945.html
Copyright © 2011-2022 走看看