MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis可以通過簡單的 XML 或註解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。
1 創建數據庫
create database db_mybatis; use db_mybatis; create table t_books( id int auto_increment primary key, name varchar(30) null, author varchar(20) null )default charset=utf8; insert into t_books(name,author) values('Java程序設計','張三丰'); insert into t_books(name,author) values('微信小程序開發','張無忌'); select * from t_books;
2 創建項目
首先創建一個SpringBoot工程,添加Web、MyBatis、MySQL依賴,方法如下。
創建項目時,在項目的Dependencies中勾選SQL下的MySQL Driver、MyBatis Framework,Web下的Spring Web即可。
創建完成後,項目的目錄結構如下圖所示:
項目的依賴代碼如下所示,即pom.xml中依賴部
<dependencies> <!--SpringWeb依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--MyBatis依賴--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</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> </dependency> </dependencies>
3 基本配置
3.1 配置數據庫連接信息
在src/main/resources下的application.properties文件中配置數據庫連接信息,這處與JdbcTemplate相同,代碼如下:
spring.datasource.url=jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3.2 配置mybatis
在src/main/resources下新建mybatis-config.xml文件,文件內容如下
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--導入外部配置文件--> <properties resource="application.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <!-- 配置Mapper.xl文件的路徑 <mapper resource="com/sky/demo/dao/AccountMapper.xml" /> --> <package name="com.example.mybatisdemo.dao"/> </mappers> </configuration>
在該配置文件中有,兩個需要注意的,一個是數據庫的連接信息,是從外部配置文件中取得的,所以需要導入外部配置文件;另一個是配置Mapper映射文件的路徑,有兩種方式,一是爲每一個Mapper文件配置,另一是配置Mapper文件的包路徑。
4 訪問數據庫基本操作
4.1 創建SqlSessionFactory
每個基於MyBatis的應用都是以一個SqlSessionFactory的實例爲中心的。SqlSessionFactory的實體可以通過SqlSessionFactoryBuilder獲得。而SqlSessionFactoryBuilder則可以從XML配置文件或一個預先定製的Configuration的實例構建出SqlSessionFactory的實例。此處的XML文件即上面配置mybatis-config.xml文件。然後創建工具類,取得SqlSession對象。
在com.example.mybatisdemo包中創建util包,在包中創建DBUtil類,代碼如下:
package com.example.mybatisdemo.tool; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; /** * ClassName:DBUtil * Description:從mybatis-config.xml中建出SqlSessionFactory的實例 * date:2021/1/12 8:27 * * @author Administrator * @since JDK 1.8 */ public class DBUtil { private static SqlSessionFactory sqlSessionFactory; static{ String resource="mybatis-config.xml"; try { InputStream in= Resources.getResourceAsStream(resource); sqlSessionFactory=new SqlSessionFactoryBuilder().build(in); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSession(){ return sqlSessionFactory.openSession(); } }
4.2 創建POJO實體類
創建相應的POJO實體類與數據庫的數據表進行對應。例如在數據庫中有數據表t_books,則創建對應的類。
在com.example.mybatisdemo包下新建包entity,然後在該包下創建Book類,該類與t_books數據表對應,其中屬性的名稱爲了簡單,與數據表中的字段名一致。代碼如下,
package com.example.mybatisdemo.entity; /** * ClassName:Book * Description:與數據表t_books對應 * date:2021/1/12 8:35 * * @author Administrator * @since JDK 1.8 */ public class Book { private Integer id; private String name; private String author; //此處省略了setter和getter }
4.3 採用接口的方式創建Mapper映射
在com.example.mybatisdemo.dao包中創建接口IBookMapper文件,代碼如下:
package com.example.mybatisdemo.dao; import com.example.mybatisdemo.entity.Book; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import java.util.List; /** * ClassName:IBookMapper * Description: * date:2021/1/12 8:39 * * @author Administrator * @since JDK 1.8 */ public interface IBookMapper { /** * 查詢所有書籍信息 * @return 所有書籍信息的List集合 */ @Select("select * from t_books") @Results({ @Result(property = "id",column = "id"), @Result(property = "name",column = "name"), @Result(property = "author",column = "author") }) public List<Book> getBooks(); }
4.4 編寫控制層代碼
在com.example.mybatisdemo下創建controller包,在包上新建BookController類,代碼如下:
package com.example.mybatisdemo.controller; import com.example.mybatisdemo.dao.IBookMapper; import com.example.mybatisdemo.entity.Book; import com.example.mybatisdemo.tool.DBUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * ClassName:BookController * Description: * date:2021/1/12 8:46 * * @author Administrator * @since JDK 1.8 */ @RestController @RequestMapping("/book/*") public class BookController { private IBookMapper iBookMapper= DBUtil.getSession().getMapper(IBookMapper.class); @RequestMapping("books") @ResponseBody public List<Book> showBooks(){ List<Book> books=iBookMapper.getBooks(); return books; } }
5 啓動程序,測試
啓動程序後,在瀏覽器地址欄輸入
http://localhost:8080/book/books
後發現程序出錯了,錯誤信息如下所示:
### Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${driver} ### The error may exist in com/example/mybatisdemo/dao/IBookMapper.java (best guess) ### The error may involve com.example.mybatisdemo.dao.IBookMapper.getBooks ### The error occurred while executing a query ### Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${driver}] with root cause java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${driver} at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.initializeDriver(UnpooledDataSource.java:244) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:223) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:219) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.getConnection(UnpooledDataSource.java:95) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:432) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.pooled.PooledDataSource.getConnection(PooledDataSource.java:89) ~[mybatis-3.5.6.jar:3.5.6]
根據錯誤信息的提示,應該是找不到數據源driver等信息,修改mybatis-config.xml配置件如下 :
<dataSource type="POOLED"> <property name="driver" value="${spring.datasource.driver-class-name}"/> <property name="url" value="${spring.datasource.url}"/> <property name="username" value="${spring.datasource.username}"/> <property name="password" value="${spring.datasource.password}"/> </dataSource>
再次啓動程序,瀏覽結果如下
至此,即實現了SpringBoot與MyBatis的整合。在以上的程序中,並沒分爲數據訪問層、業務層、控制層,控制器部分僅僅是實現前端UI與後端的交互或前端UI間跳轉,並不進行業務處理,因此,增加業務層。
6 業務層
在com.example.mybatisdemo包中新建service包,在包中新建BookService類,將原控制器中的代碼提取到service包中相關的類中。代碼如下:
package com.example.mybatisdemo.service; import com.example.mybatisdemo.dao.IBookMapper; import com.example.mybatisdemo.entity.Book; import com.example.mybatisdemo.tool.DBUtil; import org.springframework.stereotype.Service; import java.util.List; /** * ClassName:BookService * Description:Book類的業務邏輯 * date:2021/1/12 10:08 * * @author Administrator * @since JDK 1.8 */ @Service public class BookService { private IBookMapper iBookMapper= DBUtil.getSession().getMapper(IBookMapper.class); /** * 取得所有書籍信息 * @return 所有書籍信息的List集合 */ public List<Book> getBooks(){ return iBookMapper.getBooks(); } }
BookController修改如下:
@RestController @RequestMapping("/book/*") public class BookController { @Autowired private BookService bookService; @RequestMapping("books") @ResponseBody public List<Book> showBooks(){ List<Book> books=bookService.getBooks(); return books; } }
至此,SpringBoot整合MyBatis基本完成。