1.概要设计(建表,建实体)
    image.png
    image.png
    2.设计 保存1个部门和n个员工的页面
    jQuery
    index.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <script src="js/jquery-3.3.1.min.js"></script>
    5. <style>
    6. dt,dd{
    7. margin-top: 8px;
    8. margin-bottom: 8px;
    9. }
    10. </style>
    11. <script>
    12. $(function () {
    13. $('#btn').click(function () {
    14. $('#addBox').append('<dd>员工名称:<input name="ename" required="required" /> 员工工资:<input name="sal" required="required" /><input type="button" class="deleteBtn" value="x"></dd>');
    15. //为刚刚新增加那行的按钮(最后一个按钮)设置实践
    16. $('.deleteBtn:last').click(function (){
    17. $(this).parent().remove();
    18. })
    19. });
    20. });
    21. </script>
    22. </head>
    23. <body>
    24. <form action="saveDept" method="post">
    25. <dl id="addBox">
    26. <dt> <button>保存</button> <input id="btn" type="button" value="增加员工" /></dt>
    27. <dt>部门名称:<input name="dname" required="required" /> 部门位置:<input name="loc" required="required" /></dt>
    28. <dd>员工名称:<input name="ename" required="required" /> 员工工资:<input name="sal" required="required" /></dd>
    29. </dl>
    30. </form>
    31. </body>
    32. </html>

    3.级联保存
    先保存部门,获得自增主键值
    结合获得的部门主键值,保存员工,获得员工的自增主键值
    基于dao接口,通过spring注入获得接口的实现类/操作类/代理类对象
    注解配置事务处理
    使用spring提供的一个编码过滤器,请求中文编码处理
    4.关联查询(查询所有部门及其对应员工信息)
    image.png
    DeptController

    1. package com.duyi.controller;
    2. import com.duyi.domain.Dept;
    3. import com.duyi.service.DeptService;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Controller;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. import org.springframework.web.bind.annotation.ResponseBody;
    8. import java.util.Arrays;
    9. import java.util.List;
    10. @Controller
    11. public class DeptController {
    12. @Autowired
    13. private DeptService deptService;
    14. @RequestMapping(value="saveDept",produces = "text/html;charset=utf-8")
    15. @ResponseBody
    16. public String saveDept(String dname,String loc,String[] ename,Float[] sal){
    17. System.out.println(dname+"---"+loc);
    18. System.out.println(Arrays.toString(ename));
    19. System.out.println(Arrays.toString(sal));
    20. deptService.saveDept(dname,loc,ename,sal);
    21. return "保存成功";
    22. }
    23. @RequestMapping("deptList")
    24. @ResponseBody
    25. public List<Dept> deptList(){
    26. // List<Dept> deptList=deptService.findAll();
    27. // for(Dept d:deptList){
    28. // System.out.println(d.getDname());
    29. // }
    30. return deptService.findAll();
    31. }
    32. }

    DeptService

    1. package com.duyi.service;
    2. import com.duyi.dao.DeptDao;
    3. import com.duyi.dao.EmpDao;
    4. import com.duyi.domain.Dept;
    5. import com.duyi.domain.Emp;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. import org.springframework.transaction.annotation.Isolation;
    9. import org.springframework.transaction.annotation.Propagation;
    10. import org.springframework.transaction.annotation.Transactional;
    11. import java.util.List;
    12. import java.util.Random;
    13. @Service
    14. public class DeptService {
    15. @Autowired
    16. private DeptDao deptDao;
    17. @Autowired
    18. private EmpDao empDao;
    19. //开启事务处理
    20. @Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
    21. public void saveDept(String dname,String loc,String[] ename,Float[] sal){
    22. Random random=new Random();
    23. Dept dept=new Dept(random.nextInt(100)+40,dname,loc,null);
    24. //假设主键是自增时,保存dept,同时获得自增的组件
    25. deptDao.save(dept);//假设主键是自增时,保存前dept对象中deptno为null,保存后有了具体数值
    26. for (int i=0;i< ename.length;i++){
    27. Emp emp=new Emp(i+1,ename[i],sal[i],dept.getDeptno(),null);
    28. empDao.save(emp);
    29. }
    30. }
    31. public List<Dept> findAll(){
    32. return deptDao.findAll();
    33. }
    34. }

    EmpDao

    1. package com.duyi.dao;
    2. import com.duyi.domain.Emp;
    3. import org.apache.ibatis.annotations.Insert;
    4. import org.apache.ibatis.annotations.Select;
    5. import java.util.List;
    6. public interface EmpDao {
    7. @Insert("insert into myemp values(#{empno},#{ename},#{sal},#{deptno})")
    8. public void save(Emp emp);
    9. @Select("select * from myemp where deptno = #{deptno}")
    10. public List<Emp> selectEmps(Integer deptno);
    11. }

    DeptDao

    1. package com.duyi.dao;
    2. import com.duyi.domain.Dept;
    3. import com.duyi.domain.Emp;
    4. import org.apache.ibatis.annotations.*;
    5. import java.util.List;
    6. public interface DeptDao {
    7. @Insert("insert into dept values(#{deptno},#{dname},#{loc})")
    8. //保存dept,同时获得自增的组件
    9. //@Options(useGeneratedKeys = true,keyProperty = "deptno")
    10. public void save(Dept dept);
    11. @Select("select * from dept")
    12. @Results({
    13. @Result(property = "deptno",column = "deptno",id = true),
    14. @Result(property = "dname",column = "dname"),
    15. @Result(property = "loc",column = "loc"),
    16. @Result(property = "emps",column = "deptno",many=@Many(select = "com.duyi.dao.EmpDao.selectEmps")),
    17. })
    18. public List<Dept> findAll();
    19. }

    mybat.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <mappers>
    7. <mapper class="com.duyi.dao.DeptDao"></mapper>
    8. <mapper class="com.duyi.dao.EmpDao"></mapper>
    9. </mappers>
    10. </configuration>

    deptList.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <script src="js/jquery-3.3.1.min.js"></script>
    5. <script>
    6. $(function () {
    7. $.post('deptList',{},function (depts){
    8. for(var i=0;i<depts.length;i++){
    9. var dept=depts[i];
    10. $('#showBox').append('<dt>'+dept.dname+'</dt>');
    11. for (var j=0;j<dept.emps.length;j++){
    12. var emp=dept.emps[j];
    13. $('#showBox').append('<dd>'+emp.ename+','+emp.sal+'</dd>');
    14. }
    15. }
    16. },'json');
    17. });
    18. </script>
    19. </head>
    20. <body>
    21. <h2>部门信息列表</h2>
    22. <dl id="showBox">
    23. </dl>
    24. </body>
    25. </html>