JavaWeb專案從零開始(3)--- 整合Mybatis-Plus,簡化開發,增強工作效率
阿新 • • 發佈:2019-01-02
mybatis每次查詢都要寫sql是不是很煩?每次都要貼上複製一個Controller、Service、Dao、mapper.xml是不是不想每次都重複這樣的工作? Mybatis-Plus 可以幫你解決上述的煩惱。
(一)簡介
Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
(二)特性
無侵入:Mybatis-Plus 在 Mybatis 的基礎上進行擴充套件,只做增強不做改變,引入 Mybatis-Plus 不會對您現有的
Mybatis 構架產生任何影響,而且 MP 支援所有 Mybatis 原生的特性依賴少:僅僅依賴 Mybatis 以及 Mybatis-Spring
- 損耗小:啟動即會自動注入基本CURD,效能基本無損耗,直接面向物件操作
- 預防Sql注入:內建Sql注入剝離器,有效預防Sql注入攻擊
- 通用CRUD操作:內建通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
- 多種主鍵策略:支援多達4種主鍵策略(內含分散式唯一ID生成器),可自由配置,完美解決主鍵問題
- 支援熱載入:Mapper 對應的 XML 支援熱載入,對於簡單的 CRUD 操作,甚至可以無 XML 啟動
- 支援ActiveRecord:支援 ActiveRecord 形式呼叫,實體類只需繼承 Model 類即可實現基本 CRUD 操作
- 支援程式碼生成:採用程式碼或者 Maven 外掛可快速生成 Mapper 、 Model 、 Service 、 Controller 層程式碼,支援模板引擎,更有超多自定義配置等您來使用(P.S. 比 Mybatis 官方的 Generator 更加強大!)
- 支援自定義全域性通用操作:支援全域性通用方法注入( Write once, use anywhere )
支援關鍵詞自動轉義:支援資料庫關鍵詞(order、key……)自動轉義,還可自定義關鍵詞 - 內建分頁外掛:基於Mybatis物理分頁,開發者無需關心具體操作,配置好外掛之後,寫分頁等同於普通List查詢
- 內建效能分析外掛:可輸出Sql語句以及其執行時間,建議開發測試時啟用該功能,能有效解決慢查詢
- 內建全域性攔截外掛:提供全表 delete 、 update 操作智慧分析阻斷,預防誤操作
(三)快速整合
pom.xml
加入相關依賴、把之前引入的mybatis相關包註釋掉或刪掉
特別說明:Mybatis及Mybatis-Spring依賴請勿加入專案配置,以免引起版本衝突!!!Mybatis-Plus會自動幫你維護!
<!-- MyBatis -->
<!--<dependency>-->
<!--<groupId>org.mybatis</groupId>-->
<!--<artifactId>mybatis</artifactId>-->
<!--<version>3.4.4</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>org.mybatis</groupId>-->
<!--<artifactId>mybatis-spring</artifactId>-->
<!--<version>1.3.1</version>-->
<!--</dependency>-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.0.8</version>
</dependency>
<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
spring-context.xml
把之前mybatis配置的 sqlSessionFactory 換成下面的。
<!-- 配置MyBatis plus -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 配置資料來源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 自動掃描 Xml 檔案位置 -->
<property name="mapperLocations" value="classpath:mapper/*/*.xml"/>
<!-- 配置 Mybatis 配置檔案(可無) -->
<property name="configLocation" value="classpath:config/mybatis-config.xml"/>
<!-- 配置包別名 -->
<property name="typeAliasesPackage" value="com.baomidou.springmvc.model"/>
<!-- 以上配置和傳統 Mybatis 一致 -->
<!-- 外掛配置 -->
<property name="plugins">
<array>
<!-- 分頁外掛配置 -->
<bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
<!-- 指定資料庫方言 -->
<property name="dialectType" value="mysql"/>
</bean>
<!-- 如需要開啟其他外掛,可配置於此 -->
</array>
</property>
<!-- MP 全域性配置注入 -->
<property name="globalConfig" ref="globalConfig"/>
</bean>
<!-- 定義 MP 全域性策略 -->
<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 主鍵策略配置 -->
<!-- 可選引數
AUTO->`0`("資料庫ID自增")
INPUT->`1`(使用者輸入ID")
ID_WORKER->`2`("全域性唯一ID")
UUID->`3`("全域性唯一ID")
-->
<property name="idType" value="2"/>
<!-- 資料庫型別配置 -->
<!-- 可選引數(預設mysql)
MYSQL->`mysql`
ORACLE->`oracle`
DB2->`db2`
H2->`h2`
HSQL->`hsql`
SQLITE->`sqlite`
POSTGRE->`postgresql`
SQLSERVER2005->`sqlserver2005`
SQLSERVER->`sqlserver`
-->
<property name="dbType" value="mysql"/>
<!-- 全域性表為下劃線命名設定 true -->
<property name="dbColumnUnderline" value="true"/>
</bean>
<!-- XML檔案熱載入 -->
<bean class="com.baomidou.mybatisplus.spring.MybatisMapperRefresh">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
<constructor-arg name="mapperLocations" value="classpath:mapper/*/*.xml"/>
<constructor-arg name="enabled" value="true"/>
</bean>
OK整合完畢,簡單吧
(四)程式碼生成器
在專案中新建一個類檔案,run一下就行了,具體配置看註釋
import java.util.HashMap;
import java.util.Map;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
* <p>
* 程式碼生成器演示
* </p>
*/
public class MpGenerator {
/**
* <p>
* MySQL 生成演示
* </p>
*/
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
// 全域性配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("D://");
gc.setFileOverride(true);
gc.setActiveRecord(true);
gc.setEnableCache(false);// XML 二級快取
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(false);// XML columList
gc.setAuthor("Yanghu");
// 自定義檔案命名,注意 %s 會自動填充表實體屬性!
// gc.setMapperName("%sDao");
// gc.setXmlName("%sDao");
// gc.setServiceName("MP%sService");
// gc.setServiceImplName("%sServiceDiy");
// gc.setControllerName("%sAction");
mpg.setGlobalConfig(gc);
// 資料來源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setTypeConvert(new MySqlTypeConvert(){
// 自定義資料庫表字段型別轉換【可選】
@Override
public DbColumnType processTypeConvert(String fieldType) {
System.out.println("轉換型別:" + fieldType);
return super.processTypeConvert(fieldType);
}
});
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("521");
dsc.setUrl("jdbc:mysql://127.0.0.1:3306/mybatis-plus?characterEncoding=utf8");
mpg.setDataSource(dsc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// strategy.setCapitalMode(true);// 全域性大寫命名 ORACLE 注意
strategy.setTablePrefix(new String[] { "tlog_", "tsys_" });// 此處可以修改為您的表字首
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
// strategy.setInclude(new String[] { "user" }); // 需要生成的表
// strategy.setExclude(new String[]{"test"}); // 排除生成的表
// 自定義實體父類
// strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
// 自定義實體,公共欄位
// strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
// 自定義 mapper 父類
// strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
// 自定義 service 父類
// strategy.setSuperServiceClass("com.baomidou.demo.TestService");
// 自定義 service 實現類父類
// strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
// 自定義 controller 父類
// strategy.setSuperControllerClass("com.baomidou.demo.TestController");
// 【實體】是否生成欄位常量(預設 false)
// public static final String ID = "test_id";
// strategy.setEntityColumnConstant(true);
// 【實體】是否為構建者模型(預設 false)
// public User setName(String name) {this.name = name; return this;}
// strategy.setEntityBuliderModel(true);
mpg.setStrategy(strategy);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.baomidou");
pc.setModuleName("test");
mpg.setPackageInfo(pc);
// 注入自定義配置,可以在 VM 中使用 cfg.abc 【可無】
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
this.setMap(map);
}
};
// 自定義 xxList.jsp 生成
List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
focList.add(new FileOutConfig("/template/list.jsp.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定義輸入檔名稱
return "D://my_" + tableInfo.getEntityName() + ".jsp";
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 調整 xml 生成目錄演示
focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return "/develop/code/xml/" + tableInfo.getEntityName() + ".xml";
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 關閉預設 xml 生成,調整生成 至 根目錄
TemplateConfig tc = new TemplateConfig();
tc.setXml(null);
mpg.setTemplate(tc);
// 自定義模板配置,可以 copy 原始碼 mybatis-plus/src/main/resources/template 下面內容修改,
// 放置自己專案的 src/main/resources/template 目錄下, 預設名稱一下可以不配置,也可以自定義模板名稱
// TemplateConfig tc = new TemplateConfig();
// tc.setController("...");
// tc.setEntity("...");
// tc.setMapper("...");
// tc.setXml("...");
// tc.setService("...");
// tc.setServiceImpl("...");
// 如上任何一個模組如果設定 空 OR Null 將不生成該模組。
// mpg.setTemplate(tc);
// 執行生成
mpg.execute();
// 列印注入設定【可無】
System.err.println(mpg.getCfg().getMap().get("abc"));
}
}