MyBatis Generator中文文档
MyBatis Generator中文文档地址:
http://generator.sturgeon.mopaas.com/
该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。
本文使用Markdown进行编辑,但是博客显示效果不好,所以建议移步这里进行阅读 本文是作为个人筹划的《Mybatis最佳实践》(gitbook)其中的一节。 本文中所有节点的链接都是对应的中文文档地址,可以点击查看详细信息。下载本文档的PDF版本
注: 本文后面提到的**MBG**全部指代MyBatis Generator。
运行MyBatis Generator
有4种运行MBG的方法,具体请看文档 运行 MyBatis Generator
MBG下载地址 :http://repo1.maven.org/maven2/org/mybatis/generator/mybatis-generator-core/
后续会专门为gitbook完善此部分
XML配置详解
在MBG中,最主要也最重要的就是XML配置文件,因此本篇文章主要的内容就是XML配置。
这里按照配置的顺序对配置逐个讲解,更细的内容可以配合中文文档参照。
1. 配置文件头
使用最新版的MBG需要使用上面的xml头,配置文件必须包含上面的DOCTYPE
。
2. 根节点
generatorConfiguration
节点没有任何属性,直接写节点即可,如下:
3.
子元素
从这段开始,就是配置的主要内容,这些配置都是generatorConfiguration
元素的子元素。
包含以下子元素(有严格的顺序):
(0个或1个)
(0个或多个)
(1个或多个)
3.1
元素
这个元素用来指定外部的属性元素,不是必须的元素。
元素用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用 ${property}
这种形式的引用,通过这种方式引用属性文件中的属性值。 对于后面需要配置的**jdbc信息**和targetProject
属性会很有用。
这个属性可以通过resource
或者url
来指定属性文件的位置,这两个属性只能使用其中一个来指定,同时出现会报错。
3.2
元素
这个元素可以0或多个,不受限制。
这个元素的作用是将MBG运行时需要用到的jar包(或zip格式)添加到**classpath**下。
最常见的用法是,当**classpath**下面**没有**JDBC驱动的时候,我们通常通过这个属性指定驱动的路径,例如:
如果需要用到其他的jar包,也可以这么配置,例如如果你开发了一个MBG的插件,你就可以通过这种方式加入到**classpath**
这里注意上面重点强调的 没有 ,一般在项目中使用的时候,**classpath**下面都有JDBC驱动,因此从项目中启动的时候不需要配置该项。
建议: 由于该参数使用了绝对路径,因此不利用在不同电脑上通用,因此建议最好把需要的jar包放到项目的**classpath**下,避免每个人都得单独配置路径。
3.3
元素
在MBG的配置中,至少需要有一个
元素。
元素用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的
。
该元素只有一个**必选属性**id
,用来唯一确定一个
元素,该id
属性可以在运行MBG的使用。
此外还有几个**可选属性**:
defaultModelType
:**这个属性很重要**,这个属性定义了MBG如何生成**实体类**。 这个属性有以下可选值:
conditional
:*这是默认值*,这个模型和下面的hierarchical
类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。 因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
flat
:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。**这种模型最简单,推荐使用。**
hierarchical
:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。
targetRuntime
:此属性用于指定生成的代码的运行时环境。该属性支持以下可选值:
MyBatis3
:*这是默认值*
MyBatis3Simple
Ibatis2Java2
Ibatis2Java5
一般情况下使用默认值即可,有关这些值的具体作用以及区别请查看中文文档的详细内容。
introspectedColumnImpl
:该参数可以指定扩展org.mybatis.generator.api.IntrospectedColumn
该类的实现类。该属性的作用可以查看扩展MyBatis Generator。
一般情况下,我们使用如下的配置即可:
如果你希望不生成和Example
查询有关的内容,那么可以按照如下进行配置:
使用MyBatis3Simple
可以避免在后面的中逐个进行配置(后面会提到)。
MBG配置中的其他几个元素,基本上都是
的子元素,这些子元素(有严格的配置顺序)包括:
(0个或多个)
(0个或多个)
(0个或1个)
(1个)
(0个或1个)
(1个)
(0个或1个)
(0个或1个)
(1个或多个)
其中
属性 比较特殊,后面讲解的时候都会和父元素一起进行讲解。在讲解
属性前,我们先看看**什么是分隔符?**。
这里通过一个例子说明。假设在Mysql数据库中有一个表名为user info
,你没有看错,中间是一个空格,这种情况下如果写出select * from user info
这样的语句,肯定是要报错的,在Mysql中的时候我们一般会写成如下的样子:
select * from `user info`
这里的使用的**反单引号(`)**就是**分隔符**,**分隔符**可以用于**表名**或者**列名**。
下面继续看
支持的属性:
autoDelimitKeywords
beginningDelimiter
endingDelimiter
javaFileEncoding
javaFormatter
xmlFormatter
由于这些属性比较重要,这里一一讲解。
首先是autoDelimitKeywords
,当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段名添加**分隔符**。
然后这里继续上面的例子来讲beginningDelimiter
和endingDelimiter
属性。 由于beginningDelimiter
和endingDelimiter
的默认值为双引号("
),在Mysql中不能这么写,所以还要将这两个默认值改为**反单引号(`)**,配置如下:
属性javaFileEncoding
设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到。
最后两个javaFormatter
和xmlFormatter
属性**可能会**很有用,如果你想使用模板来定制生成的java文件和xml文件的样式,你可以通过指定这两个属性的值来实现。
接下来分节对其他的子元素逐个进行介绍。
3.3.1
元素
该元素可以配置0个或者多个,不受限制。
元素用来定义一个插件。插件用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码。
插件将按在配置中配置的顺序执行。
有关插件的详细信息可以参考开发插件和提供的插件了解更多。
3.3.2
元素
该元素最多可以配置1个。
这个元素非常有用,相信很多人都有过这样的需求,就是希望MBG生成的代码中可以包含**注释信息**,具体就是生成表或字段的备注信息。
使用这个元素就能很简单的实现我们想要的功能。这里先介绍该元素,介绍完后会举例如何扩展实现该功能。
该元素有一个可选属性type
,可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator
接口。而且必有一个默认的构造方法。这个属性接收默认的特殊值DEFAULT
,会使用默认的实现类org.mybatis.generator.internal.DefaultCommentGenerator
。
默认的实现类中提供了两个可选属性,需要通过
属性进行配置。
suppressAllComments
:**阻止**生成注释,默认为false
suppressDate
:**阻止**生成的注释包含时间戳,默认为false
一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用**版本控制**的时候每次都会提交,因而一般情况下我们都会屏蔽注释信息,可以如下配置:
接下来我们简单举例实现生成包含表字段注释信息的注释
因为系统提供了一个默认的实现类,所以对我们来说,自己实现一个会很容易,最简单的方法就是复制默认实现类代码到一个新的文件中,修改类名如MyCommentGenerator
,在你自己的实现类中,你可以选择是否继续支持上面的两个属性,你还可以增加对其他属性的支持。
我们通过下面一个方法的修改来了解,其他几个方法请自行修改(写本章的时候我也没有完全实现该类,所以不提供完整源码了):
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().equals("")) {
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
addJavadocTag(field, false);
field.addJavaDocLine(" */");
}
}
这个方法是给字段添加注释信息的,其中IntrospectedColumn
包含了字段的完整信息,通过getRemarks
方法可以获取字段的注释信息。上面这个方法修改起来还是很容易的。除了字段的注释外还有Getter
和Setter
,以及类的注释。此外还有生成XML的注释,大家可以根据默认的实现进行修改。
完成我们自己的实现类后,我们还需要做如下配置:
3.3.3
元素
用于指定数据库连接信息,该元素必选,并且只能有一个。
配置该元素只需要注意如果JDBC驱动不在**classpath**下,就需要通过
元素引入jar包,这里**推荐**将jar包放到**classpath**下。
该元素有两个必选属性:
driverClass
:访问数据库的JDBC驱动程序的完全限定类名
connectionURL
:访问数据库的JDBC连接URL
该元素还有两个可选属性:
userId
:访问数据库的用户ID
password
:访问数据库的密码
此外该元素还可以接受多个
子元素,这里配置的
属性都会添加到JDBC驱动的属性中。
这个元素配置起来最容易,这里举个简单例子:
3.3.4
元素
该元素最多可以配置一个。
这个元素的配置用来指定JDBC类型和Java类型如何转换。
该元素提供了一个可选的属性type
,和
比较类型,提供了默认的实现DEFAULT
,一般情况下使用默认即可,需要特殊处理的情况可以通过其他元素配置来解决,不建议修改该属性。
该属性还有一个可以配置的
元素。
可以配置的属性为forceBigDecimals
,该属性可以控制是否强制DECIMAL
和NUMERIC
类型的字段转换为Java类型的java.math.BigDecimal
,默认值为false
,一般不需要配置。
默认情况下的转换规则为:
如果精度>0
或者长度>18
,就会使用java.math.BigDecimal
如果精度=0
并且10<=长度<=18
,就会使用java.lang.Long
如果精度=0
并且5<=长度<=9
,就会使用java.lang.Integer
如果精度=0
并且长度<5
,就会使用java.lang.Short
如果设置为true
,那么一定会使用java.math.BigDecimal
,配置示例如下:
3.3.5
元素
该元素必须配置一个,并且最多一个。
该元素用来控制生成的实体类,根据
中配置的defaultModelType
,一个表可能会对应生成多个不同的实体类。一个表对应多个类实际上并不方便,所以前面也推荐使用flat
,这种情况下一个表对应一个实体类。
该元素只有两个属性,都是必选的。
targetPackage
:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(中会提到)。
targetProject
:指定目标项目路径,使用的是文件系统的绝对路径。
该元素支持以下几个
子元素属性:
constructorBased
:该属性只对MyBatis3
有效,如果true
就会使用构造方法入参,如果false
就会使用setter
方式。默认为false
。
enableSubPackages
:如果true
,MBG会根据catalog
和schema
来生成子包。如果false
就会直接用targetPackage
属性。默认为false
。
immutable
:该属性用来配置实体类属性是否可变,如果设置为true
,那么constructorBased
不管设置成什么,都会使用构造方法入参,并且不会生成setter
方法。如果为false
,实体类属性就可以改变。默认为false
。
rootClass
:设置所有实体类的基类。如果设置,需要使用类的全限定名称。并且如果MBG能够加载rootClass
,那么MBG不会覆盖和父类中完全匹配的属性。匹配规则:
属性名完全相同
属性类型相同
属性有getter
方法
属性有setter
方法
trimStrings
:是否对数据库查询结果进行trim
操作,如果设置为true
就会生成类似这样public void setUsername(String username) {this.username = username == null ? null : username.trim();}
的setter
方法。默认值为false
。
配置示例如下:
3.3.6
元素
该元素可选,最多配置一个。但是有如下两种必选的特殊情况:
如果targetRuntime
目标是**iBATIS2**,该元素必须配置一个。
如果targetRuntime
目标是**MyBatis3**,只有当
需要XML时,该元素必须配置一个。 如果没有配置
,则使用以下的规则:
如果指定了一个
,那么MBG将只生成XML的SQL映射文件和实体类。
如果没有指定
,那么MBG将只生成实体类。
该元素只有两个属性(和前面提过的
的属性含义一样),都是必选的。
targetPackage
:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(中会提到)。
targetProject
:指定目标项目路径,使用的是文件系统的绝对路径。
该元素支持
子元素,只有一个可以配置的属性:
enableSubPackages
:如果true
,MBG会根据catalog
和schema
来生成子包。如果false
就会直接用targetPackage
属性。默认为false
。
配置示例:
3.3.7
元素
该元素可选,最多配置一个。
如果不配置该元素,就不会生成Mapper接口。
该元素有3个必选属性:
type
:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator
类,必选有一个默认的构造方法。 该属性提供了以下预定的代码生成器,首先根据
的targetRuntime
分成三类:
MyBatis3 :
ANNOTATEDMAPPER :基于注解的Mapper接口,不会有对应的XML映射文件
MIXEDMAPPER :XML和注解的混合形式,(上面这种情况中的)SqlProvider
注解方法会被XML替代。
XMLMAPPER :所有的方法都在XML中,接口调用依赖XML文件。
MyBatis3Simple :
ANNOTATEDMAPPER :基于注解的Mapper接口,不会有对应的XML映射文件
XMLMAPPER :所有的方法都在XML中,接口调用依赖XML文件。
Ibatis2Java2 或**Ibatis2Java5**:
IBATIS :生成的对象符合iBATIS的DAO框架(不建议使用)。
GENERIC-CI :生成的对象将只依赖于SqlMapClient,通过构造方法注入。
GENERIC-SI :生成的对象将只依赖于SqlMapClient,通过setter
方法注入。
SPRING :生成的对象符合Spring的DAO接口
targetPackage
:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(中会提到)。
targetProject
:指定目标项目路径,使用的是文件系统的绝对路径。
该元素还有一个可选属性:
implementationPackage
:如果指定了该属性,实现类就会生成在这个包中。
该元素支持
子元素设置的属性:
enableSubPackages
exampleMethodVisibility
methodNameCalculator
rootInterface
useLegacyBuilder
这几个属性不太常用,具体作用请看完整的文档,这里对rootInterface
做个简单介绍。
rootInterface
用于指定一个所有生成的接口都继承的父接口。 这个值可以通过配置的rootInterface
属性覆盖。
这个属性对于通用Mapper来说,可以让生成的所有接口都继承该接口。
配置示例:
3.3.8 元素
该元素至少要配置一个,可以配置多个。
该元素用来配置要通过内省的表。只有配置的才会生成实体类和其他文件。
该元素有一个必选属性:
tableName
:指定要生成的表名,可以使用SQL通配符匹配多个表。
例如要生成全部的表,可以按如下配置:
该元素包含多个可选属性:
schema
:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如schema.tableName
的形式。
catalog
:数据库的catalog,如果设置了该值,生成SQL的表名会变成如catalog.tableName
的形式。
alias
:如果指定,这个值会用在生成的select查询SQL的表的别名和列名上。 列名会被别名为 alias_actualColumnName(别名_实际列名) 这种模式。
domainObjectName
:生成对象的基本名称。如果没有指定,MBG会自动根据表名来生成名称。
enableXXX
:XXX代表多种SQL方法,该属性用来指定是否生成对应的XXX语句。
selectByPrimaryKeyQueryId
:DBA跟踪工具会用到,具体请看详细文档。
selectByExampleQueryId
:DBA跟踪工具会用到,具体请看详细文档。
modelType
:和
的defaultModelType
含义一样,这里可以针对表进行配置,这里的配置会覆盖
的defaultModelType
配置。
escapeWildcards
:这个属性表示当查询列,是否对schema和表名中的SQL通配符 ('_' and '%') 进行转义。 对于某些驱动当schema或表名中包含SQL通配符时(例如,一个表名是MY_TABLE,有一些驱动需要将下划线进行转义)是必须的。默认值是false
。
delimitIdentifiers
:是否给标识符增加**分隔符**。默认false
。当catalog
,schema
或tableName
中包含空白时,默认为true
。
delimitAllColumns
:是否对所有列添加**分隔符**。默认false
。
该元素包含多个可用的
子元素,可选属性为:
constructorBased
:和
中的属性含义一样。
ignoreQualifiersAtRuntime
:生成的SQL中的表名将不会包含schema
和catalog
前缀。
immutable
:和
中的属性含义一样。
modelOnly
:此属性用于配置是否为表只生成实体类。如果设置为true
就不会有Mapper接口。如果配置了
,并且modelOnly
为true
,那么XML映射文件中只有实体对象的映射元素(
)。如果为true
还会覆盖属性中的enableXXX
方法,将不会生成任何CRUD方法。
rootClass
:和
中的属性含义一样。
rootInterface
:和
中的属性含义一样。
runtimeCatalog
:运行时的catalog
,当生成表和运行环境的表的catalog
不一样的时候可以使用该属性进行配置。
runtimeSchema
:运行时的schema
,当生成表和运行环境的表的schema
不一样的时候可以使用该属性进行配置。
runtimeTableName
:运行时的tableName
,当生成表和运行环境的表的tableName
不一样的时候可以使用该属性进行配置。
selectAllOrderByClause
:该属性值会追加到selectAll
方法后的SQL中,会直接跟order by
拼接后添加到SQL末尾。
useActualColumnNames
:如果设置为true,那么MBG会使用从数据库元数据获取的列名作为生成的实体对象的属性。 如果为false(默认值),MGB将会尝试将返回的名称转换为驼峰形式。 在这两种情况下,可以通过 元素显示指定,在这种情况下将会忽略这个(useActualColumnNames)属性。
useColumnIndexes
:如果是true,MBG生成resultMaps的时候会使用列的索引,而不是结果中列名的顺序。
useCompoundPropertyNames
:如果是true,那么MBG生成属性名的时候会将列名和列备注接起来. 这对于那些通过第四代语言自动生成列(例如:FLD22237),但是备注包含有用信息(例如:"customer id")的数据库来说很有用. 在这种情况下,MBG会生成属性名FLD2237_CustomerId。
除了
子元素外,还包含以下子元素:
(0个或1个)
(0个或1个)
(0个或多个)
(0个或多个)
下面对这4个元素进行详细讲解。
1.
元素
这个元素最多可以配置一个。 这个元素用来指定自动生成主键的属性(identity字段或者sequences序列)。如果指定这个元素,MBG在生成insert的SQL映射文件中插入一个
元素。 这个元素**非常重要**,这个元素包含下面两个必选属性:
column
:生成列的列名。
sqlStatement
:将返回新值的 SQL 语句。如果这是一个identity列,您可以使用其中一个预定义的的特殊值。预定义值如下:
Cloudscape
DB2
DB2_MF
Derby
HSQLDB
Informix
MySql
SqlServer
SYBASE
JDBC :这会配置MBG使用MyBatis3支持的JDBC标准的生成key来生成代码。 这是一个独立于数据库获取标识列中的值的方法。 重要 : 只有当目标运行为MyBatis3时才会产生正确的代码。 如果与iBATIS2一起使用目标运行时会产生运行时错误的代码。
这个元素还包含两个可选属性:
identity
:当设置为true
时,该列会被标记为identity
列, 并且
元素会被插入在insert
后面。 当设置为false
时,
会插入到insert
之前(通常是序列)。**重要**: 即使您type
属性指定为post
,您仍然需要为identity
列将该参数设置为true
。 这将标志MBG从插入列表中删除该列。默认值是false
。
type
:type=post and identity=true
的时候生成的
中的order=AFTER
,当type=pre
的时候,identity只能为false
,生成的
中的order=BEFORE
。可以这么理解,自动增长的列只有插入到数据库后才能得到ID,所以是AFTER
,使用序列时,只有先获取序列之后,才能插入数据库,所以是BEFORE
。
配置示例一:
对应的生成的结果:
SELECT LAST_INSERT_ID()
insert into `user login info` (Id, username, logindate, loginip)
values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{logindate,jdbcType=TIMESTAMP}, #{loginip,jdbcType=VARCHAR})
配置示例二:
对应的生成结果:
select SEQ_ID.nextval from dual
insert into `user login info` (Id, username, logindate, loginip)
values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{logindate,jdbcType=TIMESTAMP},#{loginip,jdbcType=VARCHAR})
2.
元素
该元素最多可以配置一个,使用该元素可以在生成列之前,对列进行重命名。这对那些存在同一前缀的字段想在生成属性名时去除前缀的表非常有用。 例如假设一个表包含以下的列:
CUST_BUSINESS_NAME
CUST_STREET_ADDRESS
CUST_CITY
CUST_STATE
生成的所有属性名中如果都包含CUST
的前缀可能会让人不爽。这些前缀可以通过如下方式定义重命名规则:
注意,在内部,MBG使用java.util.regex.Matcher.replaceAll
方法实现这个功能。 请参阅有关该方法的文档和在Java中使用正则表达式的例子。
当
匹配一列时,这个元素(
)会被忽略。
优先于重命名的规则。
该元素有一个必选属性:
searchString
:定义将被替换的字符串的正则表达式。
该元素有一个可选属性:
replaceString
:这是一个用来替换搜索字符串列每一个匹配项的字符串。如果没有指定,就会使用空字符串。
关于的
属性useActualColumnNames
对此的影响可以查看完整文档。
3.
元素
该元素可选,可以配置多个。
该元素从将某些属性默认计算的值更改为指定的值。
该元素有一个必选属性:
该元素有多个可选属性:
property
:要使用的Java属性的名称。如果没有指定,MBG会根据列名生成。 例如,如果一个表的一列名为STRT_DTE
,MBG会根据的useActualColumnNames
属性生成STRT_DTE
或strtDte
。
javaType
:该列属性值为完全限定的Java类型。如果需要,这可以覆盖由JavaTypeResolver
计算出的类型。 对某些数据库来说,这是必要的用来处理**“奇怪的”**数据库类型(例如MySql的unsigned bigint
类型需要映射为java.lang.Object
)。
jdbcType
:该列的JDBC类型(INTEGER, DECIMAL, NUMERIC, VARCHAR
等等)。 如果需要,这可以覆盖由JavaTypeResolver
计算出的类型。 对某些数据库来说,这是必要的用来处理怪异的JDBC驱动 (例如DB2的LONGVARCHAR
类型需要为iBATIS 映射为VARCHAR
)。
typeHandler
:用户定义的需要用来处理这列的类型处理器。它必须是一个继承iBATIS的TypeHandler
类或TypeHandlerCallback
接口(该接口很容易继承)的全限定的类名。如果没有指定或者是空白,iBATIS会用默认的类型处理器来处理类型。**重要**:MBG不会校验这个类型处理器是否存在或者可用。 MGB只是简单的将这个值插入到生成的SQL映射的配置文件中。
delimitedColumnName
:指定是否应在生成的SQL的列名称上增加**分隔符**。 如果列的名称中包含空格,MGB会自动添加**分隔符**, 所以这个重写只有当列名需要强制为一个合适的名字或者列名是数据库中的保留字时是必要的。
配置示例:
4.
元素
该元素可选,可以配置多个。
该元素可以用来屏蔽不需要生成的列。
该元素有一个必选属性:
该元素还有一个可选属性:
delimitedColumnName
:匹配列名的时候是否区分大小写。如果为true
则区分。默认值为false
,不区分大小写。
MyBatis Generator最佳实践
本节内容针对MyBatis3,使用iBATIS的不一定适用。
以下根据个人经验(对此有意见的可以留言)对一些配置看法列出如下几点:
关于Example
方法,Example
方法虽然很强大,但是SQL不易管理,因此不建议使用。
取消Example
方法的配置,通过上的enablexxExample
方法可以屏蔽,但是最好的方法是在
上设置targetRuntime="MyBatis3Simple"
。
关于实体类的modelType
,建议使用defaultModelType="flat"
,只有一个对象的情况下管理毕竟方便,使用也简单。
关于注释
,不管你是否要重写自己的注释生成器,有一点不能忘记,那就是注释中一定要保留@mbggenerated
,MBG通过该字符串来判断代码是否为代码生成器生成的代码,有该标记的的代码在重新生成的时候会被删除,不会重复。不会在XML中出现重复元素。
使用MBG生成的代码时,建议尽可能不要去修改自动生成的代码,而且要生成带有@mbggenerated
,这样才不会在每次重新生成代码的时候需要手动修改好多内容。
仍然是注释相关,在
中,建议一定要保留suppressAllComments
属性(使用默认值false
),一定要取消(设为true
)时间戳suppressDate
,避免重复提交SVN。
建议将JDBC驱动放到项目的**classpath**下,而不是使用
来引入jar包,主要考虑到所有开发人员的统一性。
当数据库字段使用CHAR
时,建议在
中设置
,可以自动去掉不必要的空格。
在
中,建议设置type="XMLMAPPER"
,不建议使用注解或混合模式,比较代码和SQL完全分离易于维护。
建议尽可能在中配置
,避免手工操作,以便于MBG重复执行代码生成。
如果有其他有价值的经验,会继续补充。
综合以上信息,这里给出一个Mysql
的简单配置:
id= "MysqlContext" targetRuntime= "MyBatis3Simple" defaultModelType= "flat" >
name= "beginningDelimiter" value= "`" />
name= "endingDelimiter" value= "`" />
name= "suppressDate" value= "true" />
driverClass= "com.mysql.jdbc.Driver"
connectionURL= "jdbc:mysql://localhost:3306/test"
userId= "root"
password= "" >
targetPackage= "test.model" targetProject= "G:\MyProject\src\main\java" >
name= "trimStrings" value= "true" />
targetPackage= "test.xml" targetProject= "G:\MyProject\src\main\resources" />
type= "XMLMAPPER" targetPackage= "test.dao" targetProject= "G:\MyProject\src\main\java" />
tableName= "%" >
column= "id" sqlStatement= "Mysql" />
这里用的通配符匹配全部的表,另外所有表都有自动增长的id
字段。如果不是所有表的配置都一样,可以做针对性的配置
你可能感兴趣的:(mybatis tools 配置详解)
linux sdl windows.h,Windows下的SDL安装
奔跑吧linux内核
linux sdl windows.h
首先你要下载并安装SDL开发包。如果装在C盘下,路径为C:\SDL1.2.5如果在WINDOWS下。你可以按以下步骤:1.打开VC++,点击"Tools",Options2,点击directories选项3.选择"Includefiles"增加一个新的路径。"C:\SDL1.2.5\include"4,现在选择"Libaryfiles“增加"C:\SDL1.2.5\lib"现在你可以开始编写你的第
insert into select 主键自增_mybatis拦截器实现主键自动生成
weixin_39521651
insert into select 主键自增 mybatis delete返回值 mybatis insert返回主键 mybatis insert返回对象 mybatis plus insert返回主键 mybatis plus 插入生成id
前言前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键。于是我就问他,那你们数据库表设置主键自动递增不就得了。他的回答是他们项目目前的id都是采用雪花算法来生成,因此为了项目稳定性,不会切换id的生成方式。朋友问我有没有什么实现思路,他们公司的orm框架是mybatis,我就建议他说,不然让你老大把mybatis切换成mybatis-plus。mybat
CentOS 7官方源停服,配置本机光盘yum源
码哝小鱼
linux运维 centos linux 运维
1、挂载系统光盘mkdir/mnt/isomount-oloop/tools/CentOS-7-x86_64-DVD-1810.iso/mnt/isocd/mnt/iso/Packages/rpm-ivh/mnt/iso/Packages/yum-utils-1.1.31-50.el7.noarch.rpm(图形界面安装,默契已安装)如安装yum-utils依赖错误,按提示安装依赖包rpm-ivh
yolov5>onnx>ncnn>apk
图像处理大大大大大牛啊
opencv实战代码讲解 yolo onnx ncnn 安卓
一.yolov5pt模型转onnx条件:colabnotebookyolov51.安装环境!pipinstallonnx>=1.7.0#forONNXexport!pipinstallcoremltools==4.0#forCoreMLexport!pipinstallonnx-simplifier2.修改common.py在classFocus下面
MyBatis 详解
阿贾克斯的黎明
java mybatis
目录目录一、MyBatis是什么二、为什么使用MyBatis(一)灵活性高(二)性能优化(三)易于维护三、怎么用MyBatis(一)添加依赖(二)配置MyBatis(三)创建实体类和接口(四)使用MyBatis一、MyBatis是什么MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。它可以通过简
sublime个人设置
bawangtianzun
sublime text 编辑器
如何拥有jiangly蒋老师同款编译器(sublimec++配置竞赛向)_哔哩哔哩_bilibiliSublimeText4的安装教程(新手竞赛向)-知乎(zhihu.com)创建文件自动保存为c++打开SublimeText软件。转到"Tools"(工具)>"Developer"(开发者)>"NewPlugin"(新建插件)。在打开的新文件中,粘贴以下代码:importsublimeimport
解决SDK Manager 中 没有 Support Library
木鱼wzh
1、直接修改SDK-MANAGER打开sdk-manager—->Tools—->options然后点击packages—->showobsoletepackages即可在最下面的Extras目录下找到推荐两个自己使用的镜像服务器:mirrors.neusoft.edu.cn端口80mirrors.dormforce.net端口802、去官网下载SupportLibrar点击这里进入官网进入百度云
Ubuntu Juju 与 Ansible的区别
xidianjiapei001
# Kubernetes ubuntu ansible linux 云原生 Juju
JujuandAnsiblearebothpowerfultoolsusedformanagingandorchestratingITinfrastructureandapplications,buttheyhavedifferentapproachesandusecases.Here’sabreakdownofthekeydifferencesbetweenthem:1.ConceptualFo
mybatis 二级缓存失效_Mybatis 缓存原理及失效情况解析
weixin_39844942
mybatis 二级缓存失效
这篇文章主要介绍了Mybatis缓存原理及失效情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1、什么是缓存[Cache]存在内存中的临时数据。将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。2、为什么要使用缓存减少和数据库的交互次
Kubernetes 自定义控制器开发
IT回忆录
Kubenetes kubernetes
目录前言一、CRD二、创建数据库表(Mysql)二、控制器开发1.使用kubernetes的examplecontroller模板2.在controller.go中新增数据表监听方法3.修改tools工具生成资源对象结构体定义这里记录开发k8s控制器的一般方式,controller开发主要使用k8s提供的client-go库进行。前言Controller监听集群内部资源对象的变化,编辑资源对象(增
详解mybatis的一二级缓存以及缓存失效原因
仰望天花板
缓存 数据库 mybatis java mysql
数据库的大部分场景下是从磁盘读取,如果数据从内存进行读取,速度较比磁盘要快得多。但因为内存的容量有限,所以一般只会把使用和查询较多的数据缓存起来,以便快速反应,其他使用率不太多的继续存放在磁盘。mybatis分为一级缓存和二级缓存1.一级缓存一级缓存存放在SqlSqeeion上,默认开启1.1pojo@DatapublicclassRole{privateLongid;privateStringr
36. MyBatis如何支持多数据库操作?如何配置不同的数据源?
这孩子叫逆
Mybatis笔记 mybatis 数据库
在许多企业级应用中,可能需要访问多个数据库。MyBatis可以通过配置多个数据源和动态切换数据源来支持多数据库操作。下面介绍如何在MyBatis中配置和使用多个数据源。1.多数据源的基本配置1.1配置多个数据源要支持多个数据源,首先需要在Spring或SpringBoot中配置不同的数据源。假设我们要连接两个数据库db1和db2,可以通过以下步骤进行配置。SpringBoot示例:applicat
安装 `privoxy` 将 Socks5 转换为 HTTP 代理
MonkeyKing.sun
网络
(base)shgbitai@shgbitai-C9X299-PGF:~/tools$curl-xhttp://127.0.0.1:1080https://registry-1.docker.io/v2/curl:(56)ProxyCONNECTaborted(base)shgbitai@shgbitai-C9X299-PGF:~/tools$curl-xhttps://127.0.0.1:108
MyBatis批量插入大量数据
小黑屋说YYDS
MyBatis java
1.思路分析批量插入这个问题,我们用JDBC操作,其实就是两种思路吧:用一个for循环,把数据一条一条的插入(这种需要开启批处理)。生成一条插入sql,类似这种insertintouser(username,address)values(‘aa’,‘bb’),(‘cc’,‘dd’)…。到底哪种快呢?我们从两方面来考虑这个问题:插入SQL本身执行的效率。网络I/O。先说第一种方案,就是用for循环循
MyBatis 查询数据库_mybatis查询某个库的所有表名(2)
2401_84181942
程序员 mybatis oracle tomcat
标签说明:***``标签**:需要指定namespace属性,表示命名空间,值为mapper接口的全限定名,包括全包名.类名。***``查询标签**:是用来执行数据库的查询操作的:`id`:是和Interface(接口)中定义的方法名称一样的,表示对接口的具体实现方法。`resultType`:是返回的数据类型,也就是开头我们定义的实体类。####2.4.4添加Service服务层实现代码如下:@
5-【JavaWeb】JUnit 单元测试及JUL 日志系统
weixin_44329069
JavaWeb junit 单元测试
1.使用JUnit进行单元测试JUnit是Java中非常流行的单元测试框架,MyBatis与JUnit可以很好地结合,来测试持久层代码的正确性。1.1添加JUnit依赖在使用JUnit之前,需要在pom.xml中引入JUnit依赖。junitjunit4.13.2test1.2单元测试基本结构假设我们要测试UserMapper中的getUserById方法,测试代码如下:importorg.apa
【免费】springboot项目申报管理系统|毕业设计|Javaweb项目
计算机学姐来啦
springboot ssm java spring boot 课程设计 后端 毕设 毕业设计 java-ee
收藏点赞不迷路关注作者有好处编号:springboot375springboot项目申报管理系统开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis工具:IDEA/Ecilpse、Navicat、Maven1.万字文档展示(部分)2.系统图片展示第5章系统详细设计5.1管理员功能模块的实现5.1.1项目列表如图5.1显示的就是项目列表页面,此页面提供给管理员的
MyBatis系统学习(一)——项目结构及其含义
OEC小胖胖
MyBatis mybatis 学习 web 后端
1.MyBatis简介MyBatis是一款优秀的持久层框架,它通过SQL映射的方式实现Java对数据库操作的映射,既保留了SQL语句的灵活性,也简化了代码的编写。在一个MyBatis项目中,核心部分主要有:配置文件(mybatis-config.xml)映射文件(Mapper.xml)实体类(Entity/POJO)接口类(Mapper接口)MyBatis会话工厂(SqlSessionFactor
Quartus sdc UI界面设置(二)
落雨无风
IC设计 fpga fpga开发
Quartussdc设置根据一配置quartus综合简单流程(一)上次文章中,说了自己写sdc需要配置的分类点,这次将说明在UI界面配置sdc。1.在Quartus软件中,导入verilog设计之后,打开Tools/TimeQuestTimingAnalyzer界面大致分为上下两部分,上半部分左侧显示Report、Tasks,右侧显示欢迎界面;下半部分显示Console和History,此处缺图,
麻雀虽小,五脏俱全 - Java工具类库 - Hutool
waiter_chen
Hutool官网:https://www.hutool.cn官方参考文档:https://www.hutool.cn/docsAsetoftoolsthatkeepJavasweet.——Htool特点通过静态方法封装,类函数式语言般,降低学习成本,提高工作效率整合多方用户需求,减少代码搜索成本,避免网络上参差不齐的代码出现导致的bugutil包提供多方公用类和公用工具方法,节省开发封装时间,减少
OmicsTools除b站教学视频外已整理的零代码生信全流程分析文档
邢博士谈科教
医学科研 生信分析 r语言 数据可视化 数据挖掘 数据分析 生信 医学 生信分析
OmicsTools软件介绍和下载安装配置软件简介我开发了一款本地电脑无限使用的零代码生信数据分析作软图神器电脑软件OmicsTools,欢迎大家使用OmicsTools进行生物医学科研数据分析和作图,该软件件能让大家在不需要任何编程和代码编写的基础上,分析次数没有限制,可以无限使用,让您在自己电脑上快速进行大量的生信分析和加速大家的科研。OmicsTools生信分析电脑软件可以做医学生物生信各个
MyBatis 如何将 Mapper 接口与其 XML 映射文件关联:深入原理与实现
OEC小胖胖
web后端 mybatis xml java web 后端
MyBatis如何将Mapper接口与其XML映射文件关联:深入原理与实现1.概述MyBatis是一个简单、灵活的持久层框架,它通过SQL语句将Java对象与数据库进行映射。MyBatis支持基于XML和注解的配置方式。在实际开发中,XML映射文件与Mapper接口的关联是MyBatis的核心功能之一。通过这种关联,开发者可以在Mapper接口中定义方法,并在XML文件中编写SQL语句,从而实现数
Mybatis实现员工管理系统
wu1113_
mybatis java maven
文章目录1.案例需求2.编程思路3.案例源码4.小结1.案例需求在上次做的父子模块的maven以及Ajax实现人工管理系统的基础上使用Mybatis实现员工管理系统的增删改查,具体运行效果如下:2.编程思路Mybatis框架的一般执行流程:创建MyBatis配置文件mybatis-config.xml在里面加载数据源、事务等,管理映射文件创建需要的映射文件mapper.xml,用于映射表中列和实体
springboot+mybatisplus实现基本的增删改查以及分页查询。这里使用的是Restful风格包括简单描述Restful是什么
okchan666
spring boot java
先实现springboot+mybatisplus的增删改查接口使用postman测试:第一步创建项目导入依赖:直接给大家了:4.0.0org.springframework.bootspring-boot-starter-parent2.6.6com.okchanspringboot_07_ssmp0.0.1-SNAPSHOT1.8org.springframework.bootspring-b
SpringBoot2:web开发常用功能实现及原理解析-整合EasyExcel实现Excel导入导出功能
生产队队长
Spring All excel spring boot
1、工程包结构主要是这5个Java类2、导入EasyExcel包这里同时贴出其他相关springboot的基础包org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-devtoolsruntimetrueorg.springframework.bootspring-boot-config
MyBatis 方法重载的陷阱及解决方案
molashaonian
mybatis 方法重载 异常 方法名相同
在使用MyBatis进行开发时,尤其是使用注解模式(如@Select、@Insert等)时,开发者常常会遇到这样一个问题:为什么我的方法重载不能正常工作?即使在Java中允许方法名相同但参数不同的重载,MyBatis在处理注解的SQL方法时却并不支持这种方式。这篇文章将深入探讨MyBatis的这个特性及如何规避相关的坑。问题背景在标准的Java开发中,方法重载是一种常见的设计模式。方法重载允许我们
python做窗口软件界面绑定py程序_PyCharm GUI界面开发和exe文件生成的实现
weixin_39948442
一、安装Python二、安装PyQt5推荐使用pip安装:win+R调出cmd命令窗口pipinstallPyQt5等待片刻,继续安装PyQt5-toolspipinstallPyQt5-tools如果直接pip不成功的话,建议在python库这个网站上搜索相关库,下载相应的.whl文件,然后用以下方法进行安装:①pipwhl文件所在路径whl文件名②在cmd命令窗口先执行cdwhl文件所在路径到
python打包whl文件
梦中学逆向
python python
简介当我们自己开发完一个项目时,如果想在别的电脑上使用,将所有文件复制比较麻烦,这时将所有项目打包成一个whl文件,再到别的电脑安装就很简单了准备一个新的虚拟环境:避免版本冲突安装wheel,后面打包要用pipinstallwheel将所有项目放在同一个文件夹下,新建一个setup.py文件importosimportreimportsysfromsetuptoolsimportsetupimpo
Spring Cloud+Spring Boot+Mybatis+Java版电子招标采购系统源码 及 功能清单
Xiaohong0716
mybatis java spring cloud
一、立项管理1、招标立项申请功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。2、非招标立项申请功能点:非招标立项申请入口、用户可以保存为草稿、提交。3、采购立项列表功能点:对草稿进行编辑,驳回的立项编辑,在途流程查看。二、项目管理1、采购计划管理功能点:采购计划新增、编辑、删除2、采购过程管理功能点:查询、维护基准价、组建评审小组、项目答疑澄清、文件费保证金审核、供应商报价维护、查看评审
python工程打包成whl文件
机灵巢穴_WitNest
python python 开发语言
资料:PackagingPythonProjects—PythonPackagingUserGuide6.Modules—Python3.11.4documentation步骤1.安装打包工具python3-mpipinstallsetuptoolswheeltwine2.更新pip工具python3-mpipinstall--upgradepip3.创建工程结构python_test_packa
强大的销售团队背后 竟然是大数据分析的身影
蓝儿唯美
数据分析
Mark Roberge是HubSpot的首席财务官,在招聘销售职位时使用了大量数据分析。但是科技并没有挤走直觉。
大家都知道数理学家实际上已经渗透到了各行各业。这些热衷数据的人们通过处理数据理解商业流程的各个方面,以重组弱点,增强优势。
Mark Roberge是美国HubSpot公司的首席财务官,HubSpot公司在构架集客营销现象方面出过一份力——因此他也是一位数理学家。他使用数据分析
Haproxy+Keepalived高可用双机单活
bylijinnan
负载均衡 keepalived haproxy 高可用
我们的应用MyApp不支持集群,但要求双机单活(两台机器:master和slave):
1.正常情况下,只有master启动MyApp并提供服务
2.当master发生故障时,slave自动启动本机的MyApp,同时虚拟IP漂移至slave,保持对外提供服务的IP和端口不变
F5据说也能满足上面的需求,但F5的通常用法都是双机双活,单活的话还没研究过
服务器资源
10.7
eclipse编辑器中文乱码问题解决
0624chenhong
eclipse乱码
使用Eclipse编辑文件经常出现中文乱码或者文件中有中文不能保存的问题,Eclipse提供了灵活的设置文件编码格式的选项,我们可以通过设置编码 格式解决乱码问题。在Eclipse可以从几个层面设置编码格式:Workspace、Project、Content Type、File
本文以Eclipse 3.3(英文)为例加以说明:
1. 设置Workspace的编码格式:
Windows-&g
基础篇--resources资源
不懂事的小屁孩
android
最近一直在做java开发,偶尔敲点android代码,突然发现有些基础给忘记了,今天用半天时间温顾一下resources的资源。
String.xml 字符串资源 涉及国际化问题
http://www.2cto.com/kf/201302/190394.html
string-array
接上篇补上window平台自动上传证书文件的批处理问卷
酷的飞上天空
window
@echo off
: host=服务器证书域名或ip,需要和部署时服务器的域名或ip一致 ou=公司名称, o=公司名称
set host=localhost
set ou=localhost
set o=localhost
set password=123456
set validity=3650
set salias=s
企业物联网大潮涌动:如何做好准备?
蓝儿唯美
企业
物联网的可能性也许是无限的。要找出架构师可以做好准备的领域然后利用日益连接的世界。
尽管物联网(IoT)还很新,企业架构师现在也应该为一个连接更加紧密的未来做好计划,而不是跟上闸门被打开后的集成挑战。“问题不在于物联网正在进入哪些领域,而是哪些地方物联网没有在企业推进,” Gartner研究总监Mike Walker说。
Gartner预测到2020年物联网设备安装量将达260亿,这些设备在全
spring学习——数据库(mybatis持久化框架配置)
a-john
mybatis
Spring提供了一组数据访问框架,集成了多种数据访问技术。无论是JDBC,iBATIS(mybatis)还是Hibernate,Spring都能够帮助消除持久化代码中单调枯燥的数据访问逻辑。可以依赖Spring来处理底层的数据访问。
mybatis是一种Spring持久化框架,要使用mybatis,就要做好相应的配置:
1,配置数据源。有很多数据源可以选择,如:DBCP,JDBC,aliba
Java静态代理、动态代理实例
aijuans
Java静态代理
采用Java代理模式,代理类通过调用委托类对象的方法,来提供特定的服务。委托类需要实现一个业务接口,代理类返回委托类的实例接口对象。
按照代理类的创建时期,可以分为:静态代理和动态代理。
所谓静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。
所谓动态代理: 在程序运行时,通过反射机制动态生成代理类。
一、静态代理类实例:
1、Serivce.ja
Struts1与Struts2的12点区别
asia007
Struts1与Struts2
1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的P
初学者要多看看帮助文档 不要用js来写Jquery的代码
百合不是茶
jquery js
解析json数据的时候需要将解析的数据写到文本框中, 出现了用js来写Jquery代码的问题;
1, JQuery的赋值 有问题
代码如下: data.username 表示的是: 网易
$("#use
经理怎么和员工搞好关系和信任
bijian1013
团队 项目管理 管理
产品经理应该有坚实的专业基础,这里的基础包括产品方向和产品策略的把握,包括设计,也包括对技术的理解和见识,对运营和市场的敏感,以及良好的沟通和协作能力。换言之,既然是产品经理,整个产品的方方面面都应该能摸得出门道。这也不懂那也不懂,如何让人信服?如何让自己懂?就是不断学习,不仅仅从书本中,更从平时和各种角色的沟通
如何为rich:tree不同类型节点设置右键菜单
sunjing
contextMenu tree Richfaces
组合使用target和targetSelector就可以啦,如下: <rich:tree id="ruleTree" value="#{treeAction.ruleTree}" var="node" nodeType="#{node.type}"
selectionChangeListener=&qu
【Redis二】Redis2.8.17搭建主从复制环境
bit1129
redis
开始使用Redis2.8.17
Redis第一篇在Redis2.4.5上搭建主从复制环境,对它的主从复制的工作机制,真正的惊呆了。不知道Redis2.8.17的主从复制机制是怎样的,Redis到了2.4.5这个版本,主从复制还做成那样,Impossible is nothing! 本篇把主从复制环境再搭一遍看看效果,这次在Unbuntu上用官方支持的版本。 Ubuntu上安装Red
JSONObject转换JSON--将Date转换为指定格式
白糖_
JSONObject
项目中,经常会用JSONObject插件将JavaBean或List<JavaBean>转换为JSON格式的字符串,而JavaBean的属性有时候会有java.util.Date这个类型的时间对象,这时JSONObject默认会将Date属性转换成这样的格式:
{"nanos":0,"time":-27076233600000,
JavaScript语言精粹读书笔记
braveCS
JavaScript
【经典用法】:
//①定义新方法
Function .prototype.method=function(name, func){
this.prototype[name]=func;
return this;
}
//②给Object增加一个create方法,这个方法创建一个使用原对
编程之美-找符合条件的整数 用字符串来表示大整数避免溢出
bylijinnan
编程之美
import java.util.LinkedList;
public class FindInteger {
/**
* 编程之美 找符合条件的整数 用字符串来表示大整数避免溢出
* 题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0
*
* 假设当前正在搜索由0,1组成的K位十进制数
读书笔记
chengxuyuancsdn
读书笔记
1、Struts访问资源
2、把静态参数传递给一个动作
3、<result>type属性
4、s:iterator、s:if c:forEach
5、StringBuilder和StringBuffer
6、spring配置拦截器
1、访问资源
(1)通过ServletActionContext对象和实现ServletContextAware,ServletReque
[通讯与电力]光网城市建设的一些问题
comsci
问题
信号防护的问题,前面已经说过了,这里要说光网交换机与市电保障的关系
我们过去用的ADSL线路,因为是电话线,在小区和街道电力中断的情况下,只要在家里用笔记本电脑+蓄电池,连接ADSL,同样可以上网........
 
oracle 空间RESUMABLE
daizj
oracle 空间不足 RESUMABLE 错误挂起
空间RESUMABLE操作 转
Oracle从9i开始引入这个功能,当出现空间不足等相关的错误时,Oracle可以不是马上返回错误信息,并回滚当前的操作,而是将操作挂起,直到挂起时间超过RESUMABLE TIMEOUT,或者空间不足的错误被解决。
这一篇简单介绍空间RESUMABLE的例子。
第一次碰到这个特性是在一次安装9i数据库的过程中,在利用D
重构第一次写的线程池
dieslrae
线程池 python
最近没有什么学习欲望,修改之前的线程池的计划一直搁置,这几天比较闲,还是做了一次重构,由之前的2个类拆分为现在的4个类.
1、首先是工作线程类:TaskThread,此类为一个工作线程,用于完成一个工作任务,提供等待(wait),继续(proceed),绑定任务(bindTask)等方法
#!/usr/bin/env python
# -*- coding:utf8 -*-
C语言学习六指针
dcj3sjt126com
c
初识指针,简单示例程序:
/*
指针就是地址,地址就是指针
地址就是内存单元的编号
指针变量是存放地址的变量
指针和指针变量是两个不同的概念
但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样
*/
# include <stdio.h>
int main(void)
{
int * p; // p是变量的名字, int *
yii2 beforeSave afterSave beforeDelete
dcj3sjt126com
delete
public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
if($insert) {
//这里是新增数据
} else {
//这里是更新数据
}
}
 
timertask
shuizhaosi888
timertask
java.util.Timer timer = new java.util.Timer(true);
// true 说明这个timer以daemon方式运行(优先级低,
// 程序结束timer也自动结束),注意,javax.swing
// 包中也有一个Timer类,如果import中用到swing包,
// 要注意名字的冲突。
TimerTask task = new
Spring Security(13)——session管理
234390216
session Spring Security 攻击保护 超时
session管理
目录
1.1 检测session超时
1.2 concurrency-control
1.3 session 固定攻击保护
 
公司项目NODEJS实践0.3[ mongo / session ...]
逐行分析JS源代码
mongodb session nodejs
http://www.upopen.cn
一、前言
书接上回,我们搭建了WEB服务端路由、模板等功能,完成了register 通过ajax与后端的通信,今天主要完成数据与mongodb的存取,实现注册 / 登录 /
pojo.vo.po.domain区别
LiaoJuncai
java VO POJO javabean domain
POJO = "Plain Old Java Object",是MartinFowler等发明的一个术语,用来表示普通的Java对象,不是JavaBean, EntityBean 或者 SessionBean。POJO不但当任何特殊的角色,也不实现任何特殊的Java框架的接口如,EJB, JDBC等等。
即POJO是一个简单的普通的Java对象,它包含业务逻辑
Windows Error Code
OhMyCC
windows
0 操作成功完成.
1 功能错误.
2 系统找不到指定的文件.
3 系统找不到指定的路径.
4 系统无法打开文件.
5 拒绝访问.
6 句柄无效.
7 存储控制块被损坏.
8 存储空间不足, 无法处理此命令.
9 存储控制块地址无效.
10 环境错误.
11 试图加载格式错误的程序.
12 访问码无效.
13 数据无效.
14 存储器不足, 无法完成此操作.
15 系
在storm集群环境下发布Topology
roadrunners
集群 storm topology spout bolt
storm的topology设计和开发就略过了。本章主要来说说如何在storm的集群环境中,通过storm的管理命令来发布和管理集群中的topology。
1、打包
打包插件是使用maven提供的maven-shade-plugin,详细见maven-shade-plugin。
<plugin>
<groupId>org.apache.maven.
为什么不允许代码里出现“魔数”
tomcat_oracle
java
在一个新项目中,我最先做的事情之一,就是建立使用诸如Checkstyle和Findbugs之类工具的准则。目的是制定一些代码规范,以及避免通过静态代码分析就能够检测到的bug。 迟早会有人给出案例说这样太离谱了。其中的一个案例是Checkstyle的魔数检查。它会对任何没有定义常量就使用的数字字面量给出警告,除了-1、0、1和2。 很多开发者在这个检查方面都有问题,这可以从结果
zoj 3511 Cake Robbery(线段树)
阿尔萨斯
线段树
题目链接:zoj 3511 Cake Robbery
题目大意:就是有一个N边形的蛋糕,切M刀,从中挑选一块边数最多的,保证没有两条边重叠。
解题思路:有多少个顶点即为有多少条边,所以直接按照切刀切掉点的个数排序,然后用线段树维护剩下的还有哪些点。
#include <cstdio>
#include <cstring>
#include <vector&