🎓博主介绍:Java、Python、js全栈开发 “多面手”,精通多种编程语言和技术,痴迷于人工智能领域。秉持着对技术的热爱与执着,持续探索创新,愿在此分享交流和学习,与大家共进步。
📖DeepSeek-行业融合之万象视界(附实战案例详解100+)
📖全栈开发环境搭建运行攻略:多语言一站式指南(环境搭建+运行+调试+发布+保姆级详解)
👉感兴趣的可以先收藏起来,希望帮助更多的人
SpringBoot与MyBatis整合实战:从CRUD到动态SQL优化
一、引言
在当今的Java开发领域,Spring Boot和MyBatis是两个非常流行的技术框架。Spring Boot以其快速搭建项目、简化配置的特性,极大地提高了开发效率;而MyBatis作为优秀的持久层框架,提供了灵活的SQL映射和执行功能。将Spring Boot与MyBatis进行整合,能够让开发者更加高效地进行数据库操作。本文将带领大家从最基础的CRUD操作开始,逐步深入到动态SQL的优化,帮助大家掌握这一重要的开发技能。
二、项目环境搭建
2.1 创建Spring Boot项目
我们可以使用Spring Initializr(https://start.spring.io/ )来快速创建一个Spring Boot项目。具体步骤如下:
- 打开Spring Initializr网站。
- 选择项目的基本信息,如项目类型(Maven Project)、语言(Java)、Spring Boot版本等。
- 在Dependencies中添加以下依赖:
- Spring Web:用于构建Web应用。
- MyBatis Framework:集成MyBatis。
- MySQL Driver:如果使用MySQL数据库。
- 点击“Generate”按钮下载项目压缩包,解压后导入到IDE中。
2.2 配置数据库连接
在src/main/resources目录下找到application.properties文件,添加以下数据库连接配置:
spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
请将your_database_name、your_username和your_password替换为实际的数据库名、用户名和密码。
2.3 配置MyBatis
在application.properties中添加MyBatis的相关配置:
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity
其中,mybatis.mapper-locations指定MyBatis映射文件的位置,mybatis.type-aliases-package指定实体类所在的包。
三、实现基本的CRUD操作
3.1 创建实体类
在com.example.demo.entity包下创建一个简单的实体类,例如User:
package com.example.demo.entity;
public class User {
private Integer id;
private String name;
private Integer age;
// 构造方法、Getter和Setter方法
public User() {}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3.2 创建Mapper接口
在com.example.demo.mapper包下创建UserMapper接口:
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
// 查询所有用户
List<User> getAllUsers();
// 根据ID查询用户
User getUserById(Integer id);
// 插入用户
int insertUser(User user);
// 更新用户信息
int updateUser(User user);
// 删除用户
int deleteUser(Integer id);
}
3.3 创建Mapper XML文件
在src/main/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.example.demo.mapper.UserMapper">
<select id="getAllUsers" resultType="com.example.demo.entity.User">
SELECT * FROM user
</select>
<select id="getUserById" parameterType="int" resultType="com.example.demo.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.demo.entity.User">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
<update id="updateUser" parameterType="com.example.demo.entity.User">
UPDATE user
SET name = #{name}, age = #{age}
WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
3.4 创建Service层
在com.example.demo.service包下创建UserService接口和UserServiceImpl实现类:
package com.example.demo.service;
import com.example.demo.entity.User;
import java.util.List;
public interface UserService {
List<User> getAllUsers();
User getUserById(Integer id);
int insertUser(User user);
int updateUser(User user);
int deleteUser(Integer id);
}
package com.example.demo.service.impl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> getAllUsers() {
return userMapper.getAllUsers();
}
@Override
public User getUserById(Integer id) {
return userMapper.getUserById(id);
}
@Override
public int insertUser(User user) {
return userMapper.insertUser(user);
}
@Override
public int updateUser(User user) {
return userMapper.updateUser(user);
}
@Override
public int deleteUser(Integer id) {
return userMapper.deleteUser(id);
}
}
3.5 创建Controller层
在com.example.demo.controller包下创建UserController:
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Integer id) {
return userService.getUserById(id);
}
@PostMapping
public int insertUser(@RequestBody User user) {
return userService.insertUser(user);
}
@PutMapping
public int updateUser(@RequestBody User user) {
return userService.updateUser(user);
}
@DeleteMapping("/{id}")
public int deleteUser(@PathVariable Integer id) {
return userService.deleteUser(id);
}
}
四、动态SQL优化
4.1 动态SQL简介
动态SQL是MyBatis的强大特性之一,它允许我们根据不同的条件动态地生成SQL语句。常见的动态SQL标签有<if>、<choose>、<when>、<otherwise>、<where>、<set>和<foreach>等。
4.2 使用<if>标签实现条件查询
假设我们要根据用户的姓名和年龄进行条件查询,修改UserMapper.xml文件:
<select id="getUsersByCondition" parameterType="com.example.demo.entity.User" resultType="com.example.demo.entity.User">
SELECT * FROM user
WHERE 1 = 1
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
同时,在UserMapper接口中添加对应的方法:
List<User> getUsersByCondition(User user);
在UserService和UserServiceImpl中添加相应的方法,在UserController中添加对应的接口。
4.3 使用<choose>、<when>、<otherwise>标签实现多条件选择
如果我们希望根据不同的条件选择不同的查询语句,可以使用<choose>、<when>、<otherwise>标签:
<select id="getUsersByChoose" parameterType="com.example.demo.entity.User" resultType="com.example.demo.entity.User">
SELECT * FROM user
WHERE 1 = 1
<choose>
<when test="name != null and name != ''">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND 1 = 2
</otherwise>
</choose>
</select>
同样,在UserMapper、UserService、UserServiceImpl和UserController中添加相应的方法和接口。
4.4 使用<foreach>标签实现批量操作
如果我们要实现批量插入或删除操作,可以使用<foreach>标签。以下是批量插入的示例:
<insert id="batchInsertUsers" parameterType="java.util.List">
INSERT INTO user (name, age)
VALUES
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
在UserMapper接口中添加方法:
int batchInsertUsers(List<User> users);
在UserService、UserServiceImpl和UserController中添加相应的方法和接口。
五、总结
通过本文的学习,我们完成了Spring Boot与MyBatis的整合,并实现了基本的CRUD操作。同时,我们深入了解了MyBatis的动态SQL特性,学会了使用<if>、<choose>、<when>、<otherwise>和<foreach>等标签来优化SQL语句。动态SQL能够让我们的代码更加灵活,提高开发效率。在实际项目中,我们可以根据具体需求灵活运用这些技术,构建高效、稳定的数据库操作层。

1376

被折叠的 条评论
为什么被折叠?



