Spring Boot后端学习(四)
运行环境
jdk 1.8
spring boot 2.6.1
maven 3.9.1
编译器 idea
参照1天搞定SpringBoot+Vue全栈开发的学习笔记
ORM介绍
ORM即对象关系映射,用于解决面向对象与关系数据库存在的互不匹配现象的一种技术,将对象和数据库之中的记录完成映射,包括存储、存取
MyBatis-Plus介绍
ORM的框架,是MyBatis的增强
添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
配置数据库相关信息
在application.properties中添加相关配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/databasename?useSSL=false
spring.datasource.username=root
spring.datasource.password=password
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
同时搭建好MySQL数据库,主要操作数据库中User表的内容
添加@MapperScan注解
需要在启动类MpddemoApplication
中添加@MapperScan
注解,用于扫描Mapper文件夹
数据库相关的操作都会放置在Mapper包下面
@MapperScan("com.example.mpddemo.mapper")
MyBatis-Plus CRUD操作
Mybatis学习
定义User实体类,具体字段如下,通过alt+insert
选择Getter and Setter
快速搭建方法
private int id;
private String username;
private String password;
private String birthday;
Mybatis已经实现数据库方法了,只需要定义接口声明方法就行,对SQL语句通过注解完成
注解 | 功能 |
---|---|
@Insert | 增 |
@Delete | 删 |
@Update | 改 |
@Select | 查 |
@Result | 实现结果集封装 |
@Results | 可以与@Result一起使用,封装多个结果集 |
@One | 实现一对一结果集封装 |
@Many | 实现一对多结果集封装 |
UserMapper部署
@Mapper
注解说明这是一个Mapper组件
@Select
自动寻找配置好的数据库并自动将数据封装成User对象,存入List中
其他注解的功能
UserMapper接口部署,传递参数有两种形式:
- 传递的是单个参数,
#{id}
可以将方法中传递过来的id参数填充到SQL语句中 - 传递的是一个封装类,只要确保
#{username},#{password},#{birthday}
都是user类中存在的一样的属性名称就行
@Mapper
public interface UserMapper {
@Select("select * from user")
public List<User> getAll();
@Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
public int insert(User user);
@Delete("delete from user where id = #{id}")
int delete(int id);
@Update("update user set username = #{username}, password = #{password}, birthday = #{birthday} where id = #{id})")
int update(User user);
@Select("select # from user where id = #{id}")
List<User> find();
}
查询用户实例
@Autowired
注解可以将接口UserMapper
通过框架自动实例化的对象注入下面的userMapper
中
@RestController
public class UserController {
//声明一个Mapper
@Autowired
private UserMapper userMapper;
@GetMapping("/user")
public List query(){
List<User> list = userMapper.getAll();
System.out.println(list);
return list;
}
}
浏览器输入地址http://localhost:8080/user可以看到返回的JSON格式数据
后台打印的数据如下所示
> Preparing: select * from user
> Parameters:
< Columns: id, username, password, birthday
< Row: 3, 小美, 12344, 2015-06-07
<== Row: 45, 小帅, 10101, 2014-04-15
<== Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1fa07d0]
[User{id=3’,username=‘小美’,password=‘12344’,birthday=‘2015-06-07’}, User{id=45’,username=‘小帅’,password=‘10101’,birthday=‘2014-04-15’}]
添加用户实例
在UserController中添加
@PostMapping("/user")
public String save(User user){
int i = userMapper.insert(user);
if(i > 0){
return "插入成功";
}
else{
return "插入失败";
}
}
通过postman给后台传递参数,响应"插入成功"
由于没有传递id属性值,且根据数据表id字段的自增特性,最终呈现出的数据表结果如下
Mybatis-Plus
Mybatis-Plus在Mybatis基础上,进一步简化了对数据库的操作
BaseMapper类提供了数据库的增删改查方法,可引用BaseMapper类中的方法进行数据库的操作
前提是数据表的名称一定要和实体类一致,即都要是User
如果不一致,可以在实体类User前面添加@TableName(“TableName”)注解
UserMapper接口只需要继承BaseMapper类就可以
BaseMapper类部分方法
int insert(T entity);
//根据id删除
int deleteById(Serializable id);
//根据map表字段条件删除
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
//根据entity条件删除
int delete(@Param("ew") Wrapper<T> queryWrapper);
//根据id批量删除
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
//过呢据id修改
int updateById(@Param("et") T entity);
//根据whereEntity条件修改记录
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
//根据id选择激励
T selectById(Serializable id);
//根据id批量查询
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
查询用户实例
UserMapper部署
@Mapper
public interface UserMapper extends BaseMapper<User> { }
UserController部署
@RestController
public class UserController {
//声明一个Mapper
@Autowired
private UserMapper userMapper;
@GetMapping("/user")
public List query(){
//查询所有用户,null代表没有查询条件
List<User> list = userMapper.selectList(null);
System.out.println(list);
return list;
}
@PostMapping("/user")
public String save(User user){
int i = userMapper.insert(user);
if(i > 0){return "插入成功";}
else{return "插入失败";}
}
}
Mybatis注解
@TableName
加入实体类前面,可以解决实体类名称与数据表名称不一致的问题
@TableId
加入实体类主键前面,可以为其添加数据表字段的一些属性
@TableId(type = IdType.AUTO)
为主键添加自增属性,该属性对记录的修改会存在两种情况
没有添加自增属性
前端向后台发送这一条记录信息
可以看出我们插入的记录中id默认为0
但由于数据表中对于id字段的属性设置了自增,因此在数据表中看到新一条记录id=50
添加注解后@TableId(type = IdType.AUTO)后
前端发送记录
可以看到后台返回的记录发生了变化
IdType所具备的其他属性值如下,通过MyBatisPlus提供的注解,可以更轻松地完成数据库单表的操作
值 | 描述 |
---|---|
AUTO | 数据库 ID 自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
INPUT | insert 前自行 set 主键值 |
ASSIGN_ID | 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator 的方法nextId (默认实现类为DefaultIdentifierGenerator 雪花算法) |
ASSIGN_UUID | 分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator 的方法nextUUID (默认 default 方法) |