,其中domainObjectName
是要生成实体类的名字
4.5 创建mybatis generator启动类
这里需要注意,启动mybatis generator有2种方式:插件启动;启动类启动。
鉴于插件启动对后面自定义注释有很多问题且暂时未找到解决方案,这里极力推荐使用启动类启动。因此插件启动方式这里不赘述了。
官方提供的启动方法如下:(第4行代码中需要填写自己generatorConfig.xml所在的路径 )
List< String> warnings= new ArrayList < String> ( ) ;
boolean overWriter= true ;
File configFile= new File ( MyGenerator. class . getResource ( "/generatorConfig.xml" ) . getFile ( ) ) ;
ConfigurationParser cp= new ConfigurationParser ( warnings) ;
Configuration config= cp. parseConfiguration ( configFile) ;
DefaultShellCallback callback= new DefaultShellCallback ( overWriter) ;
MyBatisGenerator myBatisGenerator= new MyBatisGenerator ( config, callback, warnings) ;
myBatisGenerator. generate ( null) ;
完整的启动类如下:
public class MyGenerator {
public static void main ( String[ ] args) throws Exception{
new MyGenerator ( ) . generate ( ) ;
}
public void generate ( ) throws Exception{
List< String> warnings= new ArrayList < String> ( ) ;
boolean overWriter= true ;
File configFile= new File ( MyGenerator. class . getResource ( "/generatorConfig.xml" ) . getFile ( ) ) ;
ConfigurationParser cp= new ConfigurationParser ( warnings) ;
Configuration config= cp. parseConfiguration ( configFile) ;
DefaultShellCallback callback= new DefaultShellCallback ( overWriter) ;
MyBatisGenerator myBatisGenerator= new MyBatisGenerator ( config, callback, warnings) ;
myBatisGenerator. generate ( null) ;
}
}
只要能运行到官方提供的方法就可以启动了,这里我在main方法里面调用它,只要我启动main方法就可以生成实体类、xxxMapper.java、xxxMapper.xml文件了。
如果有报错问题的伙伴首先可以删除target文件夹下的classes文件夹,然后再启动试试(它会生成新的classes文件夹)。
如果仍报错,可以尝试更新mybatis-generator版本或者看看路径那些是否写正确了。
有问题的小伙伴可留言
五. 生成自定义注释
5.1 问题背景
有时字段太多且无法从字面意思直到其存储的内容是什么意义,因此我们此时可以生成注释。但是 mybatis generator自动生成的注释都是以下这些无用的注释 ,如下:
/**
* This class was generated by MyBatis Generator.
* This class corresponds to the database table
* @mbg xxx xxx-xx-xx xx:xx:xx
*/
而 我们想要的是这些有用的、字段的注释:
private String individualid;
private String name;
因此我们可以自定义注释,而且这些注释是从数据表的字段那个注释获取而来。
5.2 实现自定义注释
5.2.1 创建自定义注释的类
创建一个类(名字随意,这里我使用MyCommentGenerator
)并实现CommentGenerator
接口。这里首先拿一个很关键的方法来讲解,它的作用是给实体类的属性添加数据表字段的注释。代码如下(注意代码中的注释,完整代码后面会给出某些解释 ):
public void addFieldComment ( Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if ( ! this . suppressAllComments) {
field. addJavaDocLine ( "/**" ) ;
String remarks = introspectedColumn. getRemarks ( ) ;
StringBuilder sb = new StringBuilder ( ) ;
sb. append ( " * " + remarks) ;
field. addJavaDocLine ( sb. toString ( ) ) ;
field. addJavaDocLine ( " */" ) ;
}
}
解释:
如上代码所示,根据数据表字段的注释生成注释的方法是有3个形参的addFieldComment(xx,xx,xx)
,获取字段注释的关键方法是String remarks = introspectedColumn.getRemarks()
,大家根据自己的需要可以将无用的代码注释掉(那些都是生成无用注释的代码),然后修改成自己想要的注释。
下面贴出 完整的自定义注释的类,大家可以直接copy,然后根据自己的需要去修改。比如有些方法是生成xxxMapper.java文件的注释,如果不想生成无用的注释,可以直接将if判断句注释掉或者删掉 。代码如下:(下面代码中的注释解释了各个方法的作用 )
package com. icbc. demo. config;
public class MyCommentGenerator implements CommentGenerator {
private Properties properties = new Properties ( ) ;
private boolean suppressDate = false ;
private boolean suppressAllComments = false ;
private boolean addRemarkComments = false ;
private SimpleDateFormat dateFormat;
public MyCommentGenerator ( ) {
}
public void addJavaFileComment ( CompilationUnit compilationUnit) {
}
public void addComment ( XmlElement xmlElement) {
}
public void addRootComment ( XmlElement rootElement) {
}
@Override
public void addGeneralMethodAnnotation ( Method method, IntrospectedTable introspectedTable, Set< FullyQualifiedJavaType> set) {
}
@Override
public void addGeneralMethodAnnotation ( Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set< FullyQualifiedJavaType> set) {
}
@Override
public void addFieldAnnotation ( Field field, IntrospectedTable introspectedTable, Set< FullyQualifiedJavaType> set) {
}
@Override
public void addFieldAnnotation ( Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set< FullyQualifiedJavaType> set) {
}
@Override
public void addClassAnnotation ( InnerClass innerClass, IntrospectedTable introspectedTable, Set< FullyQualifiedJavaType> set) {
}
public void addConfigurationProperties ( Properties properties) {
this . properties. putAll ( properties) ;
this . suppressDate = StringUtility. isTrue ( properties. getProperty ( "suppressDate" ) ) ;
this . suppressAllComments = StringUtility. isTrue ( properties. getProperty ( "suppressAllComments" ) ) ;
this . addRemarkComments = StringUtility. isTrue ( properties. getProperty ( "addRemarkComments" ) ) ;
String dateFormatString = properties. getProperty ( "dateFormat" ) ;
if ( StringUtility. stringHasValue ( dateFormatString) ) {
this . dateFormat = new SimpleDateFormat ( dateFormatString) ;
}
}
protected void addJavadocTag ( JavaElement javaElement, boolean markAsDoNotDelete) {
javaElement. addJavaDocLine ( " *" ) ;
StringBuilder sb = new StringBuilder ( ) ;
sb. append ( " * " ) ;
sb. append ( "@mbg.generated" ) ;
if ( markAsDoNotDelete) {
sb. append ( " do_not_delete_during_merge" ) ;
}
String s = this . getDateString ( ) ;
if ( s != null) {
sb. append ( ' ' ) ;
sb. append ( s) ;
}
javaElement. addJavaDocLine ( sb. toString ( ) ) ;
}
protected String getDateString ( ) {
if ( this . suppressDate) {
return null;
} else {
return this . dateFormat != null ? this . dateFormat. format ( new Date ( ) ) : ( new Date ( ) ) . toString ( ) ;
}
}
public void addClassComment ( InnerClass innerClass, IntrospectedTable introspectedTable) {
if ( ! this . suppressAllComments) {
StringBuilder sb = new StringBuilder ( ) ;
innerClass. addJavaDocLine ( "/**" ) ;
innerClass. addJavaDocLine ( " * This class was generated by MyBatis Generator." ) ;
sb. append ( " * This class corresponds to the database table " ) ;
sb. append ( introspectedTable. getFullyQualifiedTable ( ) ) ;
innerClass. addJavaDocLine ( sb. toString ( ) ) ;
this . addJavadocTag ( innerClass, false ) ;
innerClass. addJavaDocLine ( " */" ) ;
}
}
public void addModelClassComment ( TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
if ( ! this . suppressAllComments && this . addRemarkComments) {
StringBuilder sb = new StringBuilder ( ) ;
topLevelClass. addJavaDocLine ( "/**" ) ;
String remarks = introspectedTable. getRemarks ( ) ;
if ( this . addRemarkComments && StringUtility. stringHasValue ( remarks) ) {
topLevelClass. addJavaDocLine ( " * Database Table Remarks:" ) ;
String[ ] remarkLines = remarks. split ( System. getProperty ( "line.separator" ) ) ;
String[ ] var6 = remarkLines;
int var7 = remarkLines. length;
for ( int var8 = 0 ; var8 < var7; ++ var8) {
String remarkLine = var6[ var8] ;
topLevelClass. addJavaDocLine ( " * " + remarkLine) ;
}
}
topLevelClass. addJavaDocLine ( " *" ) ;
topLevelClass. addJavaDocLine ( " * This class was generated by MyBatis Generator." ) ;
sb. append ( " * This class corresponds to the database table " ) ;
sb. append ( introspectedTable. getFullyQualifiedTable ( ) ) ;
topLevelClass. addJavaDocLine ( sb. toString ( ) ) ;
this . addJavadocTag ( topLevelClass, true ) ;
topLevelClass. addJavaDocLine ( " */" ) ;
}
}
public void addEnumComment ( InnerEnum innerEnum, IntrospectedTable introspectedTable) {
if ( ! this . suppressAllComments) {
StringBuilder sb = new StringBuilder ( ) ;
innerEnum. addJavaDocLine ( "/**" ) ;
innerEnum. addJavaDocLine ( " * This enum was generated by MyBatis Generator." ) ;
sb. append ( " * This enum corresponds to the database table " ) ;
sb. append ( introspectedTable. getFullyQualifiedTable ( ) ) ;
innerEnum. addJavaDocLine ( sb. toString ( ) ) ;
this . addJavadocTag ( innerEnum, false ) ;
innerEnum. addJavaDocLine ( " */" ) ;
}
}
public void addFieldComment ( Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if ( ! this . suppressAllComments) {
field. addJavaDocLine ( "/**" ) ;
String remarks = introspectedColumn. getRemarks ( ) ;
StringBuilder sb = new StringBuilder ( ) ;
sb. append ( " * " + remarks) ;
field. addJavaDocLine ( sb. toString ( ) ) ;
field. addJavaDocLine ( " */" ) ;
}
}
public void addFieldComment ( Field field, IntrospectedTable introspectedTable) {
}
public void addGeneralMethodComment ( Method method, IntrospectedTable introspectedTable) {
}
public void addGetterComment ( Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
public void addSetterComment ( Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
public void addClassComment ( InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
if ( ! this . suppressAllComments) {
StringBuilder sb = new StringBuilder ( ) ;
innerClass. addJavaDocLine ( "/**" ) ;
innerClass. addJavaDocLine ( " * This class was generated by MyBatis Generator." ) ;
sb. append ( " * This class corresponds to the database table " ) ;
sb. append ( introspectedTable. getFullyQualifiedTable ( ) ) ;
innerClass. addJavaDocLine ( sb. toString ( ) ) ;
this . addJavadocTag ( innerClass, markAsDoNotDelete) ;
innerClass. addJavaDocLine ( " */" ) ;
}
}
}
5.2.2 引入自定义注释的类
定义好类后,需要将该类让mybatis generator知道,只需在generatorConfig.xml中配置如下:
< commentGenerator type = " com.icbc.demo.config.MyCommentGenerator" >
< property name = " suppressAllComments" value = " false" />
commentGenerator>
解释:type的值要使用全类名,suppressAllComments的value要为false才能开启生成注释。
5.2.3 启动mybatis generator
由于前面生成过了实体类、xxxMapper.java、xxxMapper.xml,因此 启动前要删除他们 。
删除完后可以启动那个main方法了。
有问题的伙伴可留言。
5.3 自定义注释的原理
mybatis generator官方提供了接口给我们。原本mybatis generator就是使用DefaultCommentGenerator
实现CommentGenerator
接口来实现生成注释的。 如下: 因此我们实现CommetGenerator
接口即可,可以将DefaultCommentGenerator
中的代码全部复制过来到自己定义的类中,然后再修改成自己想要的效果。
DefaultCommentGenerator
中每个方法都是通过进入if语句 判断suppressAllComments
是否为false
,为false
才能执行方法的内容,因此我们要在generatorConfig.xml 中配置suppressAllComments
的value 为false
。要想mybatis generator能调用到我们的自定义类,也需要在generatorConfig.xml 中配置commentGenerator
的type的值为自定义类的全类名,如下:
< commentGenerator type = " com.icbc.demo.config.MyCommentGenerator" >
< property name = " suppressAllComments" value = " false" />
commentGenerator>
六. 官方提供的完整generatorConfig.xml配置
可以收藏如下完整配置,以备以后需要用到,如下:
< generatorConfiguration>
< context id = " mysql" defaultModelType = " hierarchical" targetRuntime = " MyBatis3Simple" >
< property name = " autoDelimitKeywords" value = " false" />
< property name = " javaFileEncoding" value = " UTF-8" />
< property name = " javaFormatter" value = " org.mybatis.generator.api.dom.DefaultJavaFormatter" />
< property name = " xmlFormatter" value = " org.mybatis.generator.api.dom.DefaultXmlFormatter" />
< property name = " beginningDelimiter" value = " `" />
< property name = " endingDelimiter" value = " `" />
< jdbcConnection driverClass = " com.mysql.jdbc.Driver" connectionURL = " jdbc:mysql:///pss" userId = " root" password = " admin" >
jdbcConnection>
< javaTypeResolver type = " org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl" >
< property name = " forceBigDecimals" value = " false" />
javaTypeResolver>
< javaModelGenerator targetPackage = " com._520it.mybatis.domain" targetProject = " src/main/java" >
< property name = " constructorBased" value = " false" />
< property name = " enableSubPackages" value = " true" />
< property name = " immutable" value = " false" />
< property name = " rootClass" value = " com._520it.mybatis.domain.BaseDomain" />
< property name = " trimStrings" value = " true" />
javaModelGenerator>
< sqlMapGenerator targetPackage = " com._520it.mybatis.mapper" targetProject = " src/main/resources" >
< property name = " enableSubPackages" value = " true" />
sqlMapGenerator>
< javaClientGenerator targetPackage = " com._520it.mybatis.mapper" type = " ANNOTATEDMAPPER" targetProject = " src/main/java" >
< property name = " enableSubPackages" value = " true" />
javaClientGenerator>
< table tableName = " userinfo" >
< property name = " constructorBased" value = " false" />
< property name = " ignoreQualifiersAtRuntime" value = " false" />
< property name = " immutable" value = " false" />
< property name = " modelOnly" value = " false" />
< property name = " selectAllOrderByClause" value = " age desc,username asc" />
< property name = " useActualColumnNames" value = " false" />
< columnOverride column = " username" >
< property name = " property" value = " userName" />
columnOverride>
table>
context>
generatorConfiguration>
有问题的伙伴可留言。
你可能感兴趣的:(每日一写,MyBatis,mybatis)
从零实现OSS阿里云图片上传:前端采用的vue3+element-plus,后端采用javaspingboot,实现上传图片到云,然后存储数据库链接能够回显的效果
绝顶少年
阿里云 前端 数据库
后端(JavaSpringBoot)1.添加依赖在pom.xml中添加必要的依赖,包括阿里云OSSSDK、SpringBootWeb、MyBatis-Plus等:org.springframework.bootspring-boot-starter-webcom.baomidoumybatis-plus-boot-starter3.4.3.4com.aliyun.ossaliyun-sdk-oss
java版电子招投标采购|投标|评标|竞标|邀标|评审招投标系统源码
微服务技术分享
java 企业电子招投标系统源代码 企业招投标系统源码 招采系统源码
功能模块:待办消息,招标公告,中标公告,信息发布描述:全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外部供应商集中推送展示与其相关的所有采购业务信息(历史合作、考察整改,绩效评价等),支持供应商信息的自助维护,实时风险自动提服务框架:SpringCloud、SpringBoot2、Mybatis、OAuth2、Secur
用C++代码利用std::filesystem库写入一个文件路径到数据库中
新兴AI民工
C++编程实战大杂烩 c++ 数据库 filesystem 转移字符处理
使用C++代码写数据库不是什么麻烦事,但是和成熟的JAVA体系不一样,C++没有那么多成熟的数据库操作,比如mybatis等等。而且C++一般来说也不会用于写业务软件,不会用比较重的三方库。所以有时用C++代码来直接操作数据库,碰到的一个问题是:在一张数据库表中定义了一个字段:filePathvarchar2(100)需求是将一个形如:c:\test\test.log这样的文件名写入到该字段。本来
SpringBoot实战:整合Redis、mybatis,封装RedisUtils工具类等(附源码)
2401_84003839
程序员 spring boot redis mybatis
result=true;}catch(Exceptione){e.printStackTrace();}returnresult;}/***写入缓存设置时效时间*@paramkey*@paramvalue*@return*/publicbooleanset(finalStringkey,Objectvalue,LongexpireTime){booleanresult=false;try{Valu
Spring Boot项目中集成阿里云短信服务
山高自有客行路
# Springboot spring boot 阿里云 后端
1.导入阿里云依赖首先,在你的pom.xml文件中添加阿里云短信服务的Maven依赖:com.aliyundysmsapi201705252.0.24确保你已经包含了其他必要的依赖,如MySQL驱动和MyBatis:mysqlmysql-connector-javaruntimeorg.mybatis.spring.bootmybatis-spring-boot-starter2.2.0org.p
系统架构设计师—系统架构设计篇—轻量级架构
洛北辰南
系统架构设计师 系统架构 架构 轻量级架构 SSH SSM
文章目录基本概念轻量级架构持久层的优点SSHSSMHibernate与Mybatis的区别基本概念轻量级架构J2EE环境下,分层架构:表现层业务逻辑层持久层持久层的优点屏蔽数据库平台的变化对业务逻辑层的影响。通过持久层的封装处理,可以在持久层实现支持多种数据库平台,而对业务逻辑层提供统一的接口。代码可重用性高,能够完成所有的数据库访问操作。通过持久层,分离业务逻辑和数据逻辑,降低系统的耦合程度,结
【SpringBoot】实现登录功能
一只爱打拳的程序猿
Spring MyBatis HTML5+CSS spring boot mybatis javascript html5 css
在上一篇博客中,我们讲解了注册页面的实现。在此基础上会跳转到登录页面,今天给大家带来的是使用SpringBoot,MyBatis,Html,CSS,JavaScript,前后端交互实现一个登录功能。目录一、效果二、源码2.1前端2.2后端一、效果用户名和密码栏输入空或没有值时,提示错误。在数据库中有以下信息,任意挑选一条信息进行登录操作。输入用户lisi,123后登陆成功跳转到个人列表。二、源码2
Spring Boot
Bromide-0
# Spring框架 spring boot java
文章目录1.关于SpringBoot2.创建SpringBoot工程3.SpringBoot工程的结构4.在SpringBoot工程中使用Mybatis5.关于Profile配置6.关于YAML配置7.使用Druid数据库连接池8.编写持久层(数据访问层)代码9.关于业务逻辑层(Service层)10.使用Lombok框架11.Slf4j日志框架12.密码加密13.控制器层开发14.Validat
MyBatis 的核心配置文件是干什么的? 它的结构是怎样的? 哪些是必须配置的,哪些是可选的?
冰糖心书房
Mybatis 源码系列 mybatis
MyBatis的核心配置文件(通常命名为mybatis-config.xml)是MyBatis应用程序的入口点,它定义了MyBatis的全局配置信息。核心配置文件的作用:配置MyBatis的运行时行为:通过标签设置全局参数,控制MyBatis的各种行为,例如是否开启缓存、是否使用延迟加载、是否自动映射等。配置数据源和事务管理器:通过标签配置数据库连接信息和事务管理方式。注册类型别名:通过标签为Ja
mybatis plus
架构师成长进阶空间
Java java
//根据ID查询TselectById(Serializableid);//根据entity条件,查询一条记录TselectOne(@Param(Constants.WRAPPER)WrapperqueryWrapper);//查询(根据ID批量查询)ListselectBatchIds(@Param(Constants.COLLECTION)CollectionidList);//根据entit
mybatisPlus多数据源方案
平原人
springboot mybatis
背景在微服务李娜一般一个服务只有一个数据源,但是在有的老项目或者一些特定场景需要多数据源链接不同的数据库,本文以mybatisPlus为基础给出解决方案多数据源场景分类情形一:项目启动就确定了情形一:一些sass系统里面动态确定的,比如说运行时建立的数据源,还有一些报表场景也是如此本文暂不讨论相关解决方案(本人都有使用过):1.mybatisPlus官网提供的提供框架,使用是使用注解切换缺点很大,
Easyliev在线视频分享平台项目总结——SpringBoot、Mybatis、Redis、ElasticSearch、FFmpeg
周小闯
项目总结 spring boot mybatis redis
EasyLive项目总结登陆注册获取图片验证码captchat插件base编码(图片,用于前端展示)checkCodeKey验证码标识(用于匹配redis缓存,校验验证码)redis缓存保存验证码缓存用于登录注册校验(checkCodeKey为标识)注册校验验证码根据前端传递的checkCodeKey,在Redis缓存中查找验证码并进行比较注册昵称是否被使用邮箱是否被使用清除Redis中的验证码缓
企业级信息系统开发讲课笔记4.6 Spring Boot整合MyBatis
酒城译痴无心剑
企业级信息系统开发讲课笔记 mybatis 笔记 spring boot
文章目录零、学习目标一、SpringBoot数据访问概述二、SpringBoot整合MyBatis(一)基础环境搭建1、数据准备(1)创建博客数据库(2)创建文章表(3)文章表插入记录(4)创建评论表(5)评论表插入记录2、创建项目,引入相应启动器(1)创建SpringBoot项目(2)创建评论实体类(3)创建文章实体类3、编写配置文件(1)配置数据源(2)配置数据源类型(3)配置Druid数据源
spring boot3.4.3+MybatisPlus3.5.5+swagger-ui2.7.0
期待着2013
spring boot 后端 java
使用MyBatis-Plus操作books表。我们将实现以下功能:创建实体类Book。创建Mapper接口BookMapper。创建Service层BookService和BookServiceImpl。创建Controller层BookController。配置MyBatis-Plus和数据库连接。1.项目结构src├──main│├──java││└──com││└──example││├──
有关MyBatis的缓存(一级缓存和二级缓存)
爱学习的小王!
MyBatis mybatis 缓存 学习 笔记
1.MyBatis缓存缓存可以将数据保存在内存中,是互联网系统常常用到的。目前流行的缓存服务器有MongoDB、Redis、Ehcache等。缓存是在计算机内存上保存的数据,读取时无需再从磁盘读入,因此具备快速读取和使用的特点。和大多数持久化框架一样,MyBatis提供了一级缓存和二级缓存的支持。默认情况下,MyBatis只开启一级缓存。1.1一级缓存一级缓存是基于PerpetualCache(M
spring boot如何配置以及怎么实现自动装配
Java圣体
spring boot
目录配置第三方组件步骤1:添加依赖步骤2:配置数据源步骤3:配置MyBatis-Plus实现自动装配自动扫描机制指定扫描包(使用别的包下的配置类时,指定包名来进行自动装配)通过扫描spring.factories文件(SpringBoot2.7之前)文件格式后续使用方式1.自动配置类的定义2.自动配置类的加载3.条件化配置文件格式与内容工作原理使用示例1.创建自动配置类2.创建AutoConfig
自定义表单开发过程及思路笔记
Zyred
自定义表单 自定义表单 数据库 java
前言:由于公司项目中有一个自定义表单的需求,而本人却无类似开发经验,在朋友和同事的努力下,依然没有找到最佳的解决方案,后来自己根据自己对业务的了解和别人的思路借鉴,最终设计出了现在这款自定义表单的逻辑。项目环境:kingbaseV8(人大金仓数据库),Mybatis-Plusv3.4.2,spring-boot-2.2.5.RELEASE在本文中,主要阐述结合VUEJS动态表格的数据结构进行设计接
【Spring】_Spring事务与事务传播机制
_周游
Spring JavaEE 数据库 sql
目录1.创建项目、数据库及MyBatis配置1.1创建数据库及java实体类1.2使用yml配置MyBatis1.3对应三层架构开发2.Spring编程式事务2.1编写UserController类2.2接口测试2.23关于事务回滚与事务提交的日志3.Spring声明式事务3.1编写TransController类3.2接口测试3.3关于@Transactional实现事务回滚的情况3.3.1重新
由 Mybatis 源码畅谈软件设计(五):ResultMap 的循环引用
方圆想当图灵
由 Mybatis 源码畅谈软件设计 mybatis 代码规范
本节我们来了解Mybatis是如何处理ResultMap的循环引用,它的解决方案非常值得在软件设计中参考。另外作为引申,大家可以了解一下Spring是如何解决Bean的循环注入的。以单测org.apache.ibatis.submitted.permissions.PermissionsTest#checkNestedResultMapLoop为例,它对应表结构和表中的数据为:createtabl
MyBatis Plus 在 Java 项目中的高效使用
随风九天
匠心数据库 java spring java mybatis MyBatis Plus
1.前言1.1MyBatisPlus简介MyBatisPlus是一个MyBatis的增强工具,旨在简化开发人员在数据库操作上的工作量。它提供了丰富的功能,如自动化的CRUD操作、条件构造器、分页查询等,极大地提高了开发效率。1.2为什么选择MyBatisPlus简化代码:自动生成基础的CRUD方法,减少重复代码。提高效率:内置多种插件和工具,提升开发速度。易于维护:代码结构清晰,便于后续维护和扩展
Mysql、MyBatis一键删除重复数据实现方案
冰糖码奇朵
数据库 mysql mybatis sql
一.问题背景项目中有全表数据一键剔除重复的需求场景,也就是一张数据表中除了主键、创建时间、修改时间等基本字段,其他业务字段均参与剔重校验,任何两行数据中,参与剔重校验的所有字段值完全相同则为重复,重复数据仅保留一行,其余删除。二.实现思路将所有参与剔重校验的字段进行分组,保留分组数据中id最大的那一条,其余删除。三.实现代码此处展示MyBatis代码,转换为sql同理。update`${table
Easy-ES(用Mybatis-Plus语法来操作ElasticSearch)
充满希望的程序员
elasticsearch mybatis 大数据 搜索引擎
简介Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在RestHighLevelClient的基础上,只做增强不做改变,为简化开发、提高效率而生,如果有用过Mybatis-Plus(简称MP),那么基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些方面甚至比MP更简单,同时也融入了更多Es独
SpringBoot整合MyBatis-Plus全攻略:从零实现高效CRUD
rider189
java spring boot mybatis
一、MyBatis-Plus核心优势MyBatis-Plus作为MyBatis的增强工具包,在保留原生特性的基础上,提供了多项开箱即用的功能:自动生成基础CRUD操作内置代码生成器(3.5.3+版本支持最新模板引擎)强大的条件构造器Wrapper支持Lambda形式调用主键自动生成策略(支持雪花算法、UUID等)二、环境搭建与配置1.创建SpringBoot项目使用SpringInitializr
MyBatis-Plus 复杂查询与分页教程
嘵奇
提升自己 mybatis java
精心整理了最新的面试资料和简历模板,有需要的可以自行获取点击前往百度网盘获取点击前往夸克网盘获取MyBatis-Plus复杂查询与分页教程目录环境准备基础回顾复杂查询实现条件构造器QueryWrapper动态条件拼接多表关联查询(非Join方案)分页功能分页插件配置分页查询基本用法分页与复杂查询结合完整示例代码常见问题与注意事项1.环境准备确保项目中已引入MyBatis-Plus依赖(以Maven
计算机毕业设计JAVA人职匹配推荐系统mybatis+源码+调试部署+系统+数据库+lw
诺诺网络
java mybatis 开发语言
计算机毕业设计JAVA人职匹配推荐系统mybatis+源码+调试部署+系统+数据库+lw计算机毕业设计JAVA人职匹配推荐系统mybatis+源码+调试部署+系统+数据库+lw本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5
苍穹外卖(Springboot3实现) day01
十年不明
苍穹外卖学习 spring spring boot java
黑马给的起步代码基础工程版本是springboot2.x我的电脑用的是JDK21springboot3.x所以第一天整了很长时间需要慢慢修改配置环境目录依赖版本更换springboot版本更换mybatis版本更换lombok版本更换数据库依赖更新(很重要)swagger配置问题代码补全依赖版本更换springboot版本更换父工程sky-take-out的pom文件添加spring-boot-s
MyBatis-Plus 自定义 SQL 和复杂查询
rkmhr_sef
面试 学习路线 阿里巴巴 mybatis sql 数据库
MyBatis-Plus自定义SQL和复杂查询详解MyBatis-Plus是MyBatis的增强版,提供了许多开箱即用的CRUD操作。然而,在实际项目中,开发者常常需要编写自定义SQL以处理更复杂的查询需求。MyBatis-Plus提供了灵活的机制,允许开发者通过注解或XML自定义SQL,同时也能支持复杂查询、动态SQL等高级操作。1.自定义SQL的两种方式MyBatis-Plus支持两种自定义S
net.sf.jsqlparser.statement.select.Select.getSelectBody()
m0_74824002
面试 学习路线 阿里巴巴 java
1、问题原因发生这个问题就是因为Pagehelper中jsqlparser和Mybatis-puls中jsqlparser冲突,以我的项目来说,我项目中的Pagehelper中jsqlparser版本为4.2而Mybatis-puls中jsqlparser的版本为4.9,就导致版本兼容问题2、解决方法如果你想以Pagehelper中jsqlparser的版本来使用的话,那么项目将启动不起来,就比如
2025年毕设ssm网上超市论文+源码
SSM毕设程序源码JAVA
课程设计
本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景关于网上超市系统的研究,现有研究主要集中在电子商务平台的设计与开发、供应链管理、以及用户行为分析等领域。尽管这些研究已经取得了一定的成果,但专门针对基于SSM(Spring、SpringMVC、MyBatis)框架的网上超市系统的研究仍相对较少。随着电子商务的蓬勃发展,网上超市
Java初级入门学习
周杰伦fans
ai学习参考 JAVA 后端框架 java 学习 开发语言
JAVA学习@[TOC](JAVA学习)**一、Java初级入门学习路径****1.Java基础语法****2.面向对象编程(OOP)****3.数据库与JDBC****4.JavaWeb基础****二、主流框架推荐与学习建议****1.Spring框架****2.SpringMVC****3.MyBatis****4.SpringBoot****三、后续学习建议****1.实战项目****2.进
windows下源码安装golang
616050468
golang安装 golang环境 windows
系统: 64位win7, 开发环境:sublime text 2, go版本: 1.4.1
1. 安装前准备(gcc, gdb, git)
golang在64位系
redis批量删除带空格的key
bylijinnan
redis
redis批量删除的通常做法:
redis-cli keys "blacklist*" | xargs redis-cli del
上面的命令在key的前后没有空格时是可以的,但有空格就不行了:
$redis-cli keys "blacklist*"
1) "blacklist:12:
[email protected]
oracle正则表达式的用法
0624chenhong
oracle 正则表达式
方括号表达示
方括号表达式
描述
[[:alnum:]]
字母和数字混合的字符
[[:alpha:]]
字母字符
[[:cntrl:]]
控制字符
[[:digit:]]
数字字符
[[:graph:]]
图像字符
[[:lower:]]
小写字母字符
[[:print:]]
打印字符
[[:punct:]]
标点符号字符
[[:space:]]
2048源码(核心算法有,缺少几个anctionbar,以后补上)
不懂事的小屁孩
2048
2048游戏基本上有四部分组成,
1:主activity,包含游戏块的16个方格,上面统计分数的模块
2:底下的gridview,监听上下左右的滑动,进行事件处理,
3:每一个卡片,里面的内容很简单,只有一个text,记录显示的数字
4:Actionbar,是游戏用重新开始,设置等功能(这个在底下可以下载的代码里面还没有实现)
写代码的流程
1:设计游戏的布局,基本是两块,上面是分
jquery内部链式调用机理
换个号韩国红果果
JavaScript jquery
只需要在调用该对象合适(比如下列的setStyles)的方法后让该方法返回该对象(通过this 因为一旦一个函数称为一个对象方法的话那么在这个方法内部this(结合下面的setStyles)指向这个对象)
function create(type){
var element=document.createElement(type);
//this=element;
你订酒店时的每一次点击 背后都是NoSQL和云计算
蓝儿唯美
NoSQL
全球最大的在线旅游公司Expedia旗下的酒店预订公司,它运营着89个网站,跨越68个国家,三年前开始实验公有云,以求让客户在预订网站上查询假期酒店时得到更快的信息获取体验。
云端本身是用于驱动网站的部分小功能的,如搜索框的自动推荐功能,还能保证处理Hotels.com服务的季节性需求高峰整体储能。
Hotels.com的首席技术官Thierry Bedos上个月在伦敦参加“2015 Clou
java笔记1
a-john
java
1,面向对象程序设计(Object-oriented Propramming,OOP):java就是一种面向对象程序设计。
2,对象:我们将问题空间中的元素及其在解空间中的表示称为“对象”。简单来说,对象是某个类型的实例。比如狗是一个类型,哈士奇可以是狗的一个实例,也就是对象。
3,面向对象程序设计方式的特性:
3.1 万物皆为对象。
C语言 sizeof和strlen之间的那些事 C/C++软件开发求职面试题 必备考点(一)
aijuans
C/C++求职面试必备考点
找工作在即,以后决定每天至少写一个知识点,主要是记录,逼迫自己动手、总结加深印象。当然如果能有一言半语让他人收益,后学幸运之至也。如有错误,还希望大家帮忙指出来。感激不尽。
后学保证每个写出来的结果都是自己在电脑上亲自跑过的,咱人笨,以前学的也半吊子。很多时候只能靠运行出来的结果再反过来
程序员写代码时就不要管需求了吗?
asia007
程序员不能一味跟需求走
编程也有2年了,刚开始不懂的什么都跟需求走,需求是怎样就用代码实现就行,也不管这个需求是否合理,是否为较好的用户体验。当然刚开始编程都会这样,但是如果有了2年以上的工作经验的程序员只知道一味写代码,而不在写的过程中思考一下这个需求是否合理,那么,我想这个程序员就只能一辈写敲敲代码了。
我的技术不是很好,但是就不代
Activity的四种启动模式
百合不是茶
android 栈模式启动 Activity的标准模式启动 栈顶模式启动 单例模式启动
android界面的操作就是很多个activity之间的切换,启动模式决定启动的activity的生命周期 ;
启动模式xml中配置
<activity android:name=".MainActivity" android:launchMode="standard&quo
Spring中@Autowired标签与@Resource标签的区别
bijian1013
java spring @Resource @Autowired @Qualifier
Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource、 @PostConstruct及@PreDestroy。
1. @Autowired @Autowired是Spring 提供的,需导入 Package:org.springframewo
Changes Between SOAP 1.1 and SOAP 1.2
sunjing
Changes Enable SOAP 1.1 SOAP 1.2
JAX-WS
SOAP Version 1.2 Part 0: Primer (Second Edition)
SOAP Version 1.2 Part 1: Messaging Framework (Second Edition)
SOAP Version 1.2 Part 2: Adjuncts (Second Edition)
Which style of WSDL
【Hadoop二】Hadoop常用命令
bit1129
hadoop
以Hadoop运行Hadoop自带的wordcount为例,
hadoop脚本位于/home/hadoop/hadoop-2.5.2/bin/hadoop,需要说明的是,这些命令的使用必须在Hadoop已经运行的情况下才能执行
Hadoop HDFS相关命令
hadoop fs -ls
列出HDFS文件系统的第一级文件和第一级
java异常处理(初级)
白糖_
java DAO spring 虚拟机 Ajax
从学习到现在从事java开发一年多了,个人觉得对java只了解皮毛,很多东西都是用到再去慢慢学习,编程真的是一项艺术,要完成一段好的代码,需要懂得很多。
最近项目经理让我负责一个组件开发,框架都由自己搭建,最让我头疼的是异常处理,我看了一些网上的源码,发现他们对异常的处理不是很重视,研究了很久都没有找到很好的解决方案。后来有幸看到一个200W美元的项目部分源码,通过他们对异常处理的解决方案,我终
记录整理-工作问题
braveCS
工作
1)那位同学还是CSV文件默认Excel打开看不到全部结果。以为是没写进去。同学甲说文件应该不分大小。后来log一下原来是有写进去。只是Excel有行数限制。那位同学进步好快啊。
2)今天同学说写文件的时候提示jvm的内存溢出。我马上反应说那就改一下jvm的内存大小。同学说改用分批处理了。果然想问题还是有局限性。改jvm内存大小只能暂时地解决问题,以后要是写更大的文件还是得改内存。想问题要长远啊
org.apache.tools.zip实现文件的压缩和解压,支持中文
bylijinnan
apache
刚开始用java.util.Zip,发现不支持中文(网上有修改的方法,但比较麻烦)
后改用org.apache.tools.zip
org.apache.tools.zip的使用网上有更简单的例子
下面的程序根据实际需求,实现了压缩指定目录下指定文件的方法
import java.io.BufferedReader;
import java.io.BufferedWrit
读书笔记-4
chengxuyuancsdn
读书笔记
1、JSTL 核心标签库标签
2、避免SQL注入
3、字符串逆转方法
4、字符串比较compareTo
5、字符串替换replace
6、分拆字符串
1、JSTL 核心标签库标签共有13个,
学习资料:http://www.cnblogs.com/lihuiyy/archive/2012/02/24/2366806.html
功能上分为4类:
(1)表达式控制标签:out
[物理与电子]半导体教材的一个小问题
comsci
问题
各种模拟电子和数字电子教材中都有这个词汇-空穴
书中对这个词汇的解释是; 当电子脱离共价键的束缚成为自由电子之后,共价键中就留下一个空位,这个空位叫做空穴
我现在回过头翻大学时候的教材,觉得这个
Flashback Database --闪回数据库
daizj
oracle 闪回数据库
Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。
在Oracle 10g中, Flash back家族分为以下成员: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashbac
简单排序:插入排序
dieslrae
插入排序
public void insertSort(int[] array){
int temp;
for(int i=1;i<array.length;i++){
temp = array[i];
for(int k=i-1;k>=0;k--)
C语言学习六指针小示例、一维数组名含义,定义一个函数输出数组的内容
dcj3sjt126com
c
# include <stdio.h>
int main(void)
{
int * p; //等价于 int *p 也等价于 int* p;
int i = 5;
char ch = 'A';
//p = 5; //error
//p = &ch; //error
//p = ch; //error
p = &i; //
centos下php redis扩展的安装配置3种方法
dcj3sjt126com
redis
方法一
1.下载php redis扩展包 代码如下 复制代码
#wget http://redis.googlecode.com/files/redis-2.4.4.tar.gz
2 tar -zxvf 解压压缩包,cd /扩展包 (进入扩展包然后 运行phpize 一下是我环境中phpize的目录,/usr/local/php/bin/phpize (一定要
线程池(Executors)
shuizhaosi888
线程池
在java类库中,任务执行的主要抽象不是Thread,而是Executor,将任务的提交过程和执行过程解耦
public interface Executor {
void execute(Runnable command);
}
public class RunMain implements Executor{
@Override
pub
openstack 快速安装笔记
haoningabc
openstack
前提是要配置好yum源
版本icehouse,操作系统redhat6.5
最简化安装,不要cinder和swift
三个节点
172 control节点keystone glance horizon
173 compute节点nova
173 network节点neutron
control
/etc/sysctl.conf
net.ipv4.ip_forward =
从c面向对象的实现理解c++的对象(二)
jimmee
C++ 面向对象 虚函数
1. 类就可以看作一个struct,类的方法,可以理解为通过函数指针的方式实现的,类对象分配内存时,只分配成员变量的,函数指针并不需要分配额外的内存保存地址。
2. c++中类的构造函数,就是进行内存分配(malloc),调用构造函数
3. c++中类的析构函数,就时回收内存(free)
4. c++是基于栈和全局数据分配内存的,如果是一个方法内创建的对象,就直接在栈上分配内存了。
专门在
如何让那个一个div可以拖动
lingfeng520240
html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml
第10章 高级事件(中)
onestopweb
事件
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
计算两个经纬度之间的距离
roadrunners
计算 纬度 LBS 经度 距离
要解决这个问题的时候,到网上查了很多方案,最后计算出来的都与百度计算出来的有出入。下面这个公式计算出来的距离和百度计算出来的距离是一致的。
/**
*
* @param longitudeA
* 经度A点
* @param latitudeA
* 纬度A点
* @param longitudeB
*
最具争议的10个Java话题
tomcat_oracle
java
1、Java8已经到来。什么!? Java8 支持lambda。哇哦,RIP Scala! 随着Java8 的发布,出现很多关于新发布的Java8是否有潜力干掉Scala的争论,最终的结论是远远没有那么简单。Java8可能已经在Scala的lambda的包围中突围,但Java并非是函数式编程王位的真正觊觎者。
2、Java 9 即将到来
Oracle早在8月份就发布
zoj 3826 Hierarchical Notation(模拟)
阿尔萨斯
rar
题目链接:zoj 3826 Hierarchical Notation
题目大意:给定一些结构体,结构体有value值和key值,Q次询问,输出每个key值对应的value值。
解题思路:思路很简单,写个类词法的递归函数,每次将key值映射成一个hash值,用map映射每个key的value起始终止位置,预处理完了查询就很简单了。 这题是最后10分钟出的,因为没有考虑value为{}的情