天天看點

使用 Spring Boot 搭建一套增删改查(無多餘代碼)

使用 Spring Boot 搭建一套增删改查(無多餘代碼)

前言

這是我學習 Spring Boot 的第三篇文章,終于可以見到效果了。錯過的同學可以看看之前的文章

我們為什麼要學習 Spring Boot

Spring Boot 入門詳細分析

在入門的基礎上,我們現在已經能運作起來項目了,至少保證 Hello World 是正常的,下面直接進入正題。

準備資料庫環境

建立表

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  `age` int(2) DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
      

工程相關

項目目錄結構

使用 Spring Boot 搭建一套增删改查(無多餘代碼)

編輯配置檔案 application.properties 、pom.xml

編譯 application.properties 檔案

## 資料源配置
spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot_test?useUnicode=true&characterEncoding=utf8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root

## Mybatis 配置
# 配置為 com.kris.entry 指向實體類包路徑。
mybatis.typeAliasesPackage=com.kris.entry
      

編譯 pom.xml 檔案

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.kris</groupId>
	<artifactId>demo2</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo2</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
          <!-- 這個 mybatis 的版本不能太低,否則有問題,無法導入相關注解 -->
		<mybatis-spring-boot>1.3.2</mybatis-spring-boot>
		<mysql-connector>5.1.39</mysql-connector>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>${mybatis-spring-boot}</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql-connector}</version>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>
      

編寫實體類

package com.kris.entry;

/**
 * Created by Kris on 2019/3/20.
 */
public class User {

    private Integer id;

    private String name;

    private Integer 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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
      

編寫 DAO 接口

package com.kris.dao;

import com.kris.entry.User;
import org.apache.ibatis.annotations.*;

/**
 * Created by Kris on 2019/3/20.
 */
@Mapper
public interface UserDao {

    /**
     * 新增使用者
     * @param user
     */
    @Insert("insert into t_user(id,name,age) values (#{id},#{name},#{age})")
    boolean add(User user);

    /**
     * 删除使用者
     * @param id
     */
    @Delete("delete from t_user where id = #{id} ")
    boolean delete(Integer id);

    /**
     * 根據使用者 ID 修改使用者
     * @param user
     */
    @Update("update t_user set name = #{name},age = #{age} where id = #{id} ")
    boolean update(User user);

    /**
     * 根據 ID 查找使用者
     * @param id
     * @return
     */
    @Select("select * from t_user where id = #{id}")
    User select(Integer id);
}
      

@Mapper 的作用:實話說,都說有作用,但是我測試了一波,去掉這個也沒有問題。誰知道 @Mapper 的作用,麻煩告訴我一聲!

@Insert @Delete @Update @Select 對應資料庫的增删改查操作。

另外,在綁定參數的過程中,因為隻有一個參數,是以可以自動綁定,若是有多個參數,那就需要@Param("XXX") 與 SQL 語句中的參數綁定了。例如:

@Update("update t_user set name = #{name},age = #{age} where id = #{id} ")
boolean update(@Param("name")String name,@Param("age")Integer age,@Param("id")Integer id);      

編寫 Service 接口以及 Service 實作

這個子產品和之前的 SSM 項目沒有差別,目前就這個 Demo 來說,也可以不寫這個層。

package com.kris.service;

import com.kris.entry.User;

/**
 * Created by Kris on 2019/3/20.
 */
public interface UserService {

    boolean add(User user);

    boolean delete(Integer id);

    boolean update(User user);

    User select(Integer id);
}
      
package com.kris.service.impl;

import com.kris.dao.UserDao;
import com.kris.entry.User;
import com.kris.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * Created by Kris on 2019/3/20.
 */
@Service
public class UserServiceImpl implements UserService{

    @Autowired
    UserDao userDao;

    @Override
    public boolean add(User user) {
        return userDao.add(user);
    }

    @Override
    public boolean delete(Integer id) {
        return userDao.delete(id);
    }

    @Override
    public boolean update(User user) {
        return userDao.update(user);
    }

    @Override
    public User select(Integer id) {
        return userDao.select(id);
    }
}
      

編寫 Controller 層

package com.kris.controller;

import com.kris.entry.User;
import com.kris.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by Kris on 2019/3/20.
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/add",method = RequestMethod.POST)
    public boolean addUser(User user){
        return userService.add(user);
    }

    @RequestMapping(value = "/delete",method = RequestMethod.DELETE)
    public boolean deleteUser(Integer id){
        return userService.delete(id);
    }

    @RequestMapping(value = "/update",method = RequestMethod.PUT)
    public boolean updateUser(User user){
        return userService.update(user);
    }

    @RequestMapping(value = "/select",method = RequestMethod.GET)
    public User selectUser(Integer id){
        return userService.select(id);
    }
}
      

@RestController 這個注解等于 @Controller + @ResponseBody 通路結果以 JSON 格式傳回,其它的都是以前的知識。

運作項目

package com.kris;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.kris.dao")
public class Demo2Application {

	public static void main(String[] args) {
		SpringApplication.run(Demo2Application.class, args);
	}
}
      

SpringBootApplication:開啟元件掃描和自動配置。

到這裡知道了為什麼會有 @Mapper 這個注解了,在之前我們想要實作 Dao 層的實作,我們使用 Mapper 動态代理開發機制,但是外在表現就是在 DAO 接口上添加 @Mapper 即可。但是這樣我們需要為每一個 Dao 檔案添加注解,太麻煩,現在為了友善,簡化操作我們可以直接使用 @MapperScan 進行掃描即可。另外,@MapperScan 這個注解還可以同時掃描多個檔案,中間用逗号隔開。我們可以這樣寫

@MapperScan("com.kris.dao","com.yu.mapper")      

測試

測試這裡我使用的 Postman ,當然你也可以使用 Restlet 。呃呃,測試就自己來吧,我就不截圖了。實在不行,你就用浏覽器直接通路啊,但是注意設定請求的形式呦。

posted on 2019-03-20 18:47 餘同學的開發之路 閱讀(...) 評論(...) 編輯 收藏