四、动态SQL
说明:
if:判断
? choose (when, otherwise):分支选择;带了break的swtich-case
如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个
? trim 字符串截取(where(封装查询条件), set(封装修改条件))
? foreach 遍历集合
目录结构:
主要测试写在各包的DynamicSQL文件中;

一、if & if-where & if-trim:判断;
实例说明:查询员工,携带什么字段查询添加就带上什么字段;
接口文件EmployeeMapper.java:
1 package dao; 2 3 import java.util.List; 4 5 import entity.Employee; 6 7 public interface EmployeeMapperDynamicSQL { 8 9 List<Employee> getList(Employee employee); 10 List<Employee> getListWhere(Employee employee);
11 List<Employee> getListTrim(Employee employee);
12 }
映射文件EmployeeMapper.xml (if)
- 版本1-if: 给where后面加1=1 以后条件都 and xxx
1 <?xml version="1.0" encoding="UTF-8" ?> 2 DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="dao.EmployeeMapperDynamicSQL"> 9 10 <select id="getList" resultType="entity.Employee"> 11 select id as id, 12 last_name as lastName, 13 email as email, 14 gender as gender 15 from tbl_employee 16 where 1=1 17 19 <if test="lastName!='' and lastName!=null"> 20 and last_name like #{lastName} 21 if> 22 <if test="email!='' and email!=null"> 23 and email like #{email} 24 if> 25 <if test="gender!='' and gender!=null"> 26 and gender like #{gender} 27 if> 28 29 select> 30 31 mapper>
映射文件EmployeeMapper.xml (if-where)
- 版本2-if-where:
标签 给mybatis使用where标签来将所有的查询条件包括在内,mybatis就会将标签中拼装SQL,多出来的and或者or去掉 - where 只会去掉第一个 and 或者 or
1 2 <select id="getListWhere" resultType="entity.Employee"> 3 select id as id, 4 last_name as lastName, 5 email as email, 6 gender as gender 7 from tbl_employee 8 10 <where> 11 <if test="lastName!='' and lastName!=null"> 12 last_name like #{lastName} 13 if> 14 <if test="email!='' and email!=null"> 15 and email like #{email} 16 if> 17 <if test="gender!='' and gender!=null"> 18 and gender like #{gender} 19 if> 20 where> 21 select>
映射文件EmployeeMapper.xml (if-trim)
- 版本3-if-trim:后面多出的and或者or where标签不能解决(推荐)
prefix="":前缀:trim标签体中是整个字符串拼接后的结果 prefix给拼接后的整个字符串加一个前缀
prefixOverdides="": 前缀覆盖:去掉整个字符串前面多余的字符串
suffix=”“: 后缀 suffix给拼接后的整个字符串加一个后缀
suffixOverrides="" 后缀覆盖:去掉整个字符串后面多余的字符串
1 2 <select id="getListTrim" resultType="entity.Employee"> 3 select id as id, 4 last_name as lastName, 5 email as email, 6 gender as gender 7 from tbl_employee 11 12 <trim prefix="where" suffixOverrides="and"> 13 <if test="lastName!='' and lastName!=null"> 14 last_name like #{lastName} and 15 if> 16 <if test="email!='' and email!=null"> 17 email like #{email} and 18 if> 19 <if test="gender!='' and gender!=null"> 20 gender like #{gender} 21 if> 22 trim> 23 select>
junit测试类:
1 @Test 2 public void test01() { 3 String resource = "mybatis-config.xml"; 4 SqlSession openSession = null; 5 try { 6 InputStream inputStream = Resources.getResourceAsStream(resource); 7 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 8 // 获取openSession 不会自动提交数据 9 openSession = sqlSessionFactory.openSession(true); 10 EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class); 11 Employee emp = new Employee(); 12 emp.setLastName("%x%"); 13 ListtestResultType = mapper.getList(emp); 14 List testResultTypeWhere = mapper.getListWhere(emp); 15 List testResultTypeTrim = mapper.getListTrim(emp); 16 System.out.println("测试 if:" + testResultType); 17 System.out.println("测试 if where:" + testResultTypeWhere); 18 System.out.println("测试 if Trim:" + testResultTypeTrim); 19 20 } catch (Exception e) { 21 // TODO: handle exception 22 } finally { 23 if (openSession != null) { 24 openSession.close(); 25 } 26 27 } 28 }
运行结果:
测试 if:[Employee [id=2, lastName=joy2x22222, email=joy52112225@iclound.com, gender=男]]
测试 if where:[Employee [id=2, lastName=joy2x22222, email=joy52112225@iclound.com, gender=男]]
测试 if Trim:[Employee [id=2, lastName=joy2x22222, email=joy52112225@iclound.com, gender=男]]
二、 choose:只进入一个查询;
接口文件EmployeeMapper.java:
ListgetListChoose(Employee employee);
映射文件EmployeeMapper.xml
1 <select id="getListChoose" resultType="entity.Employee"> 2 select id as id, 3 last_name as lastName, 4 email as email, 5 gender as gender 6 from tbl_employee 7 <where> 8 <choose> 9 <when test="id!=null"> 10 id = #{id} 11 when> 12 <when test="lastName!=null"> 13 last_name like #{lastName} 14 when> 15 <when test="email!=null"> 16 email like #{email} 17 when> 18 <otherwise> 19 1=1 20 otherwise> 21 choose> 22 where> 23 24 select>
junit测试类:
1 @Test 2 public void test02() { 3 String resource = "mybatis-config.xml"; 4 SqlSession openSession = null; 5 try { 6 InputStream inputStream = Resources.getResourceAsStream(resource); 7 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 8 // 获取openSession 不会自动提交数据 9 openSession = sqlSessionFactory.openSession(true); 10 EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class); 11 Employee emp = new Employee(); 12 emp.setEmail("%112225%"); 13 ListtestResultType = mapper.getListChoose(emp); 14 System.out.println("测试 choose:" + testResultType); 15 } catch (Exception e) { 16 // TODO: handle exception 17 } finally { 18 if (openSession != null) { 19 openSession.close(); 20 } 21 22 } 23 }
运行结果:
测试 choose:[Employee [id=1, lastName=joy33333, email=joy52112225@iclound.com, gender=女], Employee [id=2, lastName=joy2x22222, email=joy52112225@iclound.com, gender=男]]
三、set
更新数据的时候,如果直接写set 很容器出现 “,”多出来的问题;这里直接用trim来解决该问题;
接口文件EmployeeMapper.java:
void updateEmpTrim(Employee employee);
映射文件EmployeeMapper.xml
1 2 <update id="updateEmpTrim" parameterType="entity.Employee"> 3 update tbl_employee 4 <trim prefix="set" suffixOverrides=","> 5 <if test="lastName!=null"> 6 last_name = #{lastName}, 7 if> 8 <if test="email!=null"> 9 email=#{email}, 10 if> 11 <if test="gender!=null"> 12 gender = #{gender} 13 if> 14 trim> 15 16 where id = #{id} 17 update>
junit测试类:
1 @Test 2 public void test03() { 3 String resource = "mybatis-config.xml"; 4 SqlSession openSession = null; 5 try { 6 InputStream inputStream = Resources.getResourceAsStream(resource); 7 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 8 // 获取openSession 不会自动提交数据 9 openSession = sqlSessionFactory.openSession(true); 10 EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class); 11 Employee emp = new Employee(); 12 emp.setEmail("1602211057@qq.com"); 13 emp.setId(7); 14 // mapper.updateEmp(emp); 15 mapper.updateEmpTrim(emp); 16 } catch (Exception e) { 17 // TODO: handle exception 18 } finally { 19 if (openSession != null) { 20 openSession.close(); 21 } 22 23 }
四、foreach
foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list;如果User有属性List ids。入参是User对象,那么这个collection = "ids";如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id";
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array;
3. 如果使用Map封装了,collection的属性值为对应的Key;
以下例子以list 的3中情况为实例,array 和 map不做赘述;
情况一:传入的是单参数且参数类型是一个List的时候
接口文件EmployeeMapper.java:
ListgetEmpsByConditionForeach(List ids);
映射文件EmployeeMapper.xml
1 <select id="getEmpsByConditionForeach" resultType="entity.Employee" parameterType="java.lang.Integer"> 2 select * from tbl_employee where id in 3 4 14 <foreach collection="list" item="item_id" separator="," open="(" close=")" index=""> 15 #{item_id } 16 foreach> 17 select>
junit测试类:
1 @Test 2 public void test04() { 3 String resource = "mybatis-config.xml"; 4 SqlSession openSession = null; 5 try { 6 InputStream inputStream = Resources.getResourceAsStream(resource); 7 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 8 // 获取openSession 不会自动提交数据 9 openSession = sqlSessionFactory.openSession(true); 10 EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class); 11 Listlist = Arrays.asList(1, 2, 3); 12 List empList = mapper.getEmpsByConditionForeach(list); 13 System.out.println(empList); 14 } catch (Exception e) { 15 // TODO: handle exception 16 } finally { 17 if (openSession != null) { 18 openSession.close(); 19 } 20 21 } 22 }
运行结果:
[Employee [id=1, lastName=null, email=joy52112225@iclound.com, gender=女], Employee [id=2, lastName=null, email=joy52112225@iclound.com, gender=男]]
情况二:传入的是一个实体且参数类型是一个List
给Employee实体添加了一个List
Employee 实体:
1 package entity; 2 3 import java.util.List; 4 5 public class Employee { 6 7 private Integer id; 8 private String lastName; 9 private String email; 10 private String gender; 11 private Listids; 12 13 public Integer getId() { 14 return id; 15 } 16 17 public void setId(Integer id) { 18 this.id = id; 19 } 20 21 public String getLastName() { 22 return lastName; 23 } 24 25 public void setLastName(String lastName) { 26 this.lastName = lastName; 27 } 28 29 public String getEmail() { 30 return email; 31 } 32 33 public void setEmail(String email) { 34 this.email = email; 35 } 36 37 public String getGender() { 38 return gender; 39 } 40 41 public void setGender(String gender) { 42 this.gender = gender; 43 } 44 45 public List getIds() { 46 return ids; 47 } 48 49 public void setIds(List ids) { 50 this.ids = ids; 51 } 52 53 @Override 54 public String toString() { 55 return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]"; 56 } 57 58 }
接口文件EmployeeMapper.java:
ListgetEmpsByConditionForeach2(Employee employee);
映射文件EmployeeMapper.xml
1 <select id="getEmpsByConditionForeach2" resultType="entity.Employee" parameterType="entity.Employee"> 2 select * from tbl_employee where id in 3 <foreach collection="ids" item="item_id" separator="," open="(" close=")" index=""> 4 #{item_id } 5 foreach> 6 select>
junit测试类:
1 @Test 2 public void test04() { 3 String resource = "mybatis-config.xml"; 4 SqlSession openSession = null; 5 try { 6 InputStream inputStream = Resources.getResourceAsStream(resource); 7 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 8 // 获取openSession 不会自动提交数据 9 openSession = sqlSessionFactory.openSession(true); 10 EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class); 11 Listlist = Arrays.asList(1, 2, 3); 12 Employee employee = new Employee(); 13 employee.setIds(list); 14 List empList = mapper.getEmpsByConditionForeach2(employee); 15 System.out.println(empList); 16 } catch (Exception e) { 17 // TODO: handle exception 18 } finally { 19 if (openSession != null) { 20 openSession.close(); 21 } 22 23 } 24 }
运行结果同情况1;
情况三:传入的是一个实体且参数也是一个实体;
该情况下,foreach collection属性就是该实体的list属性值;
也就是说 ids 在 Employee.java实体 的 department成员变量的 ids中;
Employee 实体:
1 package entity; 2 3 public class Employee { 4 5 private Integer id; 6 private String lastName; 7 private String email; 8 private String gender; 9 private Department department; 10 11 public Integer getId() { 12 return id; 13 } 14 15 public void setId(Integer id) { 16 this.id = id; 17 } 18 19 public String getLastName() { 20 return lastName; 21 } 22 23 public void setLastName(String lastName) { 24 this.lastName = lastName; 25 } 26 27 public String getEmail() { 28 return email; 29 } 30 31 public void setEmail(String email) { 32 this.email = email; 33 } 34 35 public String getGender() { 36 return gender; 37 } 38 39 public void setGender(String gender) { 40 this.gender = gender; 41 } 42 43 public Department getDepartment() { 44 return department; 45 } 46 47 public void setDepartment(Department department) { 48 this.department = department; 49 } 50 51 @Override 52 public String toString() { 53 return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]"; 54 } 55 56 }
Department实体:
1 package entity; 2 3 import java.util.List; 4 5 public class Department { 6 7 private Integer id; 8 private String departmentName; 9 private ListempList; 10 private List ids; 11 12 public Integer getId() { 13 return id; 14 } 15 16 public void setId(Integer id) { 17 this.id = id; 18 } 19 20 public String getDepartmentName() { 21 return departmentName; 22 } 23 24 public void setDepartmentName(String departmentName) { 25 this.departmentName = departmentName; 26 } 27 28 public List getEmpList() { 29 return empList; 30 } 31 32 public void setEmpList(List empList) { 33 this.empList = empList; 34 } 35 36 public List getIds() { 37 return ids; 38 } 39 40 public void setIds(List ids) { 41 this.ids = ids; 42 } 43 44 @Override 45 public String toString() { 46 return "Department [id=" + id + ", departmentName=" + departmentName + "]"; 47 } 48 49 }
接口文件EmployeeMapper.java:同情况二
映射文件EmployeeMapper.xml:
1 <select id="getEmpsByConditionForeach2" resultType="entity.Employee" parameterType="entity.Employee"> 2 select * from tbl_employee where id in 3 <foreach collection="department.ids" item="item_id" separator="," open="(" close=")" index=""> 4 #{item_id } 5 foreach> 6 select>
junit测试类:同情况二
运行结果同上;
五、批量插入
接口文件EmployeeMapper.java:
void insertEmps(Listemps);
映射文件EmployeeMapper.xml
MySQL版本:
1 <insert id="insertEmps" parameterType="entity.Employee" useGeneratedKeys="true" keyProperty="id"> 2 insert into tbl_employee(last_name,gender,email) values 3 <foreach collection="list" item="item" separator=","> 4 (#{item.lastName},#{item.gender},#{item.email}) 5 foreach> 6 insert>
Oracle版本方式1:
1 <insert id="insertBatChOracle"> 2 <foreach collection="list" item="item" open="begin" close="end"> 3 insert into tbl_employee(id,last_name,email) 4 values(employees_seq.nextval,#{item.lastName},#{item.email});_ 5 foreach> 6 7 insert>
Oracle版本方式2:
1 <insert id="insertBatChOracle"> 2 insert into tbl_employee(id,last_name,email) 3 select employees_seq.nextval,lastName,email from( 4 <foreach collection="list" item="item" separator="union"> 5 select #{item.lastName},#{item.email} from dual 6 foreach> 7 ) 8 insert>
junit测试类:
1 @Test 2 public void test05() { 3 String resource = "mybatis-config.xml"; 4 SqlSession openSession = null; 5 try { 6 InputStream inputStream = Resources.getResourceAsStream(resource); 7 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 8 // 获取openSession 不会自动提交数据 9 openSession = sqlSessionFactory.openSession(true); 10 EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class); 11 Employee employee1 = new Employee(); 12 employee1.setLastName("zhumama"); 13 employee1.setEmail("zhumama@166.com"); 14 Employee employee2 = new Employee(); 15 employee2.setLastName("zhubaba"); 16 employee2.setEmail("zhubaba@166.com"); 17 Listlist = new ArrayList (); 18 list.add(employee1); 19 list.add(employee2); 20 mapper.insertEmps(list); 21 } catch (Exception e) { 22 // TODO: handle exception 23 } finally { 24 if (openSession != null) { 25 openSession.close(); 26 } 27 28 } 29 }
六:内置参数:_parameter、_databaseId
mybatis默认两个内置参数:
1._parameter:代表整个参数
- 单参数:_parameter就是这个参数
- 多个参数:参数会封装为一个map;_parameter就代表整个参数
2._databaseId:如果配置了 DatabaseIdProvider标签 那么 databaseId 就是当前数据库的别名
全局配置文件:
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 <properties resource="dbconfig.properties">properties> 7 8 <environments default="development"> 9 <environment id="development"> 10 <transactionManager type="JDBC" /> 11 <dataSource type="POOLED"> 12 <property name="driver" value="${jdbc.driver}" /> 13 <property name="url" value="${jdbc.url}" /> 14 <property name="username" value="${jdbc.username}" /> 15 <property name="password" value="${jdbc.password}" /> 16 dataSource> 17 environment> 18 <environment id="development_mysql2"> 19 <transactionManager type="JDBC" /> 20 <dataSource type="POOLED"> 21 <property name="driver" value="${jdbc2.driver}" /> 22 <property name="url" value="${jdbc2.url}" /> 23 <property name="username" value="${jdbc2.username}" /> 24 <property name="password" value="${jdbc2.password}" /> 25 dataSource> 26 environment> 27 environments> 28 29 <databaseIdProvider type="DB_VENDOR"> 30 31 <property name="MySQL" value="mysql" /> 32 <property name="Oracle" value="oracle" /> 33 <property name="SQL Server" value="sqlserver" /> 34 databaseIdProvider> 35 <mappers> 36 <package name="dao" /> 37 mappers> 38 configuration>
接口文件EmployeeMapper.java:
ListgetEmpsTestInnerParam(Employee employee);
映射文件EmployeeMapper.xml
1 <select id="getEmpsTestInnerParam" parameterType="entity.Employee" resultType="entity.Employee"> 2 3 4 <if test="_databaseId=='mysql'"> 5 select * from tbl_employee 6 <if test="_parameter!=null"> 7 <where> 8 <if test="id!=null"> 9 id=#{id} 10 if> 11 <if test="lastName!=null"> 12 <bind name="_lastanme" value="'%'+lastName+'%'"/> 13 and last_name like #{_lastanme} 14 if> 15 where> 16 if> 17 if> 18 select>
junit测试类:
1 @Test 2 public void test06() { 3 String resource = "mybatis-config.xml"; 4 SqlSession openSession = null; 5 try { 6 InputStream inputStream = Resources.getResourceAsStream(resource); 7 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 8 // 获取openSession 不会自动提交数据 9 openSession = sqlSessionFactory.openSession(true); 10 EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class); 11 Listlist = mapper.getEmpsTestInnerParam(null); 12 System.out.println(list); 13 Employee employee = new Employee(); 14 // employee.setId(1); 15 employee.setLastName("zhu"); 16 List list1 = mapper.getEmpsTestInnerParam(employee); 17 System.out.println(list1);// List list2 = mapper.getListSqlSegment(null); 18 } catch (Exception e) { 19 // TODO: handle exception 20 } finally { 21 if (openSession != null) { 22 openSession.close(); 23 } 24 25 } 26 }
运行结果:
[Employee [id=9, lastName=null, email=zhumama@166.com, gender=null], Employee [id=10, lastName=null, email=zhubaba@166.com, gender=null], Employee [id=11, lastName=null, email=zhumama@166.com, gender=null], Employee [id=12, lastName=null, email=zhubaba@166.com, gender=null], Employee [id=13, lastName=null, email=zhumama@166.com, gender=null], Employee [id=14, lastName=null, email=zhubaba@166.com, gender=null], Employee [id=27, lastName=null, email=zhumama@166.com, gender=null], Employee [id=28, lastName=null, email=zhubaba@166.com, gender=null], Employee [id=29, lastName=null, email=zhumama@166.com, gender=null], Employee [id=30, lastName=null, email=zhubaba@166.com, gender=null], Employee [id=31, lastName=null, email=zhumama@166.com, gender=null], Employee [id=32, lastName=null, email=zhubaba@166.com, gender=null]]
七 、sql 片段
抽取可重用的SQL 片段 方便以后引用
1.sql抽取,经常将要查询的类名,或者插入用的列名抽取出来方便引用
2.include 来引用已经抽取的SQL
3.include 还可以自定义一些property SQL标签内部就能使用自定义属性
include-property:取值的正确方式${prop}
#{不能使用这种方式}
例如:
应用实例举例:
接口文件EmployeeMapper.java:
ListgetListSqlSegment(Employee employee);
映射文件EmployeeMapper.xml
1 <select id="getListSqlSegment" resultType="entity.Employee"> 2 select 3 4 <include refid="searchColumn">include> 5 from tbl_employee 6 where 1=1 7 9 <if test="lastName!='' and lastName!=null"> 10 and last_name like #{lastName} 11 if> 12 <if test="email!='' and email!=null"> 13 and email like #{email} 14 if> 15 <if test="gender!='' and gender!=null"> 16 and gender like #{gender} 17 if> 18 19 select>
1 <sql id="searchColumn"> 2 id as id, 3 last_name as lastName, 4 email as email, 5 gender as gender 6 sql>
junit测试类:
1 @Test 2 public void test06() { 3 String resource = "mybatis-config.xml"; 4 SqlSession openSession = null; 5 try { 6 InputStream inputStream = Resources.getResourceAsStream(resource); 7 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 8 // 获取openSession 不会自动提交数据 9 openSession = sqlSessionFactory.openSession(true); 10 EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class); 11 Listlist2 = mapper.getListSqlSegment(null); 12 System.out.println(list2); 13 } catch (Exception e) { 14 // TODO: handle exception 15 } finally { 16 if (openSession != null) { 17 openSession.close(); 18 } 19 20 } 21 }
运行结果:
[Employee [id=1, lastName=joy33333, email=joy52112225@iclound.com, gender=女], Employee [id=2, lastName=joy2x22222, email=joy52112225@iclound.com, gender=男], Employee [id=4, lastName=joy, email=joy521125@iclound.com, gender=女], Employee [id=5, lastName=joy, email=joy521125@iclound.com, gender=女], Employee [id=6, lastName=joy, email=joy521125@iclound.com, gender=女], Employee [id=7, lastName=joy, email=1602211057@qq.com, gender=女], Employee [id=8, lastName=joy, email=1602211058@qq.com, gender=女], Employee [id=9, lastName=zhumama, email=zhumama@166.com, gender=null], Employee [id=10, lastName=zhubaba, email=zhubaba@166.com, gender=null], Employee [id=11, lastName=zhumama, email=zhumama@166.com, gender=null], Employee [id=12, lastName=zhubaba, email=zhubaba@166.com, gender=null], Employee [id=13, lastName=zhumama, email=zhumama@166.com, gender=null], Employee [id=14, lastName=zhubaba, email=zhubaba@166.com, gender=null], Employee [id=15, lastName=Tom, email=678@qq.com, gender=男], Employee [id=16, lastName=Tom, email=678@qq.com, gender=男], Employee [id=17, lastName=Tom, email=678@qq.com, gender=男], Employee [id=18, lastName=Tom, email=678@qq.com, gender=男], Employee [id=19, lastName=Tom, email=678@qq.com, gender=男], Employee [id=20, lastName=Tom, email=678@qq.com, gender=男], Employee [id=21, lastName=Tom, email=678@qq.com, gender=男], Employee [id=22, lastName=Tom, email=678@qq.com, gender=男], Employee [id=23, lastName=Tom, email=678@qq.com, gender=男], Employee [id=25, lastName=joy1111, email=joy521125@icloud.com, gender=女], Employee [id=26, lastName=joy222, email=joy521125@icloud.com, gender=女], Employee [id=27, lastName=zhumama, email=zhumama@166.com, gender=null], Employee [id=28, lastName=zhubaba, email=zhubaba@166.com, gender=null], Employee [id=29, lastName=zhumama, email=zhumama@166.com, gender=null], Employee [id=30, lastName=zhubaba, email=zhubaba@166.com, gender=null], Employee [id=31, lastName=zhumama, email=zhumama@166.com, gender=null], Employee [id=32, lastName=zhubaba, email=zhubaba@166.com, gender=null]]