第一章-mybatisPlus概述

1实体类注解

mybatisPlus实体类注解

@TableName 作用于表名上,解决表名和实体类名不一致 @TableId(value = “oid”, type = IdType.AUTO) 作用与字段上,指定主键字段名,类型。

@TableField(value="数据库字段名”,exist=false) 注解其他属性:exist=boolean 是否存在于数据库

3mybatis逆向工程

详细介绍:https://mp.baomidou.com/config/generator-config.html#service-2

重要:若使用通用mapper时候需要调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory

1
2
3
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
</bean>

使用的mybatis-plus插件,功能强大,自动生成实体类。

全的pom.xml====

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
      <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.3.1</version>
      </dependency>
      <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.3.1.tmp</version>
      </dependency>  
      <!-- 模板引擎 -->
      <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity-engine-core</artifactId>
        <version>2.0</version>
      </dependency>

<!--Lombok-->
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
      </dependency>

<!--      日志记录-->
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
      </dependency>



<!-- 注意 当mapper.xml文件不在resource目录下 需要加入-->
<build>
<resources>
  <resource>
    <directory>src/main/java</directory>
    <includes>
      <include>**/*.xml</include>
    </includes>
  </resource>
  </resources>
</build>

1导包

集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突,但需要mybatis-plus-generator

1
2
3
4
5
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.3.1</version>
</dependency>

MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖:

  • 添加 代码生成器 依赖 (模版引擎默认为)
1
2
3
4
5
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.1.tmp</version>
</dependency>

需要新建一个生成类的文件进行生成。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package com.lsl.util;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

public class GenerateCode {
    public static void main(String[] args) {
// 需要构建一个 代码自动生成器 对象
        AutoGenerator mpg = new AutoGenerator();
        // 配置策略
        // 1、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");//获得当前用户的路径
        gc.setOutputDir(projectPath+"/mybatis-study/mybatis4-plus/src/main/java");//前面两个是模块名 生成到当前路径的java文件下
        gc.setAuthor("卢森林");
        gc.setOpen(false);//是否打开资源管理器
        gc.setFileOverride(false); // 是否覆盖
        gc.setServiceName("%sService"); // 去Service的I前缀 %s会自动填充表实体名
        gc.setIdType(IdType.AUTO);
        gc.setDateType(DateType.ONLY_DATE);
        //gc.setSwagger2(true); Swagger2接口文档
        mpg.setGlobalConfig(gc);
        //2、设置数据源
        DataSourceConfig dsc = new DataSourceConfig();
      //8.0要加上时区 serverTimezone=UTC
        dsc.setUrl("jdbc:mysql://localhost:3306/mysql1?useSSL=false&useUnicode=true&characterEncoding=utf8");
      //8.0 com.mysql.cj.jdbc.Driver
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);
        //3、包的配置
        PackageConfig pc = new PackageConfig();
         //pc.setModuleName("lx");//生成的包的路径 会在controller前加上lx,也会在parent设置的路径后加上.name
        pc.setParent("com.lx");//生成包路径的父路径

        pc.setEntity("entity");//实体类包的名称
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);
        //4、策略配置
        StrategyConfig strategy = new StrategyConfig();

         strategy.setInclude("zz_employee","zz_department"); //多表用逗号隔开,数组 输入表名,生成实体类,不写默认生成数据库所有的表
        //strategy.setExclude("books");
        strategy.setNaming(NamingStrategy.underline_to_camel);//表名策略,下划线转驼峰
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//列名策略,下划线转驼峰
        strategy.setEntityLombokModel(true); // 使用lombok;
        strategy.setLogicDeleteFieldName("deleted");
        // 自动填充配置
        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
        TableFill gmtModified = new TableFill("gmt_modified",
                FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreate);
        tableFills.add(gmtModified);
        strategy.setTableFillList(tableFills);
        // 乐观锁
        strategy.setVersionFieldName("version");
        strategy.setRestControllerStyle(false);//Rest风格的Controller

        strategy.setControllerMappingHyphenStyle(false); //localhost:8080/hello_id_2
        mpg.setStrategy(strategy);

        mpg.execute(); //执行
    }
}

image-20200402135518794

4plus分页插件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!--写法一:mybatis.xml中书写-->
<plugins>
    <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor" >
      <!-- COUNT SQL 解析.可以没有 -->
      <property name="countSqlParser" ref="countSqlParser"/>
    </plugin>
</plugins>

<!--写法二:创建sqlsessionFactory时书写-->
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
  <!-- 注入数据库连接池 -->
  <property name="dataSource" ref="dataSource"/>
  <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
  <property name="configLocation" value="classpath:mybatis-config.xml"/>
  <!--也可以不配置MyBatis全局配置文件,再这里说明-->
  <property name="mapperLocations" value="classpath:com/lx/mapper/xml/*.xml"></property>
  <property name="typeAliasesPackage" value="com.lx.entity"></property>
  <property name="plugins">
    <array>
      <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">
            <!-- COUNT SQL 解析.可以没有 -->
     				 <property name="countSqlParser" ref="countSqlParser"/>
      </bean>
    </array>
  </property>
</bean>

java类中使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  //创建page对象
        Page<ZzDepartment> page = new Page<>(1,3);

        //创建wrapper
        QueryWrapper<ZzDepartment> wrapper=new QueryWrapper<ZzDepartment>();
        wrapper.orderByDesc("oid");

        //调用分页方法
        bean.page(page,wrapper);
        //获得分页后的集合
        page.getRecords();

当前分页无法进行连接查询

建议自行编写方法扩展

1ZzDepartmentMapper接口中编写方法IPage<ZzDepartment> selectPageDept(Page<?> page);

21ZzDepartmentMapper.xml配置文件中编写

1
2
3
<select id="selectPageDept" resultType="zzDepartment">
    select * from zz_Department where oid>20
</select>

3service接口编写调用方法 IPage<ZzDepartment> findPageDept(Page<?> page);

4service实现类进行调用

1
2
3
4
5
6
7
    @Autowired
    ZzDepartmentMapper deptMapper;

    @Override
    public IPage<ZzDepartment> findPageDept(Page<?> page) {
        return deptMapper.selectPageDept(page);
    }

5Controller进行使用

1
2
3
4
5
6
QueryWrapper wrapper = new QueryWrapper();

Page<ZzDepartment> page = new Page<>(1,3);

deptService.findPageDept(page);
List<ZzDepartment> list = page.getRecords();

5service接口使用

调用service接口进行CRUD 通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class ZzDepartmentServiceImplTest  {

    //serviceImpl测试

    ZzDepartmentServiceImpl bean;
    @Before
    public void init(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
         bean = context.getBean(ZzDepartmentServiceImpl.class);;
    }

    //增
    @Test
    public void save(){
        ZzDepartment dept=new ZzDepartment();
        dept.setDeptName("thursday");
        bean.save(dept);
    }

    //删
    @Test
    public void delete(){
        bean.removeById(45);//按照id删除一个
        
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("oid",47);
        map.put("phone","123456");
        bean.removeByMap(map);//多个条件 phone = ? AND oid = ? 

    }

    //改
    @Test
    public void update(){
        ZzDepartment dept=new ZzDepartment();
        dept.setOid(19);
        dept.setDeptName("总部");

        UpdateWrapper<ZzDepartment> wrapper = new UpdateWrapper<ZzDepartment>();
        wrapper.eq("oid",19);

        bean.update(dept,wrapper);
    }

    //查询
    @Test
    public void find(){
        //bean.list();

        QueryWrapper<ZzDepartment> wrapper = new QueryWrapper<>();
        //wrapper.groupBy("oid");
        //wrapper.eq("oid",15);
        //wrapper.orderBy(true,false,"oid");
       // wrapper.order
      //wrapper.like(boolean,"oid",15);//boolean条件是否生效
        bean.list(wrapper);
    }
}

6mapper使用

mapper使用的是insert,update,delete,select和service接口进行区分

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public void mapperSave(){
    //增加
    ZzDepartment dept=new ZzDepartment();
    dept.setDeptName("命名");
    //mapper.insert(dept);

    //删
    QueryWrapper wrapper = new QueryWrapper();
    wrapper.eq("oid",50);
   mapper.delete(wrapper);


    //查询
    mapper.selectById(48);

    //修改
    QueryWrapper wrapper = new QueryWrapper();
    wrapper.eq("phone",12345);
    dept.setAddress("nonono");
    mapper.update(dept,wrapper);//这里是批量修改,dept是修改的数据,mapper是修改条件
}

7修改注意

mybatis修改对象的时候,若某个属性为null,那么就不会进行修改。(要么前端传递参数为null,或者后端进行判断,再或者前端不传递该属性名)


若是json格式 若没有属性名称:则为空 若由属性名称:可以给Null,undefined。

最好是进行判断 Integer是不为Null不为0,String不为null不为””

第2章-pagehepler

1什么是pagehepler

文档教程https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

2快速入门

1导入依赖

1
2
3
4
5
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.11</version>
</dependency>

2 配置拦截器插件

特别注意,新版拦截器是 com.github.pagehelper.PageInterceptorcom.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。

1. 在 MyBatis 配置 xml 中配置拦截器插件(还可以在spring中配置,具体看官网)

下面介绍两个常用属性。

helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 指定分页插件使用哪种方言。缩写值:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby

reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!----------------mybatis.xml配置---------------------->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!-- 
    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?, settings?, 
    typeAliases?, typeHandlers?, 
    objectFactory?,objectWrapperFactory?, 
    plugins?, 
    environments?, databaseIdProvider?, mappers?
-->
    <settings>
      <!--打印sql-->
        <setting name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl"/>
    </settings>
    <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
            <property name="helperDialect" value="mysql"/>
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>
</configuration>


<!----------------Spring配置---------------------->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <!-- 注意其他配置 -->
  <property name="plugins">
    <array>
      <bean class="com.github.pagehelper.PageInterceptor">
        <property name="properties">
          <!--使用下面的方式配置参数,一行配置一个 -->
          <value>
            params=value1
          </value>
        </property>
      </bean>
    </array>
  </property>
</bean>

3 在代码中使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//pagehepler分页展示所有商品
@RequestMapping(value = "/pageCommodity",method = RequestMethod.GET)
@ResponseBody
public PageInfo<Commodity> pageCommodity(Commodity commodity , HttpServletRequest request){
    //设置开始页和每页个数
    PageHelper.startPage(0,8);

    //查询数据
    List<Commodity> list = commodityService.list(null);

    //获得当前分页对象 可以给出两参数
    PageInfo<Commodity> pageInfo=new PageInfo<Commodity>(list);
   return pageInfo;
}

返回json格式的数据

total总数据, list数据, pageNum当前页数, pagesize每页大小, size当前数据个数,prePage上一页,pages总页数,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
    "total": 3, //总数据条数
    "list": [
        {
            "id": 10, 
            "cid": 2202004082140450600, 
            "cname": "阿萨德", 
            "price": 0.02
        }, 
        {
            "id": 12, 
            "cid": 4202004082149136400, 
            "cname": "了", 
            "price": 0.01
        }
    ], 
    "pageNum": 1, //当前页
    "pageSize": 8, //每页大小
    "size": 3, //当前返回数据条数
    "startRow": 1, //开始行
    "endRow": 3, //结束行
    "pages": 1, //总页数
    "prePage": 0, //上一页
    "nextPage": 0, //下一页
    "isFirstPage": true, //属于第一页吗
    "isLastPage": true, 
    "hasPreviousPage": false, 
    "hasNextPage": false, 
    "navigatePages": 8, //导航页码数 new PageInfo<Zhuanke>(list,导航页数);
    "navigatepageNums": [
        1
    ], 
    "navigateFirstPage": 1, 
    "navigateLastPage": 1
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//当前页
private int pageNum;

//每页的数量
private int pageSize;

//当前页的数量
private int size;

//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow; //从0开始

//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;

//总页数
private int pages;

//结果集(每页显示的数据)
private List<T> list;

//第一页
private int firstPage;

//前一页
private int prePage;

//是否为第一页
private boolean isFirstPage = false;

//是否为最后一页
private boolean isLastPage = false;

//是否有前一页
private boolean hasPreviousPage = false;

//是否有下一页
private boolean hasNextPage = false;

//导航页码数
private int navigatePages;

//所有导航页号
private int[] navigatepageNums;

第三章-generator

2快速入门

pom.xml导入插件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!--加入Jia包-->
<!--代码生成-->
<dependency>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-core</artifactId>
  <version>1.3.5</version>
</dependency>
</dependencies>

<!--插件 注意版本,和configuration子标签的顺序-->
 <plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.5</version>

        <configuration>
          <verbose>true</verbose>
          <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
          <overwrite>true</overwrite>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.42</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>

generatorConfig.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">

        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mysql1?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8"
                        userId="root"
                        password="123456">
        </jdbcConnection>
        <!--生成entity类存放位置-->
        <javaModelGenerator targetPackage="com.lsl.entity" targetProject="src/main/java">
        </javaModelGenerator>

        <!--生成映射文件存放位置-->
        <sqlMapGenerator targetPackage="com.lsl.mapper.xml" targetProject="src/main/java">
            <!-- <property name="enableSubPackages" value="true"/>-->
        </sqlMapGenerator>

        <!--生成Dao类存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.lsl.mapper"
                             targetProject="src/main/java">
            <!--<property name="enableSubPackages" value="true"/>-->
        </javaClientGenerator>

        <table tableName="zz_employee" domainObjectName="Employee">
        </table>

    </context>
</generatorConfiguration>

然后点击Maven插件,进行run就好了

若是ssm项目,进行测试image-20200604175052245

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
@Service
public class EmployeeServiceImpl {
@Autowired
    EmployeeMapper empMapper;
    public void t1(){
        System.out.println("ssssss");
        empMapper.selectByPrimaryKey(3);
    }
}

//测试类进行测试
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
         bean =  context.getBean(EmployeeServiceImpl.class);
bean.t1();

3方法Example

EmployeeExample生成的Example方法

image-20200605100135046

image-20200605100123659

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//升序还是降序
//参数格式:字段+空格+asc(desc)
protected String orderByClause;

//去除重复
//true是选择不重复记录
protected boolean distinct;

//自定义查询条件
//Criteria的集合,集合中对象是由or连接
protected List<Criteria> oredCriteria;

//内部类Criteria包含一个Cretiron的集合,
//每一个Criteria对象内包含的Cretiron之间
//是由AND连接的
public static class Criteria extends GeneratedCriteria {
  protected Criteria() {
    super(); 
  }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 EmployeeExample example=new EmployeeExample();
//按照oid降序排列
    example.setOrderByClause("oid desc");

//给一个限制条件 oid 小于等于6
EmployeeExample.Criteria criteria = example.createCriteria();
criteria.andOidLessThanOrEqualTo(6);//oid 小于等于6

//第二个限制条件 性别为男
 criteria.andSexEqualTo("男");

//限制条件 模糊查询
criteria.andEmpnameLike("萨达所%");

//若查询条件为or 就创建多个criteria就好了
EmployeeExample.Criteria criteria1 = example.createCriteria();
criteria1.andSexEqualTo("女");

//条件多个 加个 example.or(criteria2); 
EmployeeExample.Criteria criteria2 = example.createCriteria();
criteria2.andSexEqualTo("女");
example.or(criteria2);

empMapper.selectByExample(example);