一、准备工作
1.1 数据库MySQL
下载安装过程略。
1.2 数据库可视化工具DBeaver
下载安装过程略。
1.3 表及数据的准备
-
创建表
CREATE TABLE `zx_user` ( `user_id` bigint(20) NOT NULL COMMENT '用户ID', `user_name` varchar(30) DEFAULT NULL COMMENT '用户姓名', `age` int(11) DEFAULT NULL COMMENT '用户年龄', `user_email` varchar(50) DEFAULT NULL COMMENT '用户邮箱', PRIMARY KEY (`user_id`), UNIQUE KEY `zx_user_un` (`user_id`), UNIQUE KEY `zx_user_un2` (`user_email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
插入测试数据
INSERT INTO zx_user (user_id, user_name, age, user_email) VALUES (1, 'Jone', 18, '[email protected]'), (2, 'Jack', 20, '[email protected]'), (3, 'Tom', 28, '[email protected]'), (4, 'Sandy', 21, '[email protected]'), (5, 'Billie', 24, '[email protected]');
1.4 SpringBoot工程下载
从start.spring.io
上下载一个SpringBoot工程,要求的依赖有web,导入本地IDEA后,创建子项目mybatis和mybatis-plus,分别演示各自功能的使用。
父工程pom需要增加mysql驱动依赖、连接池依赖和Lombok依赖:
mysql
mysql-connector-java
8.0.25
com.alibaba
druid-spring-boot-starter
1.2.6
org.projectlombok
lombok
mybatis子工程的pom还需要增加如下依赖项:
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.0
mybatis-plus子工程pom还需要增加如下依赖项:
com.baomidou
mybatis-plus-boot-starter
3.4.3
1.5 数据源配置
mybatis子项目做如下的配置。
application.properties
中加上如下的配置。
# 配置数据源信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://x.x.x.x:3306/zhangxun?characterEncoding=utf-8&&serverTimezone=Asia/Shanghai&&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
# 配置mapper xml的位置
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
# 是否显示执行sql
logging.level.com.xun.mapper=debug
mybatis-plus做如下的配置。
application.properties
中加上如下的配置。
# 配置数据源信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://x.x.x.x:3306/zhangxun?characterEncoding=utf-8&&serverTimezone=Asia/Shanghai&&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
# 是否显示执行sql
logging.level.com.xun.mapper=debug
二、MyBatis增删查改案例
2.1 新建实体类
在合适的包下面新建实体类。
@Data
public class User {
private Long userId;
private String userName;
private Integer age;
private String userEmail;
}
2.2 新建Mapper接口
路径为com.xun.mapper
,后续在启动类上设置@MapperScan
时需要指定该路径。
@Repository
public interface UserMapper {
public List listUsers();
public List getUserById(String userId);
public Integer addUser(User user);
public Integer deleteUserById(String userId);
public Integer updateUserNameById(User user);
}
2.3 新建Mapper.xml
在resources/mapper下面新建该文件UserMapper.xml
。
insert into zx_user (user_id, user_name, age, user_email)
values (#{userId}, #{userName}, #{age}, #{userEmail});
update zx_user set user_name = #{userName} where user_id = #{userId}
delete from zx_user where user_id = #{userId}
2.4 新建controller
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/listUsers")
public List listUsers(){
return userMapper.listUsers();
}
@GetMapping("/getUserById/{userId}")
public List getUserById(@PathVariable String userId){
return userMapper.getUserById(userId);
}
@PostMapping("/addUser")
public Integer addUser(@RequestBody User user){
return userMapper.addUser(user);
}
@DeleteMapping("/deleteUserById/{userId}")
public Integer deleteUserById(@PathVariable String userId){
return userMapper.deleteUserById(userId);
}
@PutMapping("/updateUserNameById")
public Integer updateUserNameById(@RequestBody User user){
return userMapper.updateUserNameById(user);
}
}
2.4 配置启动
@MapperScan("com.xun.mapper")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
最后使用postman模拟测试,全部成功。
三、MyBatis-Plus增删查改案例
3.1 新建实体类
在合适的包下面新建实体类,其中@TableName不是必须的,如果不写或者只写该注解不带值,那么默认查询的表名称就是实体类的名称User,如果表名和实体类名不一致,就需要像如下一样绑定表名和实体类名。
@Data
@TableName("zx_user")
public class User {
private Long userId;
private String userName;
private Integer age;
private String userEmail;
}
默认情况下mybatis-plus会认为实体类字段名称和数据库表字段的名称是对应的,比如userName对应user_name,userId对应user_id,age对应age;如果实体类的字段名称是userNameStr,那么就会去数据库表中找user_name_str字段,所以,如果不存在对应关系的话,就需要增加注解@TableField,通过value属性指定该实体类字段对应的数据库表字段名称,如下所示:
@TableField("user_name")
private String userNameStr;
3.2 新建Mapper接口
路径为com.xun.mapper
,后续在启动类上设置@MapperScan
时需要指定该路径。
public interface UserMapper extends BaseMapper {
}
其中,Mapper接口需要继承BaseMapper父类,父类中包含了常用的增删查改方法,我们就不用自己再定义了,甚至都不用再写xml文件了。
3.3 新建Controller
3.3.1 查询
-
selectList
@GetMapping("/listUsers") public List
listUsers(){ // SELECT user_id,user_name,age,user_email FROM zx_user return userMapper.selectList(null); } 如果想根据某个条件进行查询:
@GetMapping("/getUserById/{userId}") public List
getUserById(@PathVariable String userId){ QueryWrapper queryWrapper = new QueryWrapper<>(); // "user_id"指定数据库表字段名称,eq代表等于 queryWrapper.eq("user_id", userId); // SELECT user_id,user_name,age,user_email FROM zx_user WHERE (user_id = ?) return userMapper.selectList(queryWrapper); } -
selectById
@GetMapping("/getSingleUserById/{userId}") public User getSingleUserById(@PathVariable String userId){ // SELECT user_id,user_name,age,user_email FROM zx_user WHERE user_id=? return userMapper.selectById(userId); }
要想如上根据Id来进行查询能正常执行,我们需要指定实体类中那个字段是Id,不然mubatis-plus就无法工作了,比如:
@Data @TableName("zx_user") public class User { @TableId private Long userId; private String userName; private Integer age; private String userEmail; }
@TableId有两个属性,value可以指定数据库表字段的名字,type表示这个Id的规则,具体有如下枚举选项:
/** * 数据库ID自增 *
该类型请确保数据库设置了 ID自增 否则无效
*/ AUTO(0), /** * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) */ NONE(1), /** * 用户输入ID *该类型可以通过自己注册自动填充插件进行填充
*/ INPUT(2), /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */ /** * 分配ID (主键类型为number或string), * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法) * * @since 3.3.0 */ ASSIGN_ID(3), /** * 分配UUID (主键类型为 string) * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-","")) */ ASSIGN_UUID(4);我们现在还不涉及插入,此处可以先保持默认。
-
selectBatchIds
基本用法同上面的selectById,只不过是根据多个Id进行查询。
@GetMapping("/getUserByIds/{userIds}") public List
getUserByIds(@PathVariable String userIds){ List userIdList = Arrays.asList(userIds.split(",")); // SELECT user_id,user_name,age,user_email FROM zx_user WHERE user_id IN ( ? , ? , ? ) return userMapper.selectBatchIds(userIdList); } -
selectByMap
@GetMapping("/getUserByName/{userName}") public List
getUserByName(@PathVariable String userName) { Map paramMap = new HashMap<>(); // 还可以输入多个其它查询条件 paramMap.put("user_name", userName); // SELECT user_id,user_name,age,user_email FROM zx_user WHERE user_name = ? return userMapper.selectByMap(paramMap); } -
selectCount
用于计算满足查询条件的记录数量。
@GetMapping("/countUsers/{userId}") public Integer countUsers(@PathVariable String userId) { QueryWrapper
queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId); // SELECT COUNT( * ) FROM zx_user WHERE (user_id = ?) return userMapper.selectCount(queryWrapper); } -
selectOne
用于确保只返回一条满足查询条件的记录,倘若查到的记录数大于1,系统就会报错。
@GetMapping("/getSingleUser/{userId}") public User getSingleUser(@PathVariable String userId) { QueryWrapper
queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId); // SELECT user_id,user_name,age,user_email FROM zx_user WHERE (user_id = ?) return userMapper.selectOne(queryWrapper); }
3.3.2 新增
@PostMapping("/addUser")
public Integer addUser(@RequestBody User user){
// INSERT INTO zx_user ( user_id, user_name, age, user_email ) VALUES ( ?, ?, ?, ? )
return userMapper.insert(user);
}
新增的时候需要注意的是,主键应该如何生成,此时我们的实体类User上面没有指定主键@TableId的规则,默认就是NONE,表示由用户输入。下面对各种主键规则进行介绍:
- NONE和INPUT,表示由用户输入;
- AUTO表示需要自增,前提是数据库表中该主键设置了自增特性;
- ASSIGN_ID和ASSIGN_UUID表示当插入数据的主键为空时由特定算法给生成一个;
3.3.3 修改
// 更新操作
@PutMapping("/updateUserNameById")
public Integer updateUserNameById(@RequestBody User user){
// UPDATE zx_user SET user_name=? WHERE user_id=?
return userMapper.updateById(user);
}
@PutMapping("/update/{userName}")
public Integer update(@RequestBody User user, @PathVariable String userName){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_name", userName);
// user参数表示需要更新的内容,wrapper表示匹配记录的条件
// 即使user参数中有userId,也不会去更新数据库的主键user_id
// UPDATE zx_user SET user_name=?, age=? WHERE (user_name = ?)
return userMapper.update(user, queryWrapper);
}
3.3.4 删除
删除操作的方法和查询非常类似,这里就不做详细讲解,直接给出代码示例。
@DeleteMapping("/deleteUserById/{userId}")
public Integer deleteUserById(@PathVariable String userId){
// DELETE FROM zx_user WHERE user_id=?
return userMapper.deleteById(userId);
}
@DeleteMapping("/deleteBatchIds/{userIds}")
public Integer deleteBatchIds(@PathVariable String userIds){
List userIdList = Arrays.asList(userIds.split(","));
// DELETE FROM zx_user WHERE user_id IN ( ? , ? )
return userMapper.deleteBatchIds(userIdList);
}
@DeleteMapping("/deleteByMap/{userName}")
public Integer deleteByMap(@PathVariable String userName){
Map paramMap = new HashMap<>();
// 还可以输入多个其它查询条件
paramMap.put("user_name", userName);
// DELETE FROM zx_user WHERE user_name = ?
return userMapper.deleteByMap(paramMap);
}
@DeleteMapping("/delete/{userId}")
public Integer delete(@PathVariable String userId){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userId);
// DELETE FROM zx_user WHERE (user_id = ?)
return userMapper.delete(queryWrapper);
}
3.4 配置启动
@MapperScan("com.xun.mapper")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
最后使用postman模拟测试,全部成功。