SpringBoot
是爲了簡化Spring
應用的建立、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓咱們能夠更好的關注業務自己而不是外部的XML配置,咱們只需遵循規範,引入相關的依賴就能夠輕易的搭建出一個 WEB 工程
MyBatis
是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射,幾乎避免了全部的 JDBC 代碼和手動設置參數以及獲取結果集,使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄,在國內可謂是佔據了半壁江山......html
<!-- more -->java
如下針對Spring JDBC
、 Spring Data Jpa
、Mybatis
三款框架作了個粗略的對比。通常應用的性能瓶頸並非在於ORM,因此這三個框架技術選型應該考慮項目的場景
、團隊的技能掌握狀況
、開發週期(開發效率)
...mysql
框架對比 | Spring JDBC | Spring Data Jpa | Mybatis |
---|---|---|---|
性能 | 性能最好 | 性能最差 | 居中 |
代碼量 | 多 | 少 | 多 |
學習成本 | 低 | 高 | 居中 |
推薦指數 | ❤❤❤ | ❤❤❤❤❤ | ❤❤❤❤❤ |
我的觀點
拋開學習成本而言,對於業務簡單的中小型項目中使用Spring Data Jpa
開發無異因而最快速的。可是鑑於國內市場環境而言,掌握Mybatis
無異因而佳的選擇,低學習成本和動態SQL解耦的特色使得更容易被人們所接受。對於業務複雜且對性能要求較高的項目來講Mybatis
每每能更好的勝任,能夠本身進行SQL優化,同時更讓我喜歡的是Mybatis分頁插件與通用Mapper(單表CURD無需本身手寫)有了這兩款插件的支持,還有什麼理由拒絕Mybatis
呢git
在 pom.xml
中添加 Mybatis
的依賴包mybatis-spring-boot-starter
,該包擁有自動裝配的特色github
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!-- MYSQL包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 默認就內嵌了Tomcat 容器,如須要更換容器也極其簡單--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 測試包,當咱們使用 mvn package 的時候該包並不會被打入,由於它的生命週期只在 test 以內--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
與SpringDataJpa
、Spring JDBC
同樣,須要在application.properties
中添加數據源的配置,同時也須要添加對mybatis
的配置web
spring.datasource.url=jdbc:mysql://localhost:3306/chapter6?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false spring.datasource.password=root spring.datasource.username=root # 注意注意 mybatis.mapper-locations=classpath:com/battcn/mapper/*.xml #mybatis.mapper-locations=classpath:mapper/*.xml #這種方式須要本身在resources目錄下建立mapper目錄而後存放xml mybatis.type-aliases-package=com.battcn.entity # 駝峯命名規範 如:數據庫字段是 order_id 那麼 實體字段就要寫成 orderId mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.map-underscore-to-camel-case
是一個很是好的配置項,合理的命名規範可讓咱們省略不少沒必要要的麻煩,好比xx-mapper.xml中的resultMap
的映射能夠省略掉了spring
注意事項
因爲 mybatis.mapper-locations=classpath:com/battcn/mapper/*.xml
配置的在java package
中,而Spring Boot
默認只打入java package -> *.java
,因此咱們須要給pom.xml
文件添加以下內容sql
<build> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
完成基本配置後,接下來進行具體的編碼操做。數據庫
建立一張 t_user
的表apache
CREATE TABLE `t_user` ( `id` int(8) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增', `username` varchar(50) NOT NULL COMMENT '用戶名', `password` varchar(50) NOT NULL COMMENT '密碼', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';
package com.battcn.entity; import java.io.Serializable; /** * @author Levin * @since 2018/5/9 0007 */ public class User implements Serializable { private static final long serialVersionUID = 8655851615465363473L; private Long id; private String username; private String password; // TODO 省略get set }
這裏提供了兩種方式操做接口,第一種帶@Select
註解的是Mybatis3.x
提供的新特性,同理它還有@Update
、@Delete
、@Insert
等等一系列註解,第二種就是傳統方式了,寫個接口映射,而後在XML中寫上咱們的SQL語句...
UserMapper
package com.battcn.mapper; import com.battcn.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; /** * t_user 操做:演示兩種方式 * <p>第一種是基於mybatis3.x版本後提供的註解方式<p/> * <p>第二種是早期寫法,將SQL寫在 XML 中<p/> * * @author Levin * @since 2018/5/7 0007 */ @Mapper public interface UserMapper { /** * 根據用戶名查詢用戶結果集 * * @param username 用戶名 * @return 查詢結果 */ @Select("SELECT * FROM t_user WHERE username = #{username}") List<User> findByUsername(@Param("username") String username); /** * 保存用戶信息 * * @param user 用戶信息 * @return 成功 1 失敗 0 */ int insert(User user); }
UserMapper
映射文件
<?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.battcn.mapper.UserMapper"> <insert id="insert" parameterType="com.battcn.entity.User"> INSERT INTO `t_user`(`username`,`password`) VALUES (#{username},#{password}) </insert> </mapper>
完成數據訪問層接口後,最後編寫一個junit
測試類來檢驗代碼的正確性。
package com.battcn; import com.battcn.entity.User; import com.battcn.mapper.UserMapper; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; /** * @author Levin */ @RunWith(SpringRunner.class) @SpringBootTest public class Chapter6ApplicationTests { private static final Logger log = LoggerFactory.getLogger(Chapter6ApplicationTests.class); @Autowired private UserMapper userMapper; @Test public void test1() throws Exception { final int row1 = userMapper.insert(new User("u1", "p1")); log.info("[添加結果] - [{}]", row1); final int row2 = userMapper.insert(new User("u2", "p2")); log.info("[添加結果] - [{}]", row2); final int row3 = userMapper.insert(new User("u1", "p3")); log.info("[添加結果] - [{}]", row3); final List<User> u1 = userMapper.findByUsername("u1"); log.info("[根據用戶名查詢] - [{}]", u1); } }
更多Mybatis
的騷操做,請參考官方文檔
目前不少大佬都寫過關於 SpringBoot
的教程了,若有雷同,請多多包涵,本教程基於最新的 spring-boot-starter-parent:2.0.1.RELEASE
編寫,包括新版本的特性都會一塊兒介紹...
battcn
全文代碼:https://github.com/battcn/spring-boot2-learning/tree/master/chapter6