在Spring Boot项目中,使用MyBatis是一种十分流行的数据访问方式。相对于Javaweb通过原生JDBC访问数据库,MyBatis的操作会非常的简单。
使用原生JDBC进行数据库操作如下:
使用原生JDBC进行数据库操作需要手动处理Connection、Statement、PreparedStatement以及Resultset的生命周期,以及手动编写SQL语句和解析查询结果。这种方式比较繁琐,容易出错,并且无法享受到框架提供的便利功能,如事务管理、连接池管理等。
1.繁琐的编程模型:
2.低层次的抽象:
3. 缺乏高级功能支持:
4. SQL语句耦合:
5.缺乏安全性保障:
6.数据类型映射复杂:
对数据库的表和POJO(Plain Ordinary Java Object)Java对象的做映射的框架。现在市面上的ORM框架大概如下:
我们更多的选择MyBatis作为我们的ORM框架的理由如下:
REST(Representationa State Transfer)是一种软件架构风格,它定义了一组用于创建高性能、可伸缩性以及易于维护的应用程序的设计原则和约束条件。RESTfuI 编程就是基于这种REST 架构风格进行 Web 服务的设计和开发。
REST特点如下:
我们将创建一个简单的应用程序,用于管理用户信息,整合MyBatis并使用REST的编程。
包含三个字段:id、username、email
@Entity
@Table(name = "users")
public class User {
@Id
private Long id;
private String username;
private String email;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
定义了对User实体执行数据库操作的方法,使用MyBatis注解来指定SQL语句
@Service
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(@Param("id") Long id);
@Select("SELECT * FROM users")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "username", column = "username"),
@Result(property = "email", column = "email")
})
List findAll();
@Insert("INSERT INTO users(username, email) VALUES(#{username}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
void insert(User user);
@Update("UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id}")
void update(User user);
@Delete("DELETE FROM users WHERE id = #{id}")
void delete(Long id);
}
一个Spring服务组件,注入了UserMapper的用例,提供业务逻辑,调用UserMapper的方法来执行数据库操作。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUser(Long id) {
return userMapper.findById(id);
}
public List getAllUsers() {
return userMapper.findAll();
}
public void addUser(User user) {
userMapper.insert(user);
}
public void updateUser(User user) {
userMapper.update(user);
}
public void deleteUser(Long id) {
userMapper.delete(id);
}
}
一个Spring MVC控制器,提供了REST的端点来访问用户数据。
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUser(id);
}
@GetMapping
public List getAllUsers() {
return userService.getAllUsers();
}
@PostMapping
public void addUser(@RequestBody User user) {
userService.addUser(user);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
userService.updateUser(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
}
Spring Boot项目在整合MyBatis时经常出现Mapper类扫秒问题。
这里给出我最终的解决办法:
在我们启动类的上面添加一个注解@ComponentScan,参数为Mapper这个包,如下:
在 Postman 中选择 GET 方法,在 URL输入框中输入http://localhost:8080/users。
假设您想获取ID为1 的用户信息,选择GET方法,在URL输入框中输入 http://localhost:8080/users/1。
选择POST方法,在URL输入框中输入http://localhost:8080/users,转到"Body"选项卡,选择"raw",并设置类型为"JSON(application/json)"D。输入一个 JSON 对象。
假设您要更新ID为1的用户信息,选择PUT方法,在 URL输入框中输入 http://localhost:8080/users/1,转到"Body"选项卡,选择"raw",并设置类型为"JSON(application/json)",输入一个 JSON 对象。
假设您要删除 ID 为 1的用户,选择DELETE方法,在URL输入框中输入 http://localhost:8080/users/1。