mybatis常見庫及問題彙總

Mars-xq發表於2018-12-22

orm框架的本質是簡化程式設計中運算元據庫的編碼,發展到現在基本上就剩兩家了,
一個是宣稱可以不用寫一句SQL的hibernate,
一個是可以靈活除錯動態sql的mybatis,
兩者各有特點,在企業級系統開發中可以根據需求靈活使用。
發現一個有趣的現象:
傳統企業大都喜歡使用hibernate,網際網路行業通常使用mybatis。

hibernate特點就是所有的sql都用Java程式碼來生成,不用跳出程式去寫(看)sql,有著程式設計的完整性,
發展到最頂端就是spring data jpa這種模式了,基本上根據方法名就可以生成對應的sql了。

mybatis初期使用比較麻煩,需要各種配置檔案、實體類、dao層對映關聯、還有一大推其它配置。
當然mybatis也發現了這種弊端,
初期開發了generator可以根據表結果自動生產實體類、配置檔案和dao層程式碼,可以減輕一部分開發量;
後期也進行了大量的優化可以使用註解了,自動管理dao層和配置檔案等,發展到最頂端就是今天要講的這種模式了,
mybatis-spring-boot-starter就是springboot+mybatis可以完全註解不用配置檔案,也可以簡單配置輕鬆上手。

參考:

springboot-mybatis多資料來源的兩種整合方法

springboot(六):如何優雅的使用mybatis

springboot(七):springboot+mybatis多資料來源最簡解決方案

springboot(五):spring data jpa的使用

springboot(十五):springboot+jpa+thymeleaf增刪改查示例

一、mybatis常見庫:

MyBatis Generator (MBG)

自動生成dao類mapper,mapper.xml和對應資料庫欄位的entity實體類

mybatis/generator

PageHelper

用於分頁

pagehelper/Mybatis-PageHelper

通用mapper,

極其方便的使用MyBatis單表的增刪改查

abel533/Mapper

MyBatis-Plus(MP)

是一個 MyBatis 的增強工具,

在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。

baomidou/mybatis-plus

二、mybatis整合demo:

原生mybatis可以使用xml,也可註解形式來運算元據庫。

原生:

xml方式原生mybatis

註解方式原生mybatis

原生mybatis(註解)多資料來源

原生mybatis(xml)多資料來源

庫的使用:

MyBatis Generator的使用

mybatis-generator + 通用Mapper的使用

MyBatis-Plus的使用

其他:關於jpa的demo:

spring data jpa

三、mybatis常見問題:

問題一:

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'com.example.demo.DemoApplicationTests': 
Unsatisfied dependency expressed through field 'userMapper'; 

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type 'com.example.demo.dao.UserMapper' available: 
expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true)}

原因:找不到mapper的Java檔案,缺少@Mapper或者@MapperScan(“Mapper包名”),新增即可,如下:

@Mapper
public interface UserMapper {
    int deleteByPrimaryKey(Integer id);
    int insert(User record);
    User selectByPrimaryKey(Integer id);
    List<User> selectAll();
    int updateByPrimaryKey(User record);
}

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {

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

}

注意:只要有mapper的Java檔案就需要配置。

問題二:

org.apache.ibatis.binding.BindingException: 
Invalid bound statement (not found): com.example.demo.dao.UserMapper.selectByPrimaryKey

//或

org.apache.ibatis.binding.BindingException: 
Invalid bound statement (not found): com.example.demo.dao.BookDao.getAll

原因:找不到mapper的xml檔案,【缺少】以下配置或者【路徑錯誤】:

# mapper
mybatis.mapper-locations=classpath:mapper/*.xml

注意:只要有mapper的xml檔案就需要配置。

問題三

java.sql.SQLException: 

The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. 

You must configure either the server or JDBC driver (via the serverTimezone configuration property) 

to use a more specifc time zone value if you want to utilize time zone support.

資料庫配置需要新增時區:&serverTimezone=GMT,如下:

# database
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

問題四

### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: 
Data truncation: Out of range value for column 'id' at row 1
; Data truncation: Out of range value for column 'id' at row 1; 
nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: 
Data truncation: Out of range value for column 'id' at row 1] with root cause

將欄位的型別由int轉為BIGINT,如下:

ALTER TABLE user MODIFY id BIGINT(20) AUTO_INCREMENT;

相關文章