您的位置:首页 > 其它

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

2020-01-12 21:05 127 查看

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));
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
vi-vi- 发布了40 篇原创文章 · 获赞 4 · 访问量 738 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: