在mybatis用mysql的代码块_mybatis plus与mysql分库组件mycat的结合

之前的文章简单介绍了一下mybatis plus:《使用Mybatis-plus代替原生Mybatis》。截止目前在项目中使用了一段时间的mybatis plus,再也没有写过sql,都用mp的Wrapper封装查询条件了。这里先简单介绍一下mp的用法(抱歉,上一篇里面讲得实在太水了,因为当时自己也不会用),然后再说和mycat的整合。

代码生成

先在数据库建好表,假设表名是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);

// 数据源配置

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 实现类父类

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);

// 执行生成

mpg.execute();

}

}

建议把这个文件放到test目录下,执行后会在跟目录下生成代码,分别拷贝到对应的包中即可。

CRUD

下面分别简单介绍下常用的dml功能。

根据ID或其他条件查询

如果是根据ID查询比较简单,使用替你生成的IService的子接口调用

com.baomidou.mybatisplus.extension.service.IService#getById

如果是根据其他条件,返回是单个对象的话使用

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可以传入一个对象用来封装查询条件,也可以直接调用com.baomidou.mybatisplus.core.conditions.query.QueryWrapper的方法封装条件。

QueryWrapper提供了很多方法匹配标准sql的语法,比如eq是相等,ne是不等于,ge是大于等于,lt是小于,等等。还可以分组、排序、模糊查询等等(其实是其抽象父类com.baomidou.mybatisplus.core.conditions.AbstractWrapper提供的)。

注意:QueryWrapper的同一个条件多次使用不会被覆盖,所以就相当于无效查询了。比如

QueryWrapper> qw = new QueryWrapper<>();

qw.eq("id", "1209570800020050");

qw.eq("id", "1209570800020051");

qw.in("name", list);

List> list = service.list(qw);

这段代码期望查询name在集合list中、并且id是第二次传入的结果。但实际上生成的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)

第一个参数是要更新的字段,第二个参数封装的匹配条件。如果是根据ID更新,则不用传入第二个参数,将ID赋到第一个参数即可。

更新也提供批量接口

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)

执行区别是判断是否传入ID,有则更新,无则插入。

删除

删除就不说了,现在很少有物理删除功能。如果需要可以查找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 优化,只针对部分 left join

paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));

return paginationInterceptor;

}

}

分库组件mycat

分库分表在国内已经很火爆了,我项目里用的是mycat。

其实是基础架构层用的,项目里几乎看不出在使用分库或者使用了mycat。

有一点这里要说一下,就是使用mybatis plus整合mycat 查询的话,sessionFactory必须使用Mp提供的

com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean

类,否则可能会找不到mapper语句,因为mp的语句都是自己的代理生成的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

响应服务器535.5.7.0AUTH,javax.mail.AuthenticationFailedException:535 5.7.3无法发送邮件

我遇到了错误javax.mail.AuthenticationFailedException&#xff1a;535 5.7.3尝试发送电子邮件时的身份验证。我尝试使用两个不同的电子邮件帐户。一个使用Office365服务器详细信息&#xff0c;另一个使用Gmail服务器详细信息。在两种情况下&#xff0c;我都会遇到相同的错误。…

react生命周期函数_如何优雅的消灭掉react生命周期函数

开源不易&#xff0c;感谢你的支持&#xff0c;❤ star concent^_^序言在react应用里&#xff0c;存在一个顶层组件&#xff0c;该组件的生命周期很长&#xff0c;除了人为的调用unmountComponentAtNode接口来卸载掉它和用户关闭掉浏览器tab页窗口&#xff0c;该顶层组件是不会…

jolokia_Hawtio和Jolokia的Hibernate统计

jolokia企业Java的很大一部分处理数据。 在企业设置中使用数据的所有不同方式中&#xff0c;仍然存在使用任何种类的O / R映射的行之有效且广泛教授的方法。 JPA标准使每个人都比较容易使用它&#xff0c;并且它也应该是可移植的。 但是&#xff0c;我们不要谈论迁移细节。 O /…

python主循环方法mainloop_python gobject.mainloop吞噬信号事件

没有人感兴趣,所以让我尝试. 只是在同一页面上&#xff1a; import signal from gi.repository import GObject GObject.threads_init() mainloop GObject.MainLoop() signal.signal(signal.SIGINT, lambda n, f: mainloop.quit()) mainloop.run() 此代码有效&#xff1a; imp…

JVM垃圾收集和优化

总览 在对系统进行性能相关问题的故障排除时&#xff0c;内存优化是一个需要深入分析每个系统在内存中存储的内容&#xff0c;存储时间和访问模式的地方。 这篇文章是要在背景信息上进行注释&#xff0c;并在此工作中要注意一些要点&#xff0c;这些工作要专门针对基于Java的实…

redis desktop manager连不上redis_Redis安装教程

Ⅰ 简介Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;&#xff0c;散列&#xff08;hashes&#…

python打开方式错误_浅谈python 调用open()打开文件时路径出错的原因

昨晚搞鼓了一下python的open&#xff08;&#xff09;打开文件 代码如下 def main(): infile open("C:\Users\Spirit\Desktop\bc.txt",r) data infile.read() print(data) main() 然而结果总报错invaild argument 或者cant found such file *** 查找问题后 发现是由…

c++如何将int数组中的值取出*号运算符_如何用动态规划巧妙解决 “双十一” 购物时的凑单问题?羊毛薅起来!!!...

点击上方“程序员大白”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达今年过去的 “双十一” &#xff0c;你有薅到羊毛吗&#xff1f;每年的双十一&#xff0c;会有各种促销活动&#xff0c;比如 “满 300元减 80 元”。假如你女朋友的购物车中有 n 个(n &…

mysql sql 去除重复行_mysql – sql自连接表删除重复行

我有下表&#xff1a;╔════════╦════════════╗║ USERID ║ LANGUAGEID ║╠════════╬════════════╣║ 1 ║ 2 ║║ 1 ║ 7 ║║ 1 ║ 8 ║║ 2 ║ 10 ║║ 2 ║ 3 ║╚════════╩════════════╝现在我想为每…

python操作界面_Python使用PyQt5的Designer工具创建UI界面

一、Designer-UI编辑器 Designer是pyqt5-tools带的工具&#xff0c;默认可以在Python安装目录下找到的。我的之前项目导入过pyqt5-tools&#xff0c;所以我直接全盘搜索到了。打开designer后&#xff0c;我们可以编辑我们想要的UI界面&#xff0c;下面是我编辑的测试界面&#…

python统计词频_Python统计四六级考试的词频

Python统计四六级考试的词频此文首发于公众号 「Python知识圈」&#xff0c; 欢迎直接去公众号查看阅读文本大概需要 4.6 分钟。今天是教师节&#xff0c;先祝天下所有老师教师节快乐&#xff0c;感谢您在我学生时代对我的谆谆教诲。现在是开学之初&#xff0c;风华正茂的青年才…

易语言 字段重复_使对易失性字段的操作原子化

易语言 字段重复总览 易失性字段的预期行为是&#xff0c;它们在多线程应用程序中的行为应与在单线程应用程序中的行为相同。 禁止它们表现相同的方式&#xff0c;但是不能保证它们表现相同的方式。 Java 5.0中的解决方案是使用AtomicXxxx类&#xff0c;但是这些类在内存&…

python爬虫数据可视化_适用于Python入门者的爬虫和数据可视化案例

本篇文章适用于Python小白的教程篇&#xff0c;如果有哪里不足欢迎指出来&#xff0c;希望对你帮助。 本篇文章用到的模块&#xff1a; requests,re,os,jieba,glob,json,lxml,pyecharts,heapq,collection 首先 本文我们的目的 抓取周杰伦的所有歌曲&#xff0c; 歌词&#xff0…

qt4 连接mysql_Qt4访问mysql 数据库的简单教程

编译问题&#xff1a;1、系统中安装有VC&#xff0c;所以头文件冲突手工修改makefile删除所有-I 加载VC头文件的项目2、mysql cannot find -llibmysql指定libmysql.a的路径-LQt 4 访问 mysql 数据库的简单教程云帆 2006/5/18因为目前无法使用linux&#xff0c; 所以 Qt 4.1.2 是…

python多个函数_什么是在Python中使用多个构造函数的干净的、pythonic的方法?

其实None对于“魔法”价值观来说要好得多&#xff1a;class Cheese(): def __init__(self, num_holes None): if num_holes is None: ... 现在&#xff0c;如果您想完全自由地添加更多参数&#xff1a;class Cheese(): def __init__(self, *args, **kwargs): #args -- tuple o…

Java 8和Java 14之间的新功能

从版本9开始&#xff0c;Java每6个月就会有新功能&#xff0c;因此很难跟踪这些新更改。 互联网上的大多数信息都描述了最近两个Java版本之间的变化。 但是&#xff0c;如果您的情况与我相似&#xff0c;则说明您使用的不是Java的最新版本&#xff0c;而是使用了较旧的Java版本…

mysql中如何卸载插件_Eclipse中如何卸载插件

很久没用Eclipse了&#xff0c;今天打开的时候&#xff0c;突然报Android开发插件需要更新。打开插件管理页面&#xff0c;更新Android插件&#xff0c;又提示和旧版本有冲突&#xff0c;心想只能卸载了重新安装了。找了半天没找到在哪下载&#xff0c;把Eclipse目录下的plugin…

python io_NumPy IO

NumPy IO Numpy 可以读写磁盘上的文本数据或二进制数据。 NumPy 为 ndarray 对象引入了一个简单的文件格式&#xff1a;npy。 npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。 常用的 IO 函数有&#xff1a; load() 和 save() 函数是读写文件数组数据的两个…

Java 14:instanceof的模式匹配

Java 14引入了pattern Matching for instanceof &#xff08;另一种预览语言功能&#xff09; &#xff0c;从而消除了在使用instanceof时进行强制转换的需要。 例如&#xff0c;考虑以下代码&#xff1a; if (obj instanceof String) { String s (String) obj; System.out.pr…

centos7 mysql启动后端口_centos7 修改mysql5.7默认端口后启动异常

关闭selinux的方法有两种&#xff1a;临时关闭和永久关闭。查看selinux的状态&#xff1a;sestatus[root162-219-29-3 ~]# sestatusSELinux status: enabledSELinuxfs mount: /sys/fs/selinuxSELinux root directory: /etc/selinuxLoaded policy name: targetedCurrent mode: e…