Mybatis-plus
Spring整合Mybatis-Plus
- 上面的快速开始我们介绍了通过SpringBoot整合MyBatis-Plus
添加依赖
加入Spring依赖和数据库JDBC依赖后还需要加入Mybatis-Plus的依赖
引入 MyBatis-Plus
之后请不要再次引入 MyBatis
以及 MyBatis-Spring
,以避免因版本差异导致的问题。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.15</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.11</version>
</dependency>
配置
MyBatis-Plus 的配置异常的简单,我们仅需要一些简单的配置即可使用 MyBatis-Plus 的强大功能!
配置 MapperScan spring.xml
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dyw.mapper"/>
</bean>
日志
要想使用mybatis-plus的日志功能 需要在application.yml中添加如下语句
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
CRUD接口
Service CRUD 接口
说明:
通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用
get 查询单行
remove 删除
list 查询集合
page 分页
前缀命名方式区分Mapper
层避免混淆,泛型
T
为任意实体对象建议如果存在自定义通用 Service 方法的可能,请创建自己的
IBaseService
继承Mybatis-Plus
提供的基类对象
Wrapper
为 条件构造器@SuppressWarnings("all") public interface BookService extends IService<Book> { //boolean save(Book book); //boolean update(Book book); //boolean delete(Integer id); //Book getById(Integer id); List<Book> getAll(); }
可以追加自定义操作 需要自己编写方法实体 模板如下
@Service @SuppressWarnings("all") public class BookServiceImpl extends ServiceImpl<BookMapper,Book> implements BookService{ @Autowired private BookMapper mapper;
@Override public List<Book> getAll() { return null; }
}
Mapper CRUD 接口
说明:
- 通用 CRUD 封装BaseMapper (opens new window)接口,为
Mybatis-Plus
启动时自动解析实体表关系映射转换为Mybatis
内部对象注入容器- 泛型
T
为任意实体对象- 参数
Serializable
为任意类型主键Mybatis-Plus
不推荐使用复合主键约定每一张表都有自己的唯一id
主键- 对象
Wrapper
为 条件构造器
以下是Mapper接口中的CRUD方法介绍
一:查询
- selectById() 通过单个主键值查询 只需要传入主键值即可 SELECT id,name FROM people WHERE id=?
/**
* selectById 根据单个主键值查询
* 参数:主键值
* 返回值:实体对象
*/
People people1 = peopleMapper.selectById(1);
System.out.println(people1);
如果id值对应的行不存在 会返回空 所以一般使用会判断是否为空 再做其他操作
- selectBatchIds() 批处理查询 通过多个主键值的一个集合 来查询满足条件的数据 返回值是一个集合 如果没有满足条件的数据 则返回null SELECT id,name FROM people WHERE id IN ( ? , ? , ? )
/**
* selectBatchIds 批处理查询 根据多个主键值查询
* 参数:id的集合
* 返回值:集合List<T>
*/
List<Integer> collect = Stream.of(1, 2, 7).collect(Collectors.toList());
List<People> people1 = peopleMapper.selectBatchIds(collect);
System.out.println(people1);
for (People people2 : people1) {
System.out.println(people2);
}
- selectByMap() 通过将多条件字段字段封装到map中 通过读取map中的值来拼接条件 来实现 SELECT id,name FROM people WHERE name = ? AND id = ?
/**
* selectMap 使用map封装多条件字段查询
* 参数:Map<String,Object>
* 返回值:集合List<T>
*/
HashMap<String, Object> map = new HashMap<>();
map.put("id",1);
map.put("name","易顺坤");
List<People> people1 = peopleMapper.selectByMap(map);
for (People people2 : people1) {
System.out.println(people2);
}
4.selectList() 通过传入实体类 更具实体类中的字段值解析为条件 查询
…
注意: 当select操作条件为null时默认查询表中全部数据
二:更新
- updateById(实体类对象);
通过传入实体类对象根据实体类对象中的声明主键的值, 自动生成where条件 where id=? , 然后以实体类中的其他非null属性的值对表中的数据进行修改(注意:包装类的默认值是null 而基本数据类型默认值不一定是null 如int类型默认值是0)
/**
* 更新操作(update)
* 通过对象的形式传入要修改的数据 默认修改传入对象中非null属性的值
*/
@Test
public void contextLoads1(){
People people = new People();
people.setId(2);
people.setName("易顺坤");
/**
* updateById()顾名思义就是条件是根据id的
*/
int i = peopleMapper.updateById(people);
System.out.println(i>0?"cg":"sb");
List<People> people1 = peopleMapper.selectList(null);
for (People people2 : people1) {
System.out.println(people2);
}
}
三:删除
- deleteById 通过传入的实体类中声明的主键值 来生成where条件 delete from tablename where id = ? 也可以直接传入一个id值
int i = peopleMapper.deleteById(3);
/**************************************************/
People people = new People();
people.setId(2);
/**
* deleteById()顾名思义就是条件是根据id的
*/
int i = peopleMapper.deleteById(people);
- deleteByMap 将字段条件通过键值对的方式封装到map中 再调用deleteByMap方法 将map中的值读取填入where之后 多个字段以and方式连接 DELETE FROM people WHERE name = ? AND id = ?
/**
* deleteByMap()通过map存储条件字段键值对 多个字段 在where条件后用and连接
*
* DELETE FROM people WHERE name = ? AND id = ?
*/
HashMap<String, Object> map = new HashMap<>();
map.put("id",1);
map.put("name","丁杨维");
int i = peopleMapper.deleteByMap(map);
- deleteBatchIds 通过id批量删除 是通过in关键字 填入where条件关键字之后 DELETE FROM people WHERE id IN ( ? , ? )
deleteBatchIds() 批处理方式:使用多个主键值,删除数据
参数:Collection<? extends Serializable>
返回值删除的记录数
/**
* deleteBatchIds() 批处理方式:使用多个主键值,删除数据
* 参数:Collection<? extends Serializable>
* 返回值删除的记录数
*/
ArrayList<Integer> list = new ArrayList<>();
list.add(4);
list.add(6);
int i = peopleMapper.deleteBatchIds(list);
新知识:可以通过Stream.Of().collect(Collectors.toList())的方式创建List集合
List<?> list = Stream.of(Object,Object....).collect(Collectors.toList());
四:插入
- insert() 通过创建一个实体对象 再调用mapper的insert方法即可完成插入 INSERT INTO people ( name ) VALUES ( ? )
People people1 = new People(null, "fan");
int row = peopleMapper.insert(people1);