什么是mybaties
- MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用XML或注解进行配置和映射,MyBatis通过将参数映射到配置的SQL形成最终执行的SQL语句,最后将执行SQL的结果映射成Java对象返回
为什么MyBatis却越来越受欢迎呢?
- 1.不方便的全表映射,比如更新时需要发送所有的字段
- 2.无法根据不同的条件组装不同sql
- 3.对多表关联和复制sql查询支持较差
- 4.有HQL但性能较差,做不到sql优化
- 5.不能有效支持存储过程
MyBatis-Plus 插件(一个Mybatis框架的增强插件)
- 1.只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 2.只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间
- 3.热加载、代码生成、分页、性能分析等功能一应俱全
- 4.3.X系列支持lambda语法,让我在写条件构造的时候少了很多的"魔法值",从代码结构上更简洁
引入依赖
<!-- mybatisPlus 核心库 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
配置
# 配置端口
server:
port: 8888
spring:
# 配置数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_student?useUnicode=true&characterEncoding=utf-8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
# mybatis-plus相关配置
mybatis-plus:
# xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
mapper-locations: classpath:mapper/*.xml
# 以下配置均有默认值,可以不设置
global-config:
db-config:
#主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
id-type: auto
#字段策略 IGNORED:"忽略判断" NOT_NULL:"非 NULL 判断") NOT_EMPTY:"非空判断"
field-strategy: NOT_EMPTY
#数据库类型
db-type: MYSQL
configuration:
# 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
map-underscore-to-camel-case: true
# 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
call-setters-on-nulls: true
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
基础类
启动类增加扫描包注解
@MapperScan(basePackages = {"com.mp.demo.dao"}) //扫描DAO
Config配置类(配置分页插件)
/**
* @Description MybatisPlus配置类
*/
@Configuration
public class MybatisPlusConfig {
/**
* mybatis-plus SQL执行效率插件
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
Dao类
/**
* @Description 用户信息DAO
*/
public interface UserInfoDao extends BaseMapper<UserInfoEntity> {
}
Service类
/**
* @Description 用户业务接口
*/
public interface UserInfoService extends IService<UserInfoEntity> {
}
ServiceImpl类
/**
* @Description 用户业务实现
*/
@Service
@Transactional
public class UserInfoSerivceImpl extends ServiceImpl<UserInfoDao, UserInfoEntity> implements UserInfoService {
}
MyBatis-Plus基础使用
根据ID获取用户信息
@GetMapping("/getInfo/{userId}")
public UserInfoEntity getInfo(@PathVariable("userId") String userId) {
UserInfoEntity userInfoEntity = userInfoService.getById(userId);
return userInfoEntity;
}
查询全部信息
@GetMapping("/getList")
public List<UserInfoEntity> getList() {
List<UserInfoEntity> userInfoEntityList = userInfoService.list();
return userInfoEntityList;
}
分页查询全部数据
@GetMapping("/getInfoListPage")
public IPage<UserInfoEntity> getInfoListPage() { //IPage<UserInfoEntity> 分页数据
//需要在Config配置类中配置分页插件
IPage<UserInfoEntity> page = new Page<>();
page.setCurrent(1); //页数
page.setSize(3); //每页条数
//条件构造
QueryWrapper queryWrapper =new QueryWrapper();
queryWrapper.ge("age", 22);
page = userInfoService.page(page,queryWrapper);
return page;
}
指定字段查询用户信息
@GetMapping("/getList")
public Collection<UserInfoEntity> getListMap() {
Map<String, Object> map = new HashMap<>();
//key:字段名 value:值
map.put("name", "小赵");
Collection<UserInfoEntity> userInfoList = userInfoService.listByMap(map);
return userInfoList;
}
新增
@GetMapping("/saveInfo")
public void saveInfo() {
UserInfoEntity userInfoEntity = new UserInfoEntity();
userInfoEntity.setName("小赵");
userInfoEntity.setAge(18);
userInfoService.save(userInfoEntity);
}
批量新增
@GetMapping("/saveInfoList")
public void saveInfoList() {
//创建对象
UserInfoEntity xiaoli = new UserInfoEntity();
sans.setName("小李");
sans.setAge(18);
UserInfoEntity xiaozhao = new UserInfoEntity();
papyrus.setName("小赵");
papyrus.setAge(18);
//批量保存
List<UserInfoEntity> list = new ArrayList<>();
list.add(xiaoli);
list.add(xiaozhao);
userInfoService.saveBatch(list);
}
更新
@GetMapping("/updateInfo")
public void updateInfo() {
//根据实体中的ID去更新,其他字段如果值为null则不会更新该字段,参考yml配置文件
UserInfoEntity userInfoEntity = new UserInfoEntity();
userInfoEntity.setId(1);
userInfoEntity.setAge(19);
userInfoService.updateById(userInfoEntity);
}
新增或者更新
@GetMapping("/saveOrUpdate")
public void saveOrUpdate() {
//实体类ID值存在,如果数据库存在ID就会更新,如果不存在就会新增
UserInfoEntity userInfoEntity = new UserInfoEntity();
userInfoEntity.setId(1);
userInfoEntity.setAge(20);
userInfoService.saveOrUpdate(userInfoEntity);
}
根据ID删除
@DeleteMapping("/deleteInfo/{userId}")
public void deleteInfo(@PathVariable("userId") String userId) {
userInfoService.removeById(userId);
}
根据ID批量删除
@GetMapping("/deleteList")
public void deleteInfoList() {
List<String> userIdlist = new ArrayList<>();
userIdlist.add("1");
userIdlist.add("2");
userInfoService.removeByIds(userIdlist);
}
根据指定字段删除
@GetMapping("/deleteInfo")
public void deleteInfoMap() {
//key:字段名 value:值
Map<String, Object> map = new HashMap<>();
map.put("name", "小李");
map.put("age", 10);
userInfoService.removeByMap(map);
}
条件构造器(QueryWrapper)
查询 | 说明 |
---|---|
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句 |
and | AND 语句 |
or | OR 语句 |
eq | 等于 |
allEq | 基于 map 内容等于 |
ne | 不等于<> |
gt | 大于 |
ge | 大于等于 |
lt | 小于 |
le | 小于等于 |
like | 模糊查询 |
notLike | 模糊查询 |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | 非 NULL 值查询 |
groupBy | 分组查询 |
having | 关键词查询 |
orderBy | 排序 |
orderByAsc | ASC 排序 |
orderByDesc | DESC 排序 |
exists | 果子查询(返回包含行,则返回 TRUE) |
notExists | |
between | BETWEEN 查询 |
notBetween | |
addFilter | 自由拼接 |
last | 拼接在最后, 例:last("LIMIT 10") |