在mybatis用mysql的代码块_mybatis plus与mysql分库组件mycat的结合
之前的文章簡單介紹了一下mybatis plus:《使用Mybatis-plus代替原生Mybatis》。截止目前在項目中使用了一段時間的mybatis plus,再也沒有寫過sql,都用mp的Wrapper封裝查詢條件了。這里先簡單介紹一下mp的用法(抱歉,上一篇里面講得實在太水了,因為當(dāng)時自己也不會用),然后再說和mycat的整合。
代碼生成
先在數(shù)據(jù)庫建好表,假設(shè)表名是t_mp_test。然后使用主類:
import com.baomidou.mybatisplus.annotation.DbType;
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.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.HashMap;
import java.util.Map;
public class MpGenerator {
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
System.out.println(projectPath);
gc.setOutputDir(projectPath + "/myplus");
gc.setAuthor("sheldon");
gc.setFileOverride(true); //是否覆蓋
gc.setActiveRecord(false);// 不需要ActiveRecord特性的請改為false
gc.setEnableCache(false);// XML 二級緩存
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(true);// XML columList
gc.setOpen(false);
gc.setEntityName("%sPO");
gc.setDateType(DateType.ONLY_DATE);
mpg.setGlobalConfig(gc);
// 數(shù)據(jù)源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setUrl("jdbc:mysql://127.0.0.1:3306/db?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8");
mpg.setDataSource(dsc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
strategy.setInclude(new String[] { "t_mp_test" }); // 需要生成的表
// 自定義 service 父類
strategy.setSuperServiceClass("com.baomidou.mybatisplus.extension.service.IService");
// 自定義 service 實現(xiàn)類父類
strategy.setSuperServiceImplClass("com.baomidou.mybatisplus.extension.service.impl.ServiceImpl");
mpg.setStrategy(strategy);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("a.b");
pc.setModuleName("c");
pc.setController("controller");
pc.setEntity("model");
pc.setMapper("mapper");
pc.setService("service");
pc.setServiceImpl("service.impl");
pc.setXml("mapper.xml");
mpg.setPackageInfo(pc);
mpg.setCfg(cfg);
// 執(zhí)行生成
mpg.execute();
}
}
建議把這個文件放到test目錄下,執(zhí)行后會在跟目錄下生成代碼,分別拷貝到對應(yīng)的包中即可。
CRUD
下面分別簡單介紹下常用的dml功能。
根據(jù)ID或其他條件查詢
如果是根據(jù)ID查詢比較簡單,使用替你生成的IService的子接口調(diào)用
com.baomidou.mybatisplus.extension.service.IService#getById
如果是根據(jù)其他條件,返回是單個對象的話使用
com.baomidou.mybatisplus.extension.service.IService#getOne(com.baomidou.mybatisplus.core.conditions.Wrapper)
返回集合的話使用
com.baomidou.mybatisplus.extension.service.IService#list(com.baomidou.mybatisplus.core.conditions.Wrapper)
Wrapper可以傳入一個對象用來封裝查詢條件,也可以直接調(diào)用com.baomidou.mybatisplus.core.conditions.query.QueryWrapper的方法封裝條件。
QueryWrapper提供了很多方法匹配標準sql的語法,比如eq是相等,ne是不等于,ge是大于等于,lt是小于,等等。還可以分組、排序、模糊查詢等等(其實是其抽象父類com.baomidou.mybatisplus.core.conditions.AbstractWrapper提供的)。
注意:QueryWrapper的同一個條件多次使用不會被覆蓋,所以就相當(dāng)于無效查詢了。比如
QueryWrapper> qw = new QueryWrapper<>();
qw.eq("id", "1209570800020050");
qw.eq("id", "1209570800020051");
qw.in("name", list);
List> list = service.list(qw);
這段代碼期望查詢name在集合list中、并且id是第二次傳入的結(jié)果。但實際上生成的sql條件是where id = “1209570800020050” and id = “1209570800020051” and name in (@list),所以一定命不中記錄。
增改
增加可以使用
com.baomidou.mybatisplus.extension.service.IService#save
或者批量增加接口
com.baomidou.mybatisplus.extension.service.IService#saveBatch(java.util.Collection)
更新可以使用
com.baomidou.mybatisplus.extension.service.IService#update(T, com.baomidou.mybatisplus.core.conditions.Wrapper)
第一個參數(shù)是要更新的字段,第二個參數(shù)封裝的匹配條件。如果是根據(jù)ID更新,則不用傳入第二個參數(shù),將ID賦到第一個參數(shù)即可。
更新也提供批量接口
com.baomidou.mybatisplus.extension.service.IService#updateBatchById(java.util.Collection)
另外,插入和更新可以使用同樣的方法
com.baomidou.mybatisplus.extension.service.IService#saveOrUpdate(T)
或
com.baomidou.mybatisplus.extension.service.IService#saveOrUpdateBatch(java.util.Collection)
執(zhí)行區(qū)別是判斷是否傳入ID,有則更新,無則插入。
刪除
刪除就不說了,現(xiàn)在很少有物理刪除功能。如果需要可以查找remove開頭的方法,一定能滿足你。
其他
mp還提供了很多十分方便的api,比如 QueryWrapper 提供了last方法,可以在生成的sql末尾加自定義語句,如limit 1。再比如分頁查詢接口page,你可以探索一下用法。
注意mp的分頁方法必須搭配攔截器,否則無效:
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 開啟 count 的 join 優(yōu)化,只針對部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
分庫組件mycat
分庫分表在國內(nèi)已經(jīng)很火爆了,我項目里用的是mycat。
其實是基礎(chǔ)架構(gòu)層用的,項目里幾乎看不出在使用分庫或者使用了mycat。
有一點這里要說一下,就是使用mybatis plus整合mycat 查詢的話,sessionFactory必須使用Mp提供的
com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean
類,否則可能會找不到mapper語句,因為mp的語句都是自己的代理生成的。
總結(jié)
以上是生活随笔為你收集整理的在mybatis用mysql的代码块_mybatis plus与mysql分库组件mycat的结合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于人生的诗句190个
- 下一篇: 好听又简单的女生网名121个