Mybatis入门学习02-动态修改/多对一和一对多

1、动态修改

  • 如下面代码所示,在使用update修改时, 如果只修改一个属性name,其他的属性则会变成null值。
<update id="update" >
    UPDATE student SET name=#{name},age = #{age},sex=#{sex} WHERE id=#{id}
</update>
  • 使用< set >标签可以完成动态修改
<update id="update">
        UPDATE student
        <set>
            <if test="name!=null and name!=''">
                name = #{name},
            </if>
            <if test="age!=null">
                age = #{age},
            </if>
            <if test="sex!=null">
                sex = #{sex}
            </if>
        </set>
        WHERE id = #{id}
    </update>

2、多对一

以employee和dept为例,保存和查询

  • 不管多对一还是一对多,在保存的时候,都是先保存一方再保存多方
  • 多表查询有两种方式:一种是关联查询,一种是子查询

2.1、domain

2.1.1、Employee
public class Employee {
    private Long id;
    private String name;
    private String age;
    private Dept dept;
    //get set toString
2.1.2、Dept
public class Dept {
    private Long id;
    private String name;
    //set get toString
}

2.2、mapper

2.2.1、Deptmapper
public interface DeptMapper {
    void save(Dept dept);
    List<Dept> findAll();
    Dept findById();
}
2.2.2、DeptMapper.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:映射命名空间    一般都是写dao接口的全限定名-->
<mapper namespace="com.xuxusheng._02many2one.mapper.deptmapper.DeptMapper">

    <insert id="save" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        INSERT INTO dept (name) VALUES (#{name})
    </insert>
    <select id="findById" resultType="Dept">
        SELECT * FROM dept WHERE id=#{id}
    </select>
</mapper>
2.2.3、EmployeeMapper
public interface EmployeeMapper {
    void save(Employee employee);
    List<Employee> findAll();
    List<Employee> findAll2();
}
2.2.4、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:映射命名空间    一般都是写dao接口的全限定名-->
<mapper namespace="com.xuxusheng._02many2one.mapper.employeemapper.EmployeeMapper">
    <!--保存,需要开启主键,允许JDBC支持自动生成主键-->
    <insert id="save" useGeneratedKeys="true"  keyColumn="id" keyProperty="id">
        INSERT INTO employee (name, age, dept_id) VALUES(#{name},#{age},#{dept.id})
    </insert>
    <!--
        多对一 查询所有
            1.关联查询
            2.子查询。先查询员工,再对员工进行循环查询部门
    -->
    <!--关联查询-->
    <!--
           映射关联对象 association
           property="dept"  映射Employee中的dept属性
           javaType="cn.itsource._02many2one.domain.Dept  dept属性对应的类型

           注意:当你使用了association映射之后,默认映射规则失效
       -->
    <resultMap id="employeeResultMap" type="Employee">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <association property="dept" javaType="Dept">
            <id column="id" property="id"/>
            <result column="dname" property="name"/>
        </association>
    </resultMap>
    <select id="findAll" resultMap="employeeResultMap">
        SELECT e.id,e.name,e.age,d.name dname FROM employee e
        JOIN dept d on e.dept_id = d.id
    </select>
    <!--子查询,相当于将部门查询的结果封装,通过mapper和id定位到-->
    <resultMap id="employeeResultMap2" type="Employee">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <association property="dept" column="dept_id" select="com.xuxusheng._02many2one.mapper.deptmapper.DeptMapper.findById"/>
    </resultMap>
    <select id="findAll2" resultMap="employeeResultMap2">
        SELECT * FROM employee
    </select>
</mapper>

2.3、test

public class EmployeeMapperTest {

   /*
   *多对一保存时:需要注意先保存一方再保存多方。
 * */
    @Test
    public void save() {
        SqlSession sqlSession = MybatisUtil.openSession();
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = new Dept();
        dept.setName("工经部");
        deptMapper.save(dept);
        Employee employee1 = new Employee();
        employee1.setName("aaaaa");
        employee1.setDept(dept);
        Employee employee2 = new Employee();
        employee2.setName("bbbbbbbbbb");
        employee2.setDept(dept);
        employeeMapper.save(employee1);
        employeeMapper.save(employee2);
        sqlSession.commit();
    }
    @Test
    public void findAll() {
        SqlSession sqlSession = MybatisUtil.openSession();
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        List<Employee> employees = employeeMapper.findAll();
        employees.forEach(employee -> System.out.println(employee));
    }
    @Test
    public void findAll2() {
        SqlSession sqlSession = MybatisUtil.openSession();
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        List<Employee> employees = employeeMapper.findAll2();
        employees.forEach(employee -> System.out.println(employee));
    }
}

3、一对多

  • 注意mapper中的保存也需要对应:void save(@Param(“e”) Employee employee, @Param(“deptId”) Long
    deptId);

2.1、domain

2.1.1、Employee
public class Employee {
    private Long id;
    private String name;
    private String age;
    //get set toString
2.1.2、Dept
public class Dept {
    private Long id;
    private String name;
    private List<Employee> employees = new ArrayList<>();
    //get set toString
}

2.2、mapper

2.2.1、Deptmapper
public interface DeptMapper {
    void save(Dept dept);
    List<Dept> findAll();
    List<Dept> findAll2();
    Dept findById();
}
2.2.2、DeptMapper.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:映射命名空间    一般都是写dao接口的全限定名-->
<mapper namespace="com.xuxusheng._03one2many.mapper.deptmapper.DeptMapper">
<insert id="save" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
    INSERT INTO dept(name) VALUES (#{name})
</insert>

    <!--多表查询
            1.关联查询
            2.子查询
    -->
<!--关联查询-->
    <resultMap id="deptResultMap" type="Dept2">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!--
            映射集合要使用collection
            注意:使用了collection映射之后,默认映射规则失效
        -->
        <collection property="employees" ofType="Employee2">
            <id column="eid" property="id"/>
            <result column="ename" property="name"/>
            <result column="eage" property="age"/>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="deptResultMap">
        SELECT d.id,d.name,e.id eid,e.name ename,e.age eage
        FROM dept d JOIN employee e
        ON d.id = e.dept_id
        ORDER BY d.id
    </select>
<!--子查询-->
    <resultMap id="deptResultMap2" type="Dept2">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="employees" ofType="com.xuxusheng._03one2many.domain.Employee"
                    column="id"
                    select="com.xuxusheng._03one2many.mapper.employeemapper.EmployeeMapper.findByDeptId"/>
    </resultMap>

    <select id="findAll2" resultMap="deptResultMap2">
        SELECT * FROM dept
    </select>

    <select id="selectById" resultType="Dept2">
        SELECT * FROM dept WHERE id=#{id}
    </select>
</mapper>
2.2.3、EmployeeMapper
public interface EmployeeMapper {
    void save(@Param("e") Employee employee, @Param("deptId") Long deptId);
    List<Employee> findAll();
    List<Employee> findAll2();
    List<Employee> findByDeptId(Long deptId);
}
2.2.4、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:映射命名空间    一般都是写dao接口的全限定名-->
<mapper namespace="com.xuxusheng._03one2many.mapper.employeemapper.EmployeeMapper">
    <insert id="save" >
        INSERT INTO employee(name, age, dept_id) VALUES (#{e.name},#{e.age},#{deptId})
    </insert>
    <select id="findByDeptId" resultType="Employee2">
        SELECT * FROM employee WHERE dept_id=#{deptId}
    </select>
</mapper>

2.3、test

public class DeptMapperTest {

    /*
     *一对多保存时:需要注意先保存一方再保存多方。
     * */
    @Test
    public void save() {
        SqlSession sqlSession = MybatisUtil.openSession();
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = new Dept();
        dept.setName("wuzi部");

        Employee employee1 = new Employee();
        employee1.setName("cccc");


        Employee employee2 = new Employee();
        employee2.setName("deee");

        dept.getEmployees().add(employee1);
        dept.getEmployees().add(employee2);

        deptMapper.save(dept);
        List<Employee> employees = dept.getEmployees();
        employees.forEach(employee -> {
            employeeMapper.save(employee,dept.getId());
        });
        sqlSession.commit();
    }

    @Test
    public void findAll() {
        SqlSession sqlSession = MybatisUtil.openSession();
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        List<Dept> depts = deptMapper.findAll();
        depts.forEach(dept -> System.out.println(dept));
    }

    @Test
    public void findAll2() {
        SqlSession sqlSession = MybatisUtil.openSession();
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        List<Dept> depts = deptMapper.findAll2();
        depts.forEach(dept -> System.out.println(dept));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值