MyBatis的Mapper接口以及Example的实例函数及详解

  • Post author:
  • Post category:其他




MyBatis的Mapper接口以及Example的实例函数及详解



一、问题来由

   Date today = DateUtil.beginOfDay(new Date());
   FaaIndexSpExample spExample = new FaaIndexSpExample();
   spExample.createCriteria().andDealdateEqualTo(today).andPlateIdIn(new ArrayList<>(ids));
    List<FaaIndexSp> FaaIndexSpList = faaIndexSpMapper.selectByExample(spExample);



二、Mybatis逆向工程中生成的Example类

MyBatis Generator:简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。但是表连接、 存储过程等这些复杂sql的定义需要我们手工编写。

详细的逆向工程搭建工程见博客:https://www.cnblogs.com/HawkFalcon/p/7999583.html

在生成后的pojo类中,有一部分是名字为XxxExample的类出现。

img

​ 打开一个Example类我们会看到该类的三个成员变量:


img

​ distinct字段用于指定DISTINCT查询。

​ orderByClause字段用于指定ORDER BY条件,这个条件没有构造方法,直接通过传递字符串值指定。

​ oredCriteria字段用于自定义查询条件。

​ 这个类是专门用来对这个单表来查询的类,对该单表的CURD操作是脱离sql性质的(已经通过逆向工程生成相应的sql),直接在service层就可以完成相应操作。

​ 逆向工程生成的文件XxxExample.java中包含一个static 的内部类 Criteria ,在Criteria中有很多方法,主要是定义SQL 语句where后的查询条件。


img



三、mapper接口中的方法解析

mapper接口中的函数及方法

方法 功能说明
int countByExample(UserExample example) thorws SQLException 按条件计数
int deleteByPrimaryKey(Integer id) thorws SQLException 按主键删除
int deleteByExample(UserExample example) thorws SQLException 按条件查询
String/Integer insert(User record) thorws SQLException 插入数据(返回值为ID)
User selectByPrimaryKey(Integer id) thorws SQLException 按主键查询
ListselectByExample(UserExample example) thorws SQLException 按条件查询
ListselectByExampleWithBLOGs(UserExample example) thorws SQLException 按条件查询(包括BLOB字段)。只有当数据表中的字段类型有为二进制的才会产生。
int updateByPrimaryKey(User record) thorws SQLException 按主键更新
int updateByPrimaryKeySelective(User record) thorws SQLException 按主键更新值不为null的字段
int updateByExample(User record, UserExample example) thorws SQLException 按条件更新
int updateByExampleSelective(User record, UserExample example) thorws SQLException 按条件更新值不为null的字段



四、example实例解析

mybatis的逆向工程中会生成实例及实例对应的example,example用于添加条件,相当where后面的部分

xxxExample example = new xxxExample();

Criteria criteria = new Example().createCriteria();

方法 说明
example.setOrderByClause(“字段名 ASC”); 添加升序排列条件,DESC为降序
example.setDistinct(false) 去除重复,boolean型,true为选择不重复的记录。
criteria.andXxxIsNull 添加字段xxx为null的条件
criteria.andXxxIsNotNull 添加字段xxx不为null的条件
criteria.andXxxEqualTo(value) 添加xxx字段等于value条件
criteria.andXxxNotEqualTo(value) 添加xxx字段不等于value条件
criteria.andXxxGreaterThan(value) 添加xxx字段大于value条件
criteria.andXxxGreaterThanOrEqualTo(value) 添加xxx字段大于等于value条件
criteria.andXxxLessThan(value) 添加xxx字段小于value条件
criteria.andXxxLessThanOrEqualTo(value) 添加xxx字段小于等于value条件
criteria.andXxxIn(List<?>) 添加xxx字段值在List<?>条件
criteria.andXxxNotIn(List<?>) 添加xxx字段值不在List<?>条件
criteria.andXxxLike(“%”+value+”%”) 添加xxx字段值为value的模糊查询条件
criteria.andXxxNotLike(“%”+value+”%”) 添加xxx字段值不为value的模糊查询条件
criteria.andXxxBetween(value1,value2) 添加xxx字段值在value1和value2之间条件
criteria.andXxxNotBetween(value1,value2) 添加xxx字段值不在value1和value2之间条件



五、应用举例


注:在iBator逆向工程生成的文件XxxExample.java中包含一个static的内部类Criteria,Criteria中的方法是定义SQL 语句where后的查询条件。



1.查询



1、 selectByPrimaryKey()
User user = XxxMapper.selectByPrimaryKey(100); //相当于select * from user where id = 1001


2、 selectByExample() 和 selectByExampleWithBLOGs()
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("wyw");
criteria.andUsernameIsNull();
example.setOrderByClause("username asc,email desc");
List<?>list = XxxMapper.selectByExample(example);
//相当于:select * from user where username = 'wyw' and  username is null order by username asc,email desc1234567


3、基本字段查询
			// 1.使用criteria
   			Example example = new Example(User.class);
           	Criteria criteria = example.createCriteria();
            criteria.andEqualTo("name", name);
            criteria.andNotEqualTo("id", id);
            criteria.andEqualTo("userId", uid);
            List<User> list = userMapper.selectByExample(example);
            
            // 不使用criteria,实则example.and()本质底层还是返回的criteria,倒是可以简便写法。
            Example example = new Example(User.class);
			example.and()
                .andEqualTo("name", name)
                .andEqualTo("id", id)
                .andEqualTo("userId", uid);
				List<User> list = userMapper.selectByExample(example);
		等效于:select * from user where name = #{name} and id = #{id} and uid = #{uid}


4、and or 查询
	Example example = new Example(User.getClass());
        // where 条件
        Criteria criteria = example.createCriteria();
        Criteria criteria1 = example.createCriteria();
        
        criteria.andIn("id", ids);
        criteria1.orLike("des", "%" + des + "%");
        criteria1.orLike("name", "%" + name + "%");
        example.and(criteria1);
        example.and().andEqualTo("status", staus)
 等效于:where id in ( #{ids} ) and ( name like concat(%, #{name} ,%) or des like concat(%, #{des} ,%) ) and status = #{status} 


注意:如果不加 example.and(criteria1);,则默认example只添加生成的第一个criteria,criteria1 将不会加到此条件中



5、数组参数的条件查询
public Example test(List<String> names, String sex) {
		Example example = new Example(User.getClass());
		example.and().andEqualTo("sex", sex)
        Example.Criteria criteria = example.createCriteria();
        for (String str : names) {
             criteria.orLike("name", str);
         }
         example.and(criteria);
         List<User> list = userMapper.selectByExample(example);
            
 等效于:where sex = #{sex} and ( name like concat(%, #{name1} ,%) or name like concat(%, #{name2} ,%) )
}



2.插入数据

1、insert()

User user = new User();
user.setId("dsfgsdfgdsfgds");
user.setUsername("admin");
user.setPassword("admin")
user.setEmail("wyw@163.com");
XxxMapper.insert(user);
//相当于:insert into user(ID,username,password,email) values ('dsfgsdfgdsfgds','admin','admin','wyw@126.com');1234567



3.更新数据



1、updateByPrimaryKey()
User user =new User();
user.setId("dsfgsdfgdsfgds");
user.setUsername("wyw");
user.setPassword("wyw");
user.setEmail("wyw@163.com");
XxxMapper.updateByPrimaryKey(user);
//相当于:update user set username='wyw', password='wyw', email='wyw@163.com' where id='dsfgsdfgdsfgds'1234567


2、updateByPrimaryKeySelective()
User user = new User();
user.setId("dsfgsdfgdsfgds");
user.setPassword("wyw");
XxxMapper.updateByPrimaryKey(user);
//相当于:update user set password='wyw' where id='dsfgsdfgdsfgds'12345


3、 updateByExample() 和 updateByExampleSelective()
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("admin");
User user = new User();
user.setPassword("wyw");
XxxMapper.updateByPrimaryKeySelective(user,example);
//相当于:update user set password='wyw' where username='admin'1234567

updateByExample()更新所有的字段,包括字段为null的也更新,建议使用 updateByExampleSelective()更新想更新的字段



4.删除数据



1、deleteByPrimaryKey()
XxxMapper.deleteByPrimaryKey(1);  //相当于:delete from user where id=11


2、deleteByExample()
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("admin");
XxxMapper.deleteByExample(example);
//相当于:delete from user where username='admin'12345



5.查询数据数量

1、countByExample()

UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("wyw");
int count = XxxMapper.countByExample(example);
//相当于:select count(*) from user where username='wyw'



6、模糊查询及分页查询

  AgentExample agentExample = new AgentExample();
        AgentExample.Criteria criteria = agentExample.createCriteria();
        if (!StringUtils.isEmpty(name))
            criteria.andAgentNameLike("%" + name + "%");---模糊查询
        if (!StringUtils.isEmpty(agentLevel))
            criteria.andAgentLevelEqualTo(agentLevel);

        int startNum = (page - 1) * rows;

        agentExample.setPageSize(rows);   --分页查询中的一页数量
        agentExample.setStartRow(startNum);  --开始查询的位置



7、再次强调

or条件查询

--例如SQL语句
gent_ommission` WHERE gmt_create >= '2017-09-12 12:02:30'  AND '2017-09-12 15:07:42' >= gmt_create AND (agent_id=1  OR parent_agent_id=1 OR grandfather_agent_id=1) ORDER BY gmt_create LIMIT 0,10
AgentOmmissionExample example = new AgentOmmissionExample(); 
AgentOmmissionExample.Criteria criteria = example.createCriteria();

    if (!StringUtils.isEmpty(startTime))
        criteria.andGmtCreateGreaterThanOrEqualTo(sf.parse(startTime));
    if (!StringUtils.isEmpty(endTime))
        criteria.andGmtCreateLessThanOrEqualTo(sf.parse(endTime));
    criteria.andTypeEqualTo(1);

    if (agentId != null) {
        criteria.andAgentIdEqualTo(agentId);

        AgentOmmissionExample.Criteria criteria1 = example.createCriteria();
        criteria1.andParentAgentIdEqualTo(agentId);
        if (!StringUtils.isEmpty(startTime))
            criteria1.andGmtCreateGreaterThanOrEqualTo(sf.parse(startTime));
        if (!StringUtils.isEmpty(endTime))
            criteria1.andGmtCreateLessThanOrEqualTo(sf.parse(endTime));

        AgentOmmissionExample.Criteria criteria2 = example.createCriteria();
        criteria2.andGrandfatherAgentIdEqualTo(agentId);
        if (!StringUtils.isEmpty(startTime))
            criteria2.andGmtCreateGreaterThanOrEqualTo(sf.parse(startTime));
        if (!StringUtils.isEmpty(endTime))
            criteria2.andGmtCreateLessThanOrEqualTo(sf.parse(endTime));
        example.or(criteria1);
        example.or(criteria2);
    if (!StringUtils.isEmpty(startTime))
        criteria2.andGmtCreateGreaterThanOrEqualTo(sf.parse(startTime));
    if (!StringUtils.isEmpty(endTime))
        criteria2.andGmtCreateLessThanOrEqualTo(sf.parse(endTime));
    example.or(criteria1);
    example.or(criteria2);



版权声明:本文为New_Santa原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。