tkmybatis VS mybatisplus

本文章向大家介绍tkmybatis VS mybatisplus,主要包括tkmybatis VS mybatisplus使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

文章目录
TkMybatis Vs MybatisPlus
1.基础CRUD BaseMapper
2.代码生成器
3. 全局主键 Sequence主键
4. 热加载
5. 分页
Mybatis-Plus
Tk.Mybatis
6. 额外功能
Mybatis-Plus
Tk.Mybatis

TkMybatis Vs MybatisPlus
1.基础CRUD BaseMapper

基本一样,只是方法名不一样,tk和MBG更贴切

2.代码生成器
Mybatis-Plus

通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。对原生的MBG进行了封装,更友好

Tk-Mybatis

代码生成器是基于 MBG 插件的,所以需要配合 MBG 使用。更贴近原生

3. 全局主键 Sequence主键
Mybatis-Plus

oracle等数据库主键策略配置Sequence
实体类配置主键Sequence,指定主键@TableId(type=IdType.INPUT)//不能使用AUTO
支持父类定义@KeySequence, 子类使用,这样就可以几个表共用一个Sequence
针对各种数据库的策略

Tk-Mybatis、

全局ID生成器 Vesta、UUID

两种策略是不太一样的。@KeySql(genId = UUIdGenId.class) ,Mapper 4.0.2

4. 热加载
Mybatis-Plus

3.0.6版本上移除了该功能,不过最新快照版已加回来并打上废弃标识,3.1.0版本上已完全移除
多数据源配置多个 MybatisMapperRefresh 启动 bean
默认情况下,eclipse保存会自动编译,idea需自己手动编译一次
/**
 * 切莫用于生产环境(后果自负)
 * 

Mybatis 映射文件热加载(发生变动后自动重新加载).

*

方便开发时使用,不用每次修改xml文件后都要去重启应用.

* * @author nieqiurong * @since 2016-08-25 * @deprecated 2018-11-26 */

TK-Mybatis
不支持

5. 分页
Mybatis-Plus
分页插件

Tk.Mybatis
pagehelper

6. 额外功能
Mybatis-Plus
逻辑删除
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击
多数据源
Tk.Mybatis
乐观锁
支持分页 pagehelper
多数据源

mybatis-plus的BaseMapper简单使用
1、insert操作:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-dao.xml"})
public class test {
    @Autowired
    private EmplopyeeDao emplopyeeDao;
    @Test
    public void testInsert(){
        Employee employee = new Employee();
        employee.setLastName("东方不败");
        employee.setEmail("[email protected]");
        employee.setGender(1);
        employee.setAge(20);
        emplopyeeDao.insert(employee);
       emplopyeeDao. insertAllColumn(employee);
        //mybatisplus会自动把当前插入对象在数据库中的id写回到该实体中
        System.out.println(employee.getId());
    }
}

执行添加操作,直接调用insert,会根据实体类的每个属性进行非空判断,只有非空的属性所对应的字段才会出现在SQL语句中.。insertAllColumn,方法在插入时,不管属性是否为空,属性所对应的字段都会出现在SQL语句中。

2、update操作:

@Test
public void testUpdate(){
        Employee employee = new Employee();
        employee.setId(1);
        employee.setLastName("更新测试");
        //emplopyeeDao.updateById(employee);//根据id进行更新,没有传值的属性就不会更新
        emplopyeeDao.updateAllColumnById(employee);//根据id进行更新,没传值的属性就更新为null
}

:注意这两个update操作的区别,updateById方法,没有传值的字段不会进行更新,比如只传入了lastName,那么age、gender等属性就会保留原来的值;updateAllColumnById方法,顾名思义,会更新所有的列,没有传值的列会更新为null。

3、select操作:
(1)、根据id查询:

Employee employee = emplopyeeDao.selectById(1);

(2)、根据条件查询一条数据:

Employee employeeCondition = new Employee();
employeeCondition.setId(1);
employeeCondition.setLastName("更新测试");
//若是数据库中符合传入的条件的记录有多条,那就不能用这个方法,会报错
Employee employee = emplopyeeDao.selectOne(employeeCondition);

:这个方法的sql语句就是where id = 1 and last_name = 更新测试,若是符合这个条件的记录不止一条,那么就会报错。

(3)、根据查询条件返回多条数据:
当符合指定条件的记录数有多条时,上面那个方法就会报错,就应该用这个方法。

Map columnMap = new HashMap<>();
columnMap.put("last_name","东方不败");//写表中的列名
columnMap.put("gender","1");
List employees = emplopyeeDao.selectByMap(columnMap);
System.out.println(employees.size());

:查询条件用map集合封装,columnMap,写的是数据表中的列名,而非实体类的属性名。比如属性名为lastName,数据表中字段为last_name,这里应该写的是last_name。selectByMap方法返回值用list集合接收

(4)、通过id批量查询:

List idList = new ArrayList<>();
idList.add(1);
idList.add(2);
idList.add(3);
List employees = emplopyeeDao.selectBatchIds(idList);
System.out.println(employees);

注:把需要查询的id都add到list集合中,然后调用selectBatchIds方法,传入该list集合即可,该方法返回的是对应id的所有记录,所有返回值也是用list接收

(5)、分页查询

List employees = emplopyeeDao.selectPage(new Page<>(1,2),null);
System.out.println(employees);

:selectPage方法就是分页查询,在page中传入分页信息,后者为null的分页条件,这里先让其为null,讲了条件构造器再说其用法。这个分页其实并不是物理分页,而是内存分页。也就是说,查询的时候并没有limit语句。等配置了分页插件后才可以实现真正的分页。

4、delete操作:
(1)、根据id删除:

emplopyeeDao.deleteById(1);

(2)、根据条件删除:

Map columnMap = new HashMap<>();
columnMap.put("gender",0);
columnMap.put("age",18);
emplopyeeDao.deleteByMap(columnMap);

:该方法与selectByMap类似,将条件封装在columnMap中,然后调用deleteByMap方法,传入columnMap即可,返回值是Integer类型,表示影响的行数。

(3)、根据id批量删除:

List idList = new ArrayList<>();
idList.add(1);
idList.add(2);
emplopyeeDao.deleteBatchIds(idList);
注:该方法和selectBatchIds类似,把需要删除的记录的id装进idList,然后调用deleteBatchIds,传入idList即可。

五、条件构造器(EntityWrapper):

以上基本的 CRUD 操作,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法供使用, 可以极其方便的实现单一、批量、分页等操作,极大的减少开发负担。但是mybatis-plus的强大不限于此,请看如下需求该如何处理:
需求:
我们需要分页查询 tb_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢?
使用MyBatis : 需要在 SQL 映射文件中编写带条件查询的 SQL,并用PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。
使用MP: 依旧不用编写 SQL 语句,MP 提供了功能强大的条件构造器 ------ EntityWrapper。

接下来就直接看几个案例体会EntityWrapper的使用。

1、分页查询年龄在18 - 50且gender为0、姓名为tom的用户

List employees = emplopyeeDao.selectPage(new Page(1,3),
     new EntityWrapper()
        .between("age",18,50)
        .eq("gender",0)
        .eq("last_name","tom")
);

:由此案例可知,分页查询和之前一样,new 一个page对象传入分页信息即可。至于分页条件,new 一个EntityWrapper对象,调用该对象的相关方法即可。between方法三个参数,分别是column、value1、value2,该方法表示column的值要在value1和value2之间;eq是equals的简写,该方法两个参数,column和value,表示column的值和value要相等。注意column是数据表对应的字段,而非实体类属性字段。

2、查询gender为0且名字中带有老师、或者邮箱中带有a的用户:

List employees = emplopyeeDao.selectList(
                new EntityWrapper()
               .eq("gender",0)
               .like("last_name","老师")
                //.or()//和or new 区别不大
               .orNew()
               .like("email","a")
);

:未说分页查询,所以用selectList即可,用EntityWrapper的like方法进行模糊查询,like方法就是指column的值包含value值,此处like方法就是查询last_name中包含“老师”字样的记录;“或者”用or或者orNew方法表示,这两个方法区别不大,用哪个都可以,可以通过控制台的sql语句自行感受其区别。

3、查询gender为0,根据age排序,简单分页:

List employees = emplopyeeDao.selectList(
                new EntityWrapper()
                .eq("gender",0)
                .orderBy("age")//直接orderby 是升序,asc
                .last("desc limit 1,3")//在sql语句后面追加last里面的内容(改为降序,同时分页)
);

:简单分页是指不用page对象进行分页。orderBy方法就是根据传入的column进行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是将last方法里面的value值追加到sql语句的后面,在该案例中,最后的sql语句就变为select ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以进行降序排序和分页。

4、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:
条件构造器除了EntityWrapper,还有Condition。用Condition来处理一下这个需求:

List employees = emplopyeeDao.selectPage(
                new Page(1,2),
                Condition.create()
                        .between("age",18,50)
                        .eq("gender","0")
 );

注:Condition和EntityWrapper的区别就是,创建条件构造器时,EntityWrapper是new出来的,而Condition是调create方法创建出来。

5、根据条件更新:

@Test
public void testEntityWrapperUpdate(){
        Employee employee = new Employee();
        employee.setLastName("苍老师");
        employee.setEmail("[email protected]");
        employee.setGender(0);
        emplopyeeDao.update(employee,
                new EntityWrapper()
                .eq("last_name","tom")
                .eq("age",25)
        );
}

:该案例表示把last_name为tom,age为25的所有用户的信息更新为employee中设置的信息。

6、根据条件删除:

emplopyeeDao.delete(
        new EntityWrapper()
        .eq("last_name","tom")
        .eq("age",16)
);

:该案例表示把last_name为tom、age为16的所有用户删除。

你可能感兴趣的:(java,mybatis)