天天看點

項目前期準備--MyBaitsPlus、MyBatisPlusGenerator和Spring Security(3)

關于在IDEA中裝配持久層接口對象時,使用@Autowired預設報錯的解決方案:

改為使用@Resource注解;

配置@Autowired的注解參數為required=false,即:@Autowired(required=false);

在接口之前添加@Repository注解。

如果直接執行以上單元測試,會出現以下錯誤:

Caused by: org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class cn.tedu.blog.user.model.User' with value '1282871589072584705' Cause: java.lang.IllegalArgumentException: argument type mismatch      

因在插入資料時,MyBatisPlus會自動生成Id值(例如以上錯誤資訊中的1282871589072584705),需要顯式的在實體類中與主鍵對應的屬性之前添加@TableId注解,并且将注解屬性type設定為IdType.AUTO:

@Data
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
   
    // 忽略後續代碼
   
}      

然後,再次運作,即可正常插入資料。

另外,此次運作可以看到日志中輸出了此次執行的SQL語句及相關資訊,之是以會顯示這些日志,是因為:

MyBatis架構預設就會輸出這些資訊;

必須在項目中添加SLF4j的依賴,以保證MyBatis輸出日志;

MyBatis輸出SQL日志的級别是Debug,必須将日志的顯示級别設定的更低,例如設定為trace。

2. 項目前期準備–MyBatisPlusGenerator

2.1. 使用MyBatisPlusGenerator生成代碼

在IDEA中建立straw項目,作為父級項目,在建立教程中,将Lombok、Spring Web、MySQL、MyBatis Framework并在其中建立straw-portal子子產品項目:

項目前期準備--MyBaitsPlus、MyBatisPlusGenerator和Spring Security(3)

MyBatisPlus Generator是一個代碼生成器,通過使用它,運作後,就可以直接生成大量代碼檔案(例如Java類、接口、配置SQL的XML檔案),然後,将這些檔案複制到正式使用的項目中,就可以省去一些基礎的建立過程!

首先,代碼生成器的相關使用應該在一個獨立的子子產品項目中,避免與其它項目産生交集(不要在正式使用的項目中使用代碼生成器)!是以,繼續在straw父項目中建立代碼生成器專用的子子產品項目straw-generator,建立過程與一般子子產品項目完全相同:

項目前期準備--MyBaitsPlus、MyBatisPlusGenerator和Spring Security(3)

然後,通過

http://doc.canglaoshi.org/config/mybatis-plus-generator.zip

下載下傳使用代碼生成器必要的2個檔案(在同一個壓縮包中):

項目前期準備--MyBaitsPlus、MyBatisPlusGenerator和Spring Security(3)

以上的2個檔案,CodeGenerator是代碼生成器的執行檔案,通過調整其中的配置并執行即可生成所需要的檔案,mapper.java.ftl是需要生成的Java類/接口檔案的模版檔案。

首先,在straw-generator子子產品項目中,将原有的src檔案夾下的test檔案删除(也可以不删,主要是留着也沒用),同樣的,還可以将src下的啟動類(StrawGeneratorApplication)和配置檔案application.properties删除(也用不上)。

在straw-generator子子產品項目的pom.xml中,添加必要的依賴:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-extension</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>2.3.1.RELEASE</version>
</dependency>      

然後,将下載下傳解壓得到的CodeGenerator.java檔案直接複制到項目的cn.tedu.straw.generator包中,并打開該檔案夾,檢查各全局屬性的值,特别是連接配接哪個資料庫、連接配接資料庫的使用者名和密碼,必須與自己目前使用的MySQL保持一緻!還必須檢查modelName屬性的值,它表示目前聚合項目的某個子子產品項目的名稱,這個值将作用于最終生成的類、接口檔案的包名:

項目前期準備--MyBaitsPlus、MyBatisPlusGenerator和Spring Security(3)

确定無誤後,在straw-generator子子產品項目的src/main/resources下建立ftl檔案夾,并将下載下傳得到的mapper.java.ftl複制到這個檔案夾中:

項目前期準備--MyBaitsPlus、MyBatisPlusGenerator和Spring Security(3)

然後,回到CodeGenerator類中,将最後一個全局屬性(用于配置模版檔案的位置的屬性)設定為"/ftl/mapper.java"(與以上放置檔案的位置對應)。

package cn.tedu.straw.portal.mapper;

import cn.tedu.straw.portal.model.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.jws.soap.SOAPBinding;
import javax.sql.DataSource;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

@SpringBootTest
@Slf4j
public class UserMapperTests {

    @Autowired
    DataSource dataSource;
    @Autowired
    UserMapper userMapper;

    @Test
    void contextLoads() {
        log.debug("UserMapperTests.context");
    }

    @Test
    void getConnection() throws SQLException {
        Connection connection = dataSource.getConnection();
        log.debug("connection > {}", connection);
    }

    @Test
    void insert() {
        User user = new User();
        user.setUsername("plus");
        user.setPassword("1234");
        int rows = userMapper.insert(user);
        log.debug("rows={}", rows);
    }

    @Test
    void selectById() {
        Integer id = 1;
        User user = userMapper.selectById(id);
        log.debug("user > {}", user);
    }

    @Test
    void selectList() {
        List<User> users = userMapper.selectList(null);
        log.debug("count={}", users.size());
        for (User user : users) {
            log.debug("user > {}", user);
        }
    }

}