MybatisPlus
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具
,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 MybatisPlus的特性 操作简单,仅仅只需继承一个BaseMapper就可以完成,实现单一,批量,分页等等一系列操作,很大的减少了开发负担,但这仅仅是Mybatisplus的冰山一角,当我们需要多条件查询的时候,就会使用到MybatisPlus中强大的条件构造器EntityWrapper;
- 无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性
- 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring
- 损耗小:
启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击
- 通用CRUD操作:
内置通用 Mapper
、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 - 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
- 支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
- 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
- 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
- 内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
- 内置性能分析插件:
可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作
Maven导入MybatisPlus依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.0-gamma</version>
</dependency>
通用的CRUD操作
假设我们有一张user表,我们需要对这个表进行增删改查操作,如果说没有代码生成的话,在mybatis我们需要编写UserMapper接口,手写CRUD方法,在UserMapper.xml文件中写对应的sql语句
,但是,在MybatisPlus中,我们只需要创建UserMapper接口,继承BaseMapper接口,就可以完成CRUD操作,甚至不需要创建SQl映射文件。
public interface UserMapper extends BaseMapper<User>{
然后,我们就写一些基本的单元测试方法,测试我们的CRUD,来到我们的测试类中,如下:
public class TestMp { private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); private UserMapper userMapper = ioc.getBean("userMapper",UserMapper.class); }
保存一条数据userMapper.insert(user);
@Test
public void insert(){
User user = new User();
user.setUserName("luokangyuan");
user.setAge(66);
user.setEmail("2356775645@qq.com");
user.setGender(2);
Integer result = userMapper.insert(user);
System.out.println(result);
// 直接获取插入数据返回的自增主键值
System.out.println(user.getId()+"======");
}
更新一条数据
@Test
public void update(){
User user = new User();
user.setId(7);
user.setUserName("王八");
user.setAge(56);
//user.setEmail("2356775645@qq.com");
user.setGender(2);
Integer result = userMapper.updateById(user);
}
同理:更新方法也有两个updateById和updateAllColumnById
,前者会对实体类属性名进行非空校验,为空的就不会出现在sql语句中,也就是不会更新原有数据,后者是会更新所有列,如果实体类属性值为空,则数据库对应字段名更新为null;
查询一条数据
@Test
public void select(){
// 1.通过ID查询一条数据
User user = userMapper.selectById(7);
// 2.通过多个列进行查询,如果查处的数据有多条就会报错
User u = new User();
u.setId(2);
u.setUserName("张三");
User user1 = userMapper.selectOne(u);
// 3.查询符合多个ID的数据,使用的是in关键字查询
List<Integer> ids = new ArrayList<Integer>();
ids.add(3);
ids.add(4);
ids.add(5);
List<User> users = userMapper.selectBatchIds(ids);
// 4.通过封装map条件,注意的是封装的是列字段名,不是实体里属性名,
// map中的key充当sql中的条件名称
Map<String,Object> maps = new HashMap<String, Object>();
maps.put("user_name","张三");
maps.put("age",347);
List<User> users1 = userMapper.selectByMap(maps);
// 5.分页查询方法,查看第二页,每页2条数据,在sql语句并没有limit关键字
// 所以要实现物理分页,还需借助插件,例如mybatis的pageHepler或者MybatisPlus提供的分页插件
List<User> users2 = userMapper.selectPage(new Page<User>(2, 2), null);
}
删除一条数据
@Test
public void delete(){
// 1.根据ID删除
Integer integer = userMapper.deleteById(8);
// 2.根据条件删除,map中的key为列名,千万注意
Map<String ,Object> maps = new HashMap<String, Object>();
maps.put("age",66);
maps.put("gender",2);
Integer integer1 = userMapper.deleteByMap(maps);
// 3.根据ID批量删除,使用in关键字
List<Integer> ids = new ArrayList<Integer>();
ids.add(5);
ids.add(7);
Integer integer2 = userMapper.deleteBatchIds(ids);
}
在前面的CRUD中的分页查询返回的是list数据集合,但是在AR中返回的却是Page对象,如下
@Test
public void selectPage(){
User user = new User();
Page<User> userPage = user.selectPage(new Page<User>(1, 2),
new EntityWrapper<User>().like("user_name", "三"));
List<User> records = userPage.getRecords();
}
MybatisPlus全局配置
在前面的CRUD操作中,我们会使用直接注解指定主键生成策略和表名到实体类的映射,但是配置的仅仅会对当前实体类起作用,所以,引入了全局配置,如下:
<!-- 定义MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射-->
<property name="dbColumnUnderline" value="true"></property>
<!-- 全局的主键策略 -->
<property name="idType" value="0"></property>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tbl_"></property>
</bean>
然后,将MybatisPlus全局配置注入到sqlSessionFactoryBean中
<!-- 注入全局MP策略配置 -->
<property name="globalConfig" ref="globalConfiguration"></property>
来源:oschina
链接:https://my.oschina.net/u/4442945/blog/3163002