1. 程式人生 > >Spring boot教程mybatis訪問MySQL的嘗試

Spring boot教程mybatis訪問MySQL的嘗試

Windows 10家庭中文版,Eclipse,Java 1.8,spring boot 2.1.0,mybatis-spring-boot-starter 1.3.2,com.github.pagehelper 5.1.6

 

本文記錄了昨晚到今早使用spring boot專案整合mybatis訪問資料庫的過程——主要是其中的坑。

 

對了,自己的問題還沒解決——有了JPA了,為啥還要用mybatis呢?而且JPA集成了hibernate,,其實,自己對mybatis、hibernate都不太熟悉,這周學一遍教程。

 

參考連結:

springboot---->整合

mybatis開發(一)

https://www.cnblogs.com/huhx/p/baseusespringbootmybatis1.html

本文介紹了spring boot整合mybatis需要的依賴包,

使用XML檔案對映,

使用@Mapper方式實現對映,

@Select註解的內容也可以放到xml檔案中,

 

Maven依賴:

<dependency>

    <groupId>org.mybatis.spring.boot</groupId>

    <artifactId>mybatis-spring-boot-starter</artifactId>

    <version>1.3.1</version>

</dependency>

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <scope>runtime</scope>

</dependency>

 

application.yml中配置mybatis

mybatis:

  mapper-locations: classpath:mybatis/sql_*.xml

  config-location: classpath:setting/mybatis_config.xml

  type-aliases-package: com.linux.huhx.learn.mybatis.bean

 

注意這裡的classpath!因為自己不知道其位置,所以,出現了多次錯誤。其實,開發時的位置就是 src/main/resources

 

疑問,classpath: 後是否要有空格?sql_*.xml 中的 * 號代表類名稱-開頭大寫?mapper-locations s 字母結尾,表示可以有多個?怎麼配置?type-aliases-package 表示Bean的位置,每個Bean都是java檔案,對應java原始碼中的包名——即上圖的src/main/java下的包的名稱。

 

分頁:

真分頁、邏輯分頁,有什麼區別?

mybatis實現的是 邏輯分頁,需要新增pagehelper包來實現真正的分頁,為何?

pagehelper包引入:

<dependency>

    <groupId>com.github.pagehelper</groupId>

    <artifactId>pagehelper</artifactId>

    <version>${pagehelper-version}</version>

</dependency>

 

還需要在mybatis的配置檔案——mybatis_config.xml——下新增外掛:

<configuration>  

    <plugins>

        <plugin interceptor="com.github.pagehelper.PageInterceptor">

            <property name="helperDialect" value="mysql"/>

        </plugin>

    </plugins>

</configuration>

 

疑問,Bean類不需要寫setter/getter,也不需要使用@Data註解;使用org.apache.ibatis.session.SqlSession 來執行查詢操作,但依賴於前面mapper中定義的<select>節點;使用PageHelper 來設定分頁,然後再使用SqlSession查詢。

 

編寫mapper檔案時出現了錯誤:自己最開始 只是簡單地把 <select>節點拷貝到mapper檔案中,出現了下面的錯誤。

Caused by: org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [E:\workplace\java\db-test\target\classes\mybatis\sql_People.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 53; 文件根元素 "select" 必須匹配 DOCTYPE "null"

 

參考下面的連結解決了問題:

文件根元素 "mapper" 必須匹配 DOCTYPE "null"

https://blog.csdn.net/linlinxie/article/details/79737021

 

新增下面的內容,包含<select>節點 以及其它節點:

<?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.test.mapper.TestMapper">

...

</mapper>

這裡的namespace需要根據自己的Bean做跳轉,一個Bean對應一個對映檔案吧。要是大工程的話,就會存在很多Bean了,寫起來可能會比較麻煩。

 

解決以上問題後仍然存在的問題:

 

控制檯錯誤:

2018-11-15 08:51:40.875 ERROR 6504 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

### Error querying database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for people.queryAllPeopleInfo

### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for people.queryAllPeopleInfo] with root cause

 

java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for people.queryAllPeopleInfo

 

解決

people.queryAllPeopleInfo中的people改為Bean的全名:

com.benzl.mybatis.bean.People

 

更多錯誤:

{

    "timestamp": "2018-11-15T01:16:52.009+0000",

    "status": 500,

    "error": "Internal Server Error",

    "message": "Type definition error: [simple type, class com.benzl.mybatis.bean.People]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.benzl.mybatis.bean.People and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.github.pagehelper.Page[0])",

    "path": "/people3/get"

}

 

繼續完善Bean類,問題得到解決:

-實現了Serializable介面;

-添加了getter/setter方法;

 

 

測試成功:

 

 

看來,這裡的Bean也是需要改造為真正的Bean的,而不是本文開頭說的 不需要。