SpringBoot系列記錄(十四)——SpringBoot用Restful風格實現增刪改查並使用MyBatis逆向工程

 一、MyBatis逆向工程的使用

因爲比較簡單,就不另寫一篇記錄了,在這裏正好使用上。可以針對單表自動生成mybatis執行所需要的代碼(mapper.java、mapper.xml、pojo…),提高工作效率。

數據表還是用上一篇的,這裏依然貼一下SQL

DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
  `id` int(64) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `password` varchar(64) DEFAULT NULL,
  `salt` varchar(64) DEFAULT NULL,
  `state` varchar(8) DEFAULT NULL,
  `username` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO `user_info` VALUES ('1', '管理員', '565111f370e4dd497aa4eeb985efa6a3', '7mrNoL/keN6rbqZDx+PKyg==', '1', 'admin');

1.1 POM.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <!-- Spring Boot Mybatis 依賴 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

        <!-- Mybatis逆向工程 -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>
        <!-- MySQL 連接驅動依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
        </plugins>
    </build>

1.2 目錄結構

 1.3 generator.xml

註釋已經非常詳細了,就不贅述了;如果包名不一致,記得修改對應位置的包名

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 數據庫驅動:選擇你的本地硬盤上面的數據庫驅動包-->
    <classPathEntry location="D:\software\repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar"/>
    <!-- 表設計時有聯合主鍵時, 不需要單獨主鍵實體類時 把defaultModelType設置爲flat -->
    <context id="DB2Tables" targetRuntime="MyBatis3" defaultModelType="flat">
        <!-- JavaBean 實現 序列化 接口 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
        <!-- 生成toString -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
        <!-- optional,旨在創建class時,對註釋進行控制 -->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- <property name="suppressAllComments" value="true"/>-->
        </commentGenerator>
        <!--數據庫鏈接URL,用戶名、密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/demo"
                        userId="root"
                        password="1234">
        </jdbcConnection>
        <!-- 類型轉換 -->
        <javaTypeResolver >
            <!-- 是否使用bigDecimal,
                false: 把JDBC DECIMAL 和 NUMERIC 類型解析爲 Integer(默認)
                true:  把JDBC DECIMAL 和 NUMERIC 類型解析爲java.math.BigDecimal
            -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="com.example.restfuldemo.domain" targetProject="src/main/java">
            <!-- 默認false 是否允許子包 -->
            <property name="enableSubPackages" value="true" />
            <!-- 默認false 是否對model添加 構造函數 -->
            <property name="constructorBased" value="false"/>
            <!-- 默認false 建立的Model對象是否 不可改變  即生成的Model對象不會有 setter方法,只有構造方法 -->
            <property name="immutable" value="false"/>
            <!-- 默認false 是否對類CHAR類型的列的數據進行trim操作 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.restfuldemo.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是數據庫中的表名或視圖名 domainObjectName是實體類名-->
        <table tableName="user_info"></table>
    </context>
</generatorConfiguration>

 1.4 右鍵 run mybatis-generator即可

    BUILD SUCCESS之後可以看到,它自動生成了下圖這些東西,那是相當省事了。

二、 Restful風格增刪改查

2.1 application.properties

#數據源配置
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username = root
spring.datasource.password = 1234

## Mybatis 配置
# 配置爲 com.example.restfuldemo.domain 指向實體類包路徑。
mybatis.typeAliasesPackage=com.example.restfuldemo.domain
# 配置爲 classpath 路徑下 mapper 包下,* 代表會掃描所有 xml 文件。
mybatis.mapperLocations=classpath:/mappers/*.xml

2.2  UserInfoService與Impl

public interface UserInfoService {

    /**
     * 新增用戶
     * @param userInfo
     * @return
     */
    int addUser(UserInfo userInfo);

    /**
     * 修改用戶
     * @param userInfo
     * @return
     */
    int updateUser(UserInfo userInfo);

    /**
     * 刪除用戶
     * @param id
     * @return
     */
    int delUser(int id);

    /**
     * 根據用戶名查找
     * @param username
     * @return
     */
    UserInfo getUserByName(String username);

    /**
     * 查詢所有用戶
     * @return
     */
    List<UserInfo> findAll();
}

實現類:

@Service("userInfoService")
public class UserInfoServiceImpl implements UserInfoService {

    @Autowired
    UserInfoMapper userInfoMapper;

    @Override
    public int addUser(UserInfo userInfo) {
        int result = 0;
        result = userInfoMapper.insert(userInfo);
        return result;
    }

    @Override
    public int updateUser(UserInfo userInfo) {
        int result = 0;
        result = userInfoMapper.updateByPrimaryKey(userInfo);
        return result;
    }

    @Override
    public int delUser(int id) {
        int result = 0;
        result = userInfoMapper.deleteByPrimaryKey(id);
        return result;
    }

    @Override
    public UserInfo getUserByName(String username) {
        return null;
    }

    @Override
    public List<UserInfo> findAll() {
        UserInfoExample example = new UserInfoExample();
        //有查詢條件框時這樣寫
       // UserInfoExample.Criteria criteria = example.createCriteria();
        //criteria.andUsernameLike("%"+username+"%");
        List<UserInfo> userInfos = userInfoMapper.selectByExample(example);
        return userInfos;
    }
}

2.3 Controller

@RestController
@RequestMapping("/api/user")
public class UserInfoController {

    @Autowired
    UserInfoService userInfoService;

    @PostMapping
    public int addUser(UserInfo userInfo){
        return  userInfoService.addUser(userInfo);
    }

    @PutMapping
    public int updateUser(UserInfo userInfo){
        return  userInfoService.updateUser(userInfo);
    }

    @DeleteMapping
    public int delUser(int id){
        return userInfoService.delUser(id);
    }

    @GetMapping("/userAll")
    public List<UserInfo> findAll(){
        return userInfoService.findAll();
    }

}

 2.4 測試

這裏直接使用postman來測試了。 展示新增與查詢的結果

查詢:

三、擴展

3.1 HTTP 動詞

  • GET(SELECT):從服務器取出資源(一項或多項)。
  • POST(CREATE):在服務器新建一個資源。
  • PUT(UPDATE):在服務器更新資源(客戶端提供改變後的完整資源)。
  • DELETE(DELETE):從服務器刪除資源。

3.2 實際情況

  •    在實際的項目中簡單查詢儘量用GET,好處是可以直接帶查詢參數;
  •    複雜查詢和更新用POST,用的最多

其實我覺得這種並不好用,還沒我在路徑上使用動詞表示的簡單明瞭,當然了,個人看法。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章