MyBatis-Generator使用MyBatis3进行代码生成

自动生成的MyBatis3样式的代码,会给每个Java对象创建一个额外的Example对象。
在这里插入图片描述
这个Example对象主要是用来进行复杂查询的,它里面有一个静态内部类Criteria,可以理解为专门用来保存查询条件的类。
在这里插入图片描述
在进行复杂条件查询时,有专门的语句,studentDao为类对应的接口,而example表示存储查询条件即Criteria的对象,对应你要查询的Java对象(Student)的MBG帮你创建的。

List<Student> students = studentDao.selectByExample(example);

当我们要进行复杂条件查询时:
首先创建一个Java对象复杂查询的对象即xxxx对象对应的xxxxExample对象。

StudentExample example = new StudentExample();

然后通过example创建一个Criteria对象:

StudentExample.Criteria criteria2 = example.createCriteria();

Criteria是继承了GeneratedCriteria类,GeneratedCriteria类中有很多判断条件,都是大部分都是and。
在这里插入图片描述
在这里插入图片描述
如果想要进行or条件的判断,需要使用两个criteria进行组合。

        StudentExample.Criteria criteria = example.createCriteria();
        criteria.andNameLike("%飞%").andAgeGreaterThan(15L);
        StudentExample.Criteria criteria2 = example.createCriteria();
        criteria2.andNameLike("%张%");
        example.or(criteria2);// 进行组合

最终拼接的sql语句应该是:

select id,name,email,age from student where (name like "%飞%" and age > 15) or (name like "%张%")

同时应该注意Criteria创建的先后顺序:
or中的参数只能是后创建的Criteria对象!!!

否则会出现错误。
下面是or中参数为先创建的Criteria对象,拼接结果为:

select id, name, email, age from student WHERE ( name like ? ) or( name like ? ) 

底层可能是使用栈来进行Criteria的存储。每次进行or操作,stack执行pop()两次,将第二次pop获得的Criteria和第一次pop得到的Criteria进行拼接(将传入参数和pop两次操作后的Criteria进行拼接):

c1 = createrCriteria();
c2 = createrCriteria();
栈中的顺序:栈底 c1,c2 栈顶 
c2 = stack.pop();
c1 = stack.pop();
拼接=====> c1 or c2

如果or中的参数是第一次创建的criteria(即最先入栈的c1),那么执行or操作时

拼接结果:c1 or c1

完整测试代码:

@Test
    public void test02(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//        1、封装查询对象example
        StudentExample example = new StudentExample();
//        2、创建一个criteria,criteria就是拼装查询的条件
//        若要进行or条件的判断,可使用critera进行拼接
        StudentExample.Criteria criteria = example.createCriteria();
        criteria.andNameLike("%飞%").andAgeGreaterThan(15L);
                StudentExample.Criteria criteria2 = example.createCriteria();
        criteria2.andNameLike("%张%");
//        3、所有的复杂条件都是通过selectByExample进行查询的,传入一个example对象,因为criteria是student一个属性
//        将后面创建的criteria使用or条件拼接:注意只能按顺序来
        example.or(criteria2);
        List<Student> students = studentDao.selectByExample(example);
        for (Student student : students) {
            System.out.println(student);
        }
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值