毕业后开始实习的第一天,是熟悉项目中用到的mybatis plus,发现与过去用到的mybatis简便了不少东西(至少xml的mapper文件不用写了),在此特地记录下mybatis的单表crud和分页查询,以及多表复杂查询.
创建用户表
CREATE TABLE `user` (
`id` INT ( 20 ) NOT NULL COMMENT '主键ID',
`name` VARCHAR ( 30 ) DEFAULT NULL COMMENT '姓名',
`age` INT ( 11 ) DEFAULT NULL COMMENT '年龄',
`email` VARCHAR ( 50 ) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
application.properties配置数据库信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url= jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
实体类
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
}
数据访问对象
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
服务层
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService<User> {
}
服务实现层
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.dao.UserMapper;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
控制层
@RestController
public class UserController {
@Autowired
private UserService userService;
}
在启动类中配置Mapper类的扫描路径
@SpringBootApplication
@MapperScan("com.example.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 批量插入
@RequestMapping("/saveBatch")
public Boolean saveBatch() {
List<User> list = new ArrayList<>();
for (int i = 1; i <21 ; i++) {
list.add(new User(i, "ckl"+i, 20+i, i+"@qq.com"));
}
Boolean insert = userService.saveBatch(list);
return insert;
}
浏览器访问http://localhost:8080/saveBatch
执行结果
- 插入单条记录
@RequestMapping("/save")
public Boolean save() {
User user = new User(0, "ckl0", 20, 0+"@qq.com");
Boolean insert = userService.save(user);
return insert;
}
执行结果
- 更新
@RequestMapping("/updateById")
public Boolean updateById() {
User user = new User(0, "ckl", 20, 0+"@qq.com");
Boolean insert = userService.updateById(user);
return insert;
}
执行结果
- 按主键查询单条记录
@RequestMapping("/getById")
public User getById() {
User user = userService.getById(0);
return user;
}
- 查询全部记录
@RequestMapping("/list")
public List<User> list() {
List users = userService.list();
return users;
}
- 用Wrapper实现复杂条件查询
@RequestMapping("/listByWrapper")
public List<User> listByWrapper() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
// 查询年龄在20到24之间,且不等于22岁的用户
queryWrapper.between("age", 20, 24).ne("age", 22);
List<User> users = userService.list(queryWrapper);
return users;
}
- 使用Map实现用任意字段查询
@RequestMapping("/listByMap")
public List listByMap() {
Map<String, Object> map = new HashMap<>();
// 查询年龄为25岁的用户
map.put("age", 25);
List count = userService.listByMap(map);
return count;
}
- 多表查询
因为mybatis plus没有对xml的支持,所以这里用crud的注解@Select来实现多表查询,本质上还是mybatis的内容
创建用户-角色表,并插入三条记录
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`user_id` int(11) NULL DEFAULT NULL,
`role_id` int(11) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES (0, 0);
INSERT INTO `user_role` VALUES (1, 1);
INSERT INTO `user_role` VALUES (2, 2);
SET FOREIGN_KEY_CHECKS = 1;
在UserMapper类中加入以下方法
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 根据用户名查找角色编号
@Select("select role_id " +
"from user_role " +
"where user_id=" +
"(select id " +
"from user " +
"where user.name=#{userName}) ")
Integer selectRoleByUserName(String userName);
}
UserService
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService<User> {
Integer selectRoleByUserName(String userName);
}
UserServiceImpl
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.dao.UserMapper;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Resource
private UserMapper userMapper;
@Override
public Integer selectRoleByUserName(String userName) {
return userMapper.selectRoleByUserName(userName);
}
}
控制层
@RequestMapping("/selectRoleByUserName")
public Integer selectRoleByUserName() {
// 查询用户名为ckl2对应的角色编号
Integer roleId = userService.selectRoleByUserName("ckl2");
return roleId;
}
- 分页查询
配置分页插件
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
@MapperScan("com.example.demo.dao")
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
return paginationInterceptor;
}
}
控制层
@RequestMapping("/page")
public IPage<User> page(Long current, Long size) {
Page<User> page = new Page<>();
// 当前页码
page.setCurrent(current);
// 每页显示的行数
page.setSize(size);
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
// 查询年龄在20到30之间的用户
queryWrapper.between("age", 20, 30);
IPage<User> iPage = userService.page(page,queryWrapper);
return iPage;
}
访问一下地址,将返回年龄在20到30之间的用户中,每页两条记录的时候,第二页中的内容
http://localhost:8080/page?current=2&size=2
很明显,第一页是20岁和21岁的记录,第二页是22和22岁的记录,上面的结果也对应了我们的预测
来源:CSDN
作者:傲雪当歌
链接:https://blog.csdn.net/qq_23355059/article/details/103676816