Mybatis many2one,one2Many和many2many增删改操作

一、many2one(保存时,关系交给many方来进行处理)

1.实体类(实体类属性满足驼峰匹配的话,如userName,resultMap中添加autoMapping='true',则里面只需要写id映射,其余的挥动匹配映射)

public class Department {
    private Long id;
    private String name;
}
public class Employee {
    private long id ;
    private String name;
    private Department dept;// 数据库中外键为dept_id
}

2.Dao接口类

public interface IDepartmentMapper {
    void save(Department department);
    Department get(Long id);
}
public interface IEmployeeMapper {
    void save(Employee employee);
    Employee get(Long id);
    List<Employee> getList();
}

3.XML(DepartmentMapper.xml和EmployeeMapper.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">
<!-- namespace:名称空间,全局的唯一标识 -->
<mapper namespace="com.shenzhenair.mybatis.demo_02.many2one.IDepartmentMapper">
    
    <insert id="save" parameterType="Department" keyColumn="id" keyProperty="id" useGeneratedKeys="true" >
        INSERT INTO department (name) VALUES (#{name})
    </insert>
    <select id="get" parameterType="java.lang.Long" resultType="Department">
        SELECT id,name from department where id = #{id}
    </select>
</mapper>

1.在查询所有many记录,每个many对应的one都是不同,查询N个many对象,总共会发出N+1条SQL.(性能特别不友好) 使用leftJoin的方式来解决. 

<?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">
<!-- namespace:名称空间,全局的唯一标识 -->
<mapper namespace="com.shenzhenair.mybatis.demo_02.many2one.IEmployeeMapper" >

    <resultMap id="base_employeeMap" type="Employee"  autoMapping="true" >
        <id column="id" property="id" ></id>
        <result column="name" property="name" ></result>
        <!--
         association关联关系:
         property:表示实体类中关联关系的属性名
         javaType:查询出来实体类中的类型
         select:表示需要发送sql去查询出关联对象的sql映射
         column:查询出来的哪个字段作为作为参数调用select中的SQL,此处dept_id作为映射get中的参数
         columnPrefix:给映射的column添加前缀信息 dept_id,dept_name
        此种关联会发送额外的sql
       <association column="dept_id"  property="dept" javaType="Department" select="com.shenzhenair.mybatis.demo_02.many2one.IDepartmentMapper.get" ></association>
        -->
        <association property="dept" javaType="Department" columnPrefix="dept_" autoMapping="true"  >
            <id column="id" property="id"></id>
            <result column="name" property="name"></result>
        </association>

    </resultMap>

    <insert id="save" parameterType="Employee" keyColumn="id" keyProperty="id" useGeneratedKeys="true" >
        INSERT INTO employee (name,dept_id) VALUES (#{name},#{dept.id})
    </insert>

    <select id="get" parameterType="java.lang.Long" resultMap="base_employeeMap">
        SELECT id,name,dept_id from employee where id = #{id}
    </select>

    <select id="getList"  resultMap="base_employeeMap">
       /* SELECT id,name,dept_id from employee*/
       SELECT e.id,e.name,d.id AS dept_id,d.name AS dept_name FROM employee e LEFT JOIN
        department d ON e.dept_id = d.id
    </select>


</mapper>

4.测试类

public class TestMany2One {
    @Test
    public void testSave(){
        SqlSession session = MybatisUtils.openSession();
        IDepartmentMapper deptMapper = session.getMapper(IDepartmentMapper.class);
        IEmployeeMapper empMapper = session.getMapper(IEmployeeMapper.class);

        Department department = new Department("IT部门");
        Employee employee = new Employee("tom");
        employee.setDept(department);

        // 先保存one方,再保存many方
        deptMapper.save(department);
        empMapper.save(employee);

        session.commit();
        session.close();

    }
    @Test
    public void testGetEmployee(){
        SqlSession session = MybatisUtils.openSession();
        IEmployeeMapper empMapper = session.getMapper(IEmployeeMapper.class);

        Employee employee = empMapper.get(1l);
        Department dept = employee.getDept();
        System.out.println(employee);
        System.out.println(dept);

        session.commit();
        session.close();

    }


    @Test
    public void testGetEmployeeList(){
        SqlSession session = MybatisUtils.openSession();
        IEmployeeMapper empMapper = session.getMapper(IEmployeeMapper.class);

        List<Employee> employee = empMapper.getList();
        for (Employee employee1 : employee) {
            System.out.println(employee1);
        }
        session.commit();
        session.close();

    }


    @Test
    public void testGetDepartment(){
        SqlSession session = MybatisUtils.openSession();
        IDepartmentMapper deptMapper = session.getMapper(IDepartmentMapper.class);

        Department department = deptMapper.get(2L);
        System.out.println(department);

        session.commit();
        session.close();

    }
}

2.One2Many(one方要处理外键关系)

1.实体类

public class Department {
    private Long id;
    private String name;
    private List<Employee> employees = new ArrayList<>();
}
public class Employee {
    private long id ;
    private String name;
}

 2.Dao接口

public interface IDepartmentMapper {

    void save(Department department);

    Department get(Long id);

    void handlerRelaotion(@Param("dept_id") Long deptID, @Param("emp_id") long empID);

    void  delete(Long id);

}

public interface IEmployeeMapper {

    void save(Employee employee);

    Employee get(Long id);

    Employee selectByDeptID(Long dept_id);

    void updateRelation(Long id);

}

3.XML(DepartmentMapper.xml, EmployeeMapper.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">
<!-- namespace:名称空间,全局的唯一标识 -->
<mapper namespace="com.shenzhenair.mybatis.demo_02.one2many.IDepartmentMapper">

    <resultMap id="basic_map" type="Department">
        <id column="id" property="id" ></id>
        <result column="name" property="name" ></result>
        <!--
         ofType:查询出来的集合中的类型
        <collection  column="id"  property="employees"  ofType="Employee"  select="com.shenzhenair.mybatis.demo_02.one2many.ITeacherMapper.selectByDeptID" />
        -->
        <collection    property="employees"  ofType="Employee" columnPrefix="emp_" >
             <id column="id" property="id" ></id>
            <result column="name" property="name"></result>
        </collection>

    </resultMap>

   <!-- <select id="get" parameterType="java.lang.Long" resultMap="basic_map">
        SELECT id,name from department where id = #{id}
    </select>-->
    <select id="get" parameterType="java.lang.Long" resultMap="basic_map">
        SELECT d.id as id,d.name as name ,e.id as emp_id,e.name as emp_name from department d LEFT  JOIN  employee e on d.id=e.dept_id   WHERE  d.id = #{id}
    </select>

    <insert id="save" parameterType="Department" keyColumn="id" keyProperty="id" useGeneratedKeys="true" >
        INSERT INTO department (name) VALUES (#{name})
    </insert>

    <update id="handlerRelaotion" parameterType="java.lang.Long" >
        UPDATE  employee set dept_id=#{dept_id} WHERE  id = #{emp_id}
    </update>

    <delete id="delete">
        DELETE  FROM  department where id=#{id}
    </delete>



</mapper>
<?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">
<!-- namespace:名称空间,全局的唯一标识 -->
<mapper namespace="com.shenzhenair.mybatis.demo_02.one2many.IEmployeeMapper" >

    <insert id="save" parameterType="Employee" keyColumn="id" keyProperty="id" useGeneratedKeys="true" >
        INSERT INTO employee (name) VALUES (#{name})
    </insert>

    <select id="get" parameterType="java.lang.Long" resultType="Employee">
        SELECT id,name from employee where id = #{id}
    </select>

    <select id="selectByDeptID" parameterType="java.lang.Long" resultType="Employee">
        SELECT id,name from employee where dept_id = #{dept_id}
    </select>
    <update id="updateRelation" parameterType="long" >
        update employee set dept_id = null where dept_id=#{id}
    </update>

</mapper>

4.测试类

public class TestOne2Many {
    @Test
    public void testSave(){
        SqlSession session = MybatisUtils.openSession();
        IDepartmentMapper deptMapper = session.getMapper(IDepartmentMapper.class);
        IEmployeeMapper empMapper = session.getMapper(IEmployeeMapper.class);

        Employee employee1 = new Employee("e1");
        Employee employee2 = new Employee("e2");

        Department department = new Department("dept1");
        department.getEmployees().add(employee1);
        department.getEmployees().add(employee2);

        deptMapper.save(department);
        empMapper.save(employee1);
        empMapper.save(employee2);

        // 需要one方处理外键的关系
        List<Employee> employees = department.getEmployees();
        for (Employee employee : employees) {
            deptMapper.handlerRelaotion(department.getId(),employee.getId());
        }

        session.commit();
        session.close();

    }
    @Test
    public void testGet(){
        SqlSession session = MybatisUtils.openSession();
        IDepartmentMapper deptMapper = session.getMapper(IDepartmentMapper.class);
        Department department = deptMapper.get(6L);
        System.out.println(department);
        List<Employee> employees = department.getEmployees();
        for (Employee employee : employees) {
            System.out.println(employee);
        }
        session.commit();
        session.close();

    }



    @Test
    public void testDeleteEmployee(){
        SqlSession session = MybatisUtils.openSession();
        IDepartmentMapper departmentMapper = session.getMapper(IDepartmentMapper.class);
        IEmployeeMapper employeeMapper = session.getMapper(IEmployeeMapper.class);
        // 打破外键约束关系
        Department dept = departmentMapper.get(6L);
        /*List<Employee> employees = dept.getEmployees();
        for (Employee employee : employees) {
            employeeMapper.updateRelation(employee.getId());
        }*/
        employeeMapper.updateRelation(dept.getId());
        departmentMapper.delete(6L);

        session.commit();
        session.close();

    }


}

3.Many2Many

1. 实体类:

public class Student {
    private Long id;
    private String name;
}
public class Teacher {
    private Long id;
    private String name;
    private List<Student> stus = new ArrayList<>();
}

2.Dao接口

public interface IStudentMapper {
    void save(Student student);
    Student get(Long id);
}

public interface ITeacherMapper {
    void save(Teacher teacher);
    Teacher getTeacher(Long id);
    Long handlerRelation (@Param("teaId") Long teaId, @Param("stuId") Long stuId);
}

3.XML(StudentMapper.xml   TeacherMapper.xml)

<mapper namespace="com.shenzhenair.mybatis.demo_02.many2many.IStudentMapper">

    <select id="get" parameterType="java.lang.Long" resultType="Student">
      select id,name from student where id = #{id}
    </select>

    <insert id="save" parameterType="Student" keyColumn="id" keyProperty="id" useGeneratedKeys="true" >
        INSERT INTO student (name) VALUES (#{name})
    </insert>

</mapper>
<mapper namespace="com.shenzhenair.mybatis.demo_02.many2many.ITeacherMapper" >

    <insert id="save" parameterType="Teacher" keyColumn="id" keyProperty="id" useGeneratedKeys="true" >
        INSERT INTO teacher (name) VALUES (#{name})
    </insert>

    <resultMap id="basic_map" type="Teacher">
        <id column="id" property="id"></id>
        <result column="name" property="name" ></result>
        <!--是用内联方式进行查询-->
        <collection property="stus" ofType="Student" columnPrefix="stu_">
            <id property="id" column="id" ></id>
            <result property="name" column="name"></result>
        </collection>
    </resultMap>
    <select id="getTeacher" parameterType="java.lang.Long" resultMap="basic_map">
        SELECT t.id as id,t.NAME as name,s.id AS stu_id,s.NAME AS stu_name FROM teacher t
        LEFT JOIN tea_stu ts ON t.id = ts.t_id LEFT JOIN student s ON ts.s_id = s.id
        WHERE t.id =#{id}
    </select>
    <!--处理中间表关系 -->
    <insert id="handlerRelation">
        INSERT  INTO tea_stu (s_id,t_id) VAsLUES (#{stuId},#{teaId})
    </insert>
</mapper>

4.测试类

public class TestMany2Many {
    @Test
    public void testSave(){
        SqlSession session = MybatisUtils.openSession();
        IStudentMapper stuMapper = session.getMapper(IStudentMapper.class);
        ITeacherMapper teaMapper = session.getMapper(ITeacherMapper.class);

        Teacher t1 = new Teacher();
        t1.setName("t1");
        Teacher t2 =  new Teacher();
        t2.setName("t2");

        Student stu1 = new Student();
        stu1.setName("s1");
        Student stu2 = new Student();
        stu2.setName("s2");

        t1.getStus().add(stu1);
        t1.getStus().add(stu2);
        t2.getStus().add(stu1);
        t2.getStus().add(stu2);

        teaMapper.save(t1);
        teaMapper.save(t2);
        stuMapper.save(stu1);
        stuMapper.save(stu2);

        // 需要处理中间表的关系
       List<Student> stus1 =  t1.getStus();
        for (Student student : stus1) {
            teaMapper.handlerRelation(t1.getId(),student.getId());
        }
       List<Student> stus2 =  t1.getStus();
        for (Student student : stus2) {
            teaMapper.handlerRelation(t2.getId(),student.getId());
        }


        session.commit();
        session.close();

    }
    @Test
    public void testGet(){
        SqlSession session = MybatisUtils.openSession();
        ITeacherMapper teaMapper = session.getMapper(ITeacherMapper.class);
        Teacher teacher = teaMapper.getTeacher(2L);
        System.out.println(teacher);
        List<Student> stus = teacher.getStus();
        for (Student student : stus) {
            System.out.println(student);
        }
        session.commit();
        session.close();

    }

猜你喜欢

转载自blog.csdn.net/m0_38068812/article/details/87825090
今日推荐