一、准备工作
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, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');
1.4 SpringBoot工程下载
从start.spring.io
上下载一个SpringBoot工程,要求的依赖有web,导入本地IDEA后,创建子项目mybatis和mybatis-plus,分别演示各自功能的使用。
父工程pom需要增加mysql驱动依赖、连接池依赖和Lombok依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
mybatis子工程的pom还需要增加如下依赖项:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
mybatis-plus子工程pom还需要增加如下依赖项:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
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<User> listUsers();
public List<User> 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
。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xun.mapper.UserMapper">
<insert id="addUser" parameterType="com.xun.bean.User">
insert into zx_user (user_id, user_name, age, user_email)
values (#{userId}, #{userName}, #{age}, #{userEmail});
</insert>
<update id="updateUserNameById" parameterType="com.xun.bean.User">
update zx_user set user_name = #{userName} where user_id = #{userId}
</update>
<delete id="deleteUserById" parameterType="string">
delete from zx_user where user_id = #{userId}
</delete>
<select id="listUsers" resultType="com.xun.bean.User">
select zu.user_id userId, zu.user_name userName, zu.age age, zu.user_email userEmail from zx_user zu;
</select>
<select id="getUserById" resultType="com.xun.bean.User" parameterType="string">
select zu.user_id userId, zu.user_name userName, zu.age age, zu.user_email userEmail from zx_user zu where
zu.user_id = #{userId};
</select>
</mapper>
2.4 新建controller
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/listUsers")
public List<User> listUsers(){
return userMapper.listUsers();
}
@GetMapping("/getUserById/{userId}")
public List<User> 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<User> {
}
其中,Mapper接口需要继承BaseMapper父类,父类中包含了常用的增删查改方法,我们就不用自己再定义了,甚至都不用再写xml文件了。
3.3 新建Controller
3.3.1 查询
-
selectList
@GetMapping("/listUsers") public List<User> listUsers(){ // SELECT user_id,user_name,age,user_email FROM zx_user return userMapper.selectList(null); }
如果想根据某个条件进行查询:
@GetMapping("/getUserById/{userId}") public List<User> getUserById(@PathVariable String userId){ QueryWrapper<User> 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自增 * <p>该类型请确保数据库设置了 ID自增 否则无效</p> */ AUTO(0), /** * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) */ NONE(1), /** * 用户输入ID * <p>该类型可以通过自己注册自动填充插件进行填充</p> */ 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<User> getUserByIds(@PathVariable String userIds){ List<String> 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<User> getUserByName(@PathVariable String userName) { Map<String,Object> 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<User> 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<User> 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<User> 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<String> 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<String,Object> 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<User> 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模拟测试,全部成功。
网友评论