Springboot中流行的持久層框架是Hibernate和Mybatis
前者已經成為Spring Data的規範,以極簡和全自動的物件對映著稱,後者是一個半自動化的ORM框架,SQL獨立存放在XML檔案中,提高自由度的同時也方便DBA進行校對和後續SQL優化
由於Mybatis plus完全基於Mybatis,且吸收了一部分HIbernate的優點,提供整合的CRUD,基本上現在開發中都使用Mybatis Plus替代原生Mybatis框架
敲黑板: MybatisPlus 不能和 Mybatis同時使用
使用流程(三步走)
- 新增Maven依賴
- MyBatisPlus 配置
- 編寫3種檔案(可使用外掛生成,Idea Mybatis generater)
- 實體entity
- Dao層介面Mapper
- Xml檔案中的Sql語句
第一步 新增Maven依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
複製程式碼
第二步 在application.yml中配置Mybatis Plus
使用properties配置檔案的可以在www.toyaml.com/index.html進行yml檔案的轉換
重點!!!
第一行的xml檔案掃描,此處的xml檔案存放在resource下的mapper路徑下(我的路徑是resource/mapper/xx模組/xxx.xml)
第二行的實體掃描!!!要根據自己的entity目錄進行配置 自己根據自己的實體類路徑修改typeAliasesPackage,或者使用我的這種模組化工程路徑(工程根目錄/modules/xx模組/entity/xxx.class)
mybatis-plus:
mapper-locations: classpath:mapper/**/*.xml #__對應第三步的mapper路徑__
#實體掃描,多個package用逗號或者分號分隔
typeAliasesPackage: io.renren.modules.*.entity #__對應第三步的entity路徑__
global-config:
#主鍵型別 0:"資料庫ID自增", 1:"使用者輸入ID",2:"全域性唯一ID (數字型別唯一ID)", 3:"全域性唯一ID UUID";
id-type: 0
#欄位策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"
field-strategy: 2
#駝峰下劃線轉換
db-column-underline: true
#重新整理mapper 除錯神器
refresh-mapper: true
#資料庫大寫下劃線轉換
#capital-mode: true
#序列介面實現類配置
#key-generator: com.baomidou.springboot.xxx
#邏輯刪除配置
logic-delete-value: -1
logic-not-delete-value: 0
#自定義填充策略介面實現
#meta-object-handler: com.baomidou.springboot.xxx
#自定義SQL隱碼攻擊器
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
複製程式碼
沒新增mysq資料來源的再新增如下配置
spring:
datasource:
continue-on-error: false
driver-class-name: com.mysql.jdbc.Driver
username: root ##根據自己MySQL的使用者名稱修改
url: jdbc:mysql://127.0.0.1:3306/renren_test ##根據自己MySQL的ip和埠修改
password: root ##根據自己MySQL的密碼修改
複製程式碼
第三步 進入正題
之前的步驟都是Mybatis的配置和管理,以下才是真正的業務程式碼
- entity 檔案放在entity目錄下(要與第二步的實體掃描路徑對應,忽略的回去仔細看第二步)
@TableName("sword")
public class Sword {
@TableId
private Long id;
private String name;
}
複製程式碼
之前用過JPA的可能直接執行發現並沒有在資料庫中建表,因為Mybatis不支援自動根據實體類建立表,所以需要自己建表,如果要引入這個功能可以引入JPA,只利用JPA的自動建表功能,本文為了簡單明瞭不涉及,可以檢視我另一篇文章Mybatis加入JPA的自動建表功能
- mapper放在Dao目錄下
@Repository
@Mapper
public interface SwordMapper {
Sword selectSword(Pagination page, String id);
void insertSword(
@Param("name") String name
);
}
複製程式碼
- xml(要與第二步的mapper掃描路徑對應,忽略的回去仔細看第二步)
<?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="io.renren.modules.test.Dao.SwordMapper">
<select id="selectSword" resultType="io.renren.modules.test.entity.Sword">
select * from sword limit 1
</select>
<insert id="insertSword">
insert into sword (name) values (#{name})
</insert>
</mapper>
複製程式碼
Mybatis框架的檔案引入方式:
- entity通過第二步的配置typeAliasesPackage進行查詢,也可以通過註解方式查詢
- Mybatis的xml與mapper對應,mapper提供java層的介面,xml儲存相對應的sql語句
- xml在第二步的配置中由Mybatis發現,相對應的Mapper檔案在xml中通過namespace的方式關聯
最後一步 測試
在Controller檔案中實現Restful介面 SwordController.class
@RestController
@RequestMapping
public SwordController {
@Autowired // 自動注入mapper
private SwordMapper swordMapper;
@GetMapping("sword")
public sword(UserEntity userEntity) {
Sword sword1 = new Sword();
sword1.setName("這是一把劍");
Sword sword = swordMapper.selectSword("1");
return sword;
}
}
複製程式碼
訪問127.0.0.1:8080/demo/sword
大功告成!
後記
在其他的部落格中大家可能看到,有很多利用sqlsession或者SqlSessionFactoryBean來載入Mybatis配置檔案,我這裡又沒有sqlsession,經常有人會被搞得一頭霧水,這裡解釋一下,在原生的mybatis中,sqlsession可以由SqlSessionFactory建立;而在mybatis-spring中則需要通過SqlSessionFactoryBean來建立,並傳入datasource。 像這樣
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation">
<value>classpath:mybatis/mapper.xml</value>
</property>
<property name="dataSource" ref="dataSource" />
</bean>
複製程式碼