在上一篇文章中,我们采用了从0-1完成一个架构的设计与实现可以帮助我们在实际开发过程中快速搭建一个项目整体架构,方便我们利用开发,今天我写的这篇仍然是纪录,纪录我们在开发中最基本的增删改查操作,本篇博客偏向于基础化,时候刚刚进入开发的同学观看,说不上有啥高大上,只不过是一些基础的增删改查操作,包括从控制层到Service层再到Dao层等等。

好了废话不多说了,本篇依旧使用的是Spring Boot和Mybatis进行demo开发。本文以User对象进行。

User 实体类

实体类的字段都是根据我们SQL中的表字段进行的:

create table user(
	id int ...,
	name varchar...,
	sex char ...,
	tell varchar...,
	....
)

对应Java中的实体类:

public class User{
	private Long id;
	private String name;
	private String sex;
	private String tell;
	private String addr;
	private Integer age;
	....
	//构造方法,get Set方法等等啥的
}

控制层

我们在实际开发过程中最常调用的地方就是控制层的接口。
以下我将通过demo进行:

@RestController
@RequestMapping("/users")
public class UserController {

//	用户Service接口
    @Autowired
    private IUserService userService;

	//获取全部用户信息
    @GetMapping("/getAllUsers")
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }
	//根据用户Id进行查询相关信息
    @GetMapping("/getUserById/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        return userService.getUserById(id);
    }
	//新增用户
    @PostMapping("/createUser")
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
	//根据相关用户id去更新用户信息
    @PutMapping("/updateUser/{id}")
    public User updateUser(@PathVariable("id") Long id, @RequestBody User user) {
        return userService.updateUser(id, user);
    }
	//删除用户
    @DeleteMapping("/deleteUser/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }
}

在以上代码中我们完成了在Controller层调用Service接口层的相关接口方法,接下来我们在Service层展示具体的操作,当然Controller层的相关代码需要根据你的需求进行拓展,比如方法的返回类型,以及判断数据是否为空的逻辑,更有日志打印等相关功能。

Service层

IUserService接口

public interface IUserService{

	List<User> getAllUsers();

	User getUserById(Long id);

	User createUser(User user);

	User updateUser(Long id, User user);

	void deleteUser(Long id)
}

UserService 实现层

@Service
public class UserService implements IUserService{

    @Autowired
    private UserMapper userMapper;

    public List<User> getAllUsers() {
        return userMapper.getAllUsers();
    }

    public User getUserById(Long id) {
        return userMapper.getUserById(id);
    }

    public User createUser(User user) {
        userMapper.createUser(user);
        return user;
    }

    public User updateUser(Long id, User user) {
        user.setId(id);
        userMapper.updateUser(user);
        return user;
    }

    public void deleteUser(Long id) {
        userMapper.deleteUser(id);
    }
}

Service层一般是我们实现业务逻辑的地方,具体的业务逻辑,还得是你自己进行详细补充,里边包括多种业务逻辑,均是我们作为开发者需要针对具体的业务进行开发。

接下来就是dao层,

Dao层

dao映射接口(可以写成dao,也可以写成mapper)

SQL语句放Java接口中

这是我们将数据库语句和dao层映射接口放一起的情况,但是你有没有发现这其实只适用于简单的SQL,万一我们需要查询复杂的SQL,那么这样的代码在后期维护就会贼困难,所以以下这种方式看看就好

@Mapper
@Repository
public interface UserMapper {

    @Select("SELECT * FROM users")
    List<User> getAllUsers();

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(Long id);

    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    void createUser(User user);

    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(Long id);
}
SQL语句和Java接口分离
@Mapper
@Repository
public interface UserMapper {

    List<User> getAllUsers();

    User getUserById(Long id);

    void createUser(User user);

    void updateUser(User user);

    void deleteUser(Long id);
}

数据库语句存放位置:
UserMapper.xml名字和Dao层的一定要对应上,我吃过几次亏了

<?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.miaow.dao.UserMapper ">
    <resultMap id="BaseResultMap" type="com.miaow.User">
        <result column="id" jdbcType="LONG" property="id"/>
        .....
    </resultMap>

    <sql id="Base_Column_List">
        id....
    </sql>
    <select id="getAllUsers">
   		 select 
            <include refid="Base_Column_List"/>
          from user
	</select>
    
    <insert id="createUser" parameterType="com.miaow.User" useGeneratedKeys="true"
            keyProperty="id">
        insert into user(*,...)
        values (#{*},..)
    </insert>
    
    <select id="getUserById" parameterType="com.miaow.user"
            resultType="com.miaow.user">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <update id="updateUser" parameterType="map">
       UPDATE users
        <set>
            <if test="name  != null">
                name = #{name},
            </if>
            <if test="email  != null">
                email = #{email},
            </if>
        </set>
        WHERE id = #{id}
    </update>
    <delete id="deleteUser">
		DELETE FROM users WHERE id = #{id}
	</delete>
</mapper>

这种方式就可以让SQL存放和接口分离,从而减少我们在开发过程中的代码维护量,并且修改的时候也不至于那么麻烦。

切记,本篇是应对我们在开发过程中的简单的任务,复杂的任务,包括整体的业务逻辑都是我们需要进行考虑的,当然我们还有重要的一点,就是我们需要在我们的启动类中添加相关注解,方便我们的Spring Boot可以标识到我们的Mapper文件。我存放在dao层,或者也可以说Mapper层,这个需要你注意

@SpringBootApplication
@MapperScan("com.miawo.dao.*")
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication .class, args);
    }
}