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)); } }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【MyBatis学习02】MyBatis入门
- Java Agent入门学习之动态修改代码
- Mybatis学习笔记(三)别名、sql与include标签、动态SQL查询、动态SQL修改、增、删、改
- C#入门学习-----菜单应用(添加剂快捷方式、设置菜单项是否可用、修改菜单字体、创建级联菜单、级联菜单的动态合并)
- Mybatis入门学习(四、动态SQL语句)
- MyBatis学习 之 三、动态SQL语句
- 【MyBatis学习02】走进MyBatis的世界
- MyBatis入门——动态SQL
- Mybatis入门学习(一)
- Spring入门学习(四、基于代理模式整合Mybatis)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- Mybatis入门学习(二)
- Mybatis入门学习(三)
- MyBatis学习之三--动态SQL语句
- MyBatis 学习总结(一)MyBatis快速入门
- 学习笔记(02):ArcGIS10.1入门实战视频教程(GIS思维)-此节忽略跳过,仅仅用于资料下载...
- MyBatis学习-入门篇
- mybatis学习--动态sql之foreach标签
- (五)MyBatis学习笔记-动态SQL
- 一起来学习Mybatis(一)-入门