当前位置: 首页 > news >正文

淘宝客可以自己做网站推广吗wordpress 中文seo插件

淘宝客可以自己做网站推广吗,wordpress 中文seo插件,wordpress纯静态化插件,网站设计制作报价图片欣赏Mybatis 框架ORM持久化介绍 了解什么是“持久化”即把数据#xff08;如内存中的对象#xff09;保存的磁盘的某一文件中ORM概念ORM#xff0c;即Object Relational Mapping#xff0c;它是对象关系映射的简称。它的作用是在关系型数据库和对象之间作一个映射#xff0c;是…Mybatis 框架ORM持久化介绍 了解什么是“持久化”即把数据如内存中的对象保存的磁盘的某一文件中ORM概念ORM即Object Relational Mapping它是对象关系映射的简称。它的作用是在关系型数据库和对象之间作一个映射是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术ORM解决的主要问题是对象关系的映射一般情况下一个持久化类和一个表对应类的每个实例对应表中的一条记录类的每个属性对应表的每个字段。使程序能够通过操纵描述对象方式来操纵数据库。简单的说ORM是通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中。ORM在业务逻辑层和数据库层之间充当了桥梁的作用。ORM的优劣势优势ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应类的每个实例对应表中的一条记录类的每个属性对应表中的每个字段。ORM提供了对数据库的映射不用直接编写SQL代码只需像操作对象一样从数据库操作数据。让软件开发人员专注于业务逻辑的处理提高了开发效率。劣势ORM的缺点是会在一定程度上牺牲程序的执行效率。经常使用ORM会退化使用SQL的技能。Mybatis 介绍 了解Mybatis是一个优秀的持久层框架也是一个半ORM对象关系映射框架它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。XML 配置文件 熟悉属性properties在XML配置文件中配置项的排列顺序是有要求的如上所排列如果顺序放错xml配置文件会提示报错idea!-- mybatis config must config order by this index -- properties, settings, typeAliases, typeHandlers, objectFactory, objectWrapperFactory, reflectorFactory, plugins, environments, databaseIdProvider, mappers 通过mapper元素引入映射文件的方法有4种使用类路径引入 mappersmapper resourcecom/itheima/mapper/UserMapper.xml//mappers 使用本地文件路径引入 mappersmapper urlfile:///D:/com/itheima/mapper/UserMapper.xml//mappers 使用接口类引入 mappersmapper classcom.itheima.mapper.UserMapper//mappers 使用包名引入 mapperspackage namecom.itheima.mapper//mappers?xml version1.0 encodingUTF-8? !DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/schema/mybatis-3-config.dtd configuration!-- define property for next rows can use it as global --propertiesproperty nameclassDriver valuecom.mysql.jdbc.Driver/property nameurl_auxvaluejdbc:mysql://127.0.0.1:3306/test?characterEncodingutf8amp;useSSLfalse/property nameusername valueroot/property namepwd valueroot/property namelog-stdout valueSTDOUT_LOGGING//propertiessettingssetting namelogImpl value${log-stdout}//settings!-- TODO 此处选择连接的DB, 设置default属性就行了 --environments defaultdefenvironment iddeftransactionManager typeJDBC/transactionManagerdataSource typeUNPOOLEDproperty namedriver value${classDriver}/property nameurl value${url_aux}/property nameusername value${username}/property namepassword value${pwd}//dataSource/environment/environments!-- TODO 手动添加mapper或者添加资源拷贝然后使用package的方式来指定mapper位置(Xml和mapper放一起名称保持一致) --mappers!-- define mapper xml file relative path --package namecom.demo.sys.mapper//mappers /configuration从 MyBatis 3.4.2 开始你可以为占位符指定一个默认值。例如dataSource typePOOLED!-- ... --property nameusername value${username:ut_user}/ !-- 如果属性 username 没有被配置username 属性的值将为 ut_user -- /dataSource这个特性默认是关闭的。要启用这个特性需要添加一个特定的属性来开启这个特性。例如properties resourceorg/mybatis/example/config.properties!-- ... --property nameorg.apache.ibatis.parsing.PropertyParser.enable-default-value valuetrue/ !-- 启用默认值特性 -- /properties如果一个属性在不只一个地方进行了配置那么MyBatis 将按照下面的顺序来加载首先读取在 properties 元素体内指定的属性。然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件并覆盖之前读取过的同名属性。最后读取作为方法参数传递的属性并覆盖之前读取过的同名属性。因此通过方法参数传递的属性具有最高优先级resource/url 属性中指定的配置文件次之最低优先级的则是 properties 元素中指定的属性。类型别名typeAliases类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置意在降低冗余的全限定类名书写。例如typeAliasestypeAlias aliasAuthor typedomain.blog.Author/typeAlias aliasBlog typedomain.blog.Blog/typeAlias aliasComment typedomain.blog.Comment/typeAlias aliasPost typedomain.blog.Post/typeAlias aliasSection typedomain.blog.Section/typeAlias aliasTag typedomain.blog.Tag/ /typeAliases当这样配置时Blog 可以用在任何使用 domain.blog.Blog 的地方。也可以指定一个包名MyBatis 会在包名下面搜索需要的 Java Bean比如typeAliasespackage namedomain.blog/ /typeAliases每一个在包 domain.blog 中的 Java Bean在没有注解的情况下会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author若有注解则别名为其注解值。见下面的例子Alias(author) public class Author {... }下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的注意为了应对原始类型的命名重复采取了特殊的命名风格。别名映射的类型_bytebyte_char (since 3.5.10)char_character (since 3.5.10)char_longlong_shortshort_intint_integerint_doubledouble_floatfloat_booleanbooleanstringStringbyteBytechar (since 3.5.10)Charactercharacter (since 3.5.10)CharacterlongLongshortShortintIntegerintegerIntegerdoubleDoublefloatFloatbooleanBooleandateDatedecimalBigDecimalbigdecimalBigDecimalbigintegerBigIntegerobjectObjectdate[]Date[]decimal[]BigDecimal[]bigdecimal[]BigDecimal[]biginteger[]BigInteger[]object[]Object[]mapMaphashmapHashMaplistListarraylistArrayListcollectionCollectioniteratorIterator设置settings设置名描述有效值默认值cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。true | falsetruelazyLoadingEnabled延迟加载的全局开关。当开启时所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。true. | falsefalseaggressiveLazyLoading开启时任一方法的调用都会加载该对象的所有延迟加载属性。 否则每个延迟加载属性会按需加载参考 lazyLoadTriggerMethods)。true | falsefalse 在 3.4.1 及之前的版本中默认为 truemultipleResultSetsEnabled是否允许单个语句返回多结果集需要数据库驱动支持。true | falsetrueuseColumnLabel使用列标签代替列名。实际表现依赖于数据库驱动具体可参考数据库驱动的相关文档或通过对比测试来观察。true | falsetrueuseGeneratedKeys允许 JDBC 支持自动生成主键需要数据库驱动支持。如果设置为 true将强制使用自动生成主键。尽管一些数据库驱动不支持此特性但仍可正常工作如 Derby。true | falseFalseautoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集无论是否嵌套。NONE, PARTIAL, FULLPARTIALautoMappingUnknownColumnBehavior指定发现自动映射目标未知列或未知属性类型的行为。NONE: 不做任何反应WARNING: 输出警告日志org.apache.ibatis.session.AutoMappingUnknownColumnBehavior 的日志等级必须设置为 WARNFAILING: 映射失败 (抛出 SqlSessionException)NONE, WARNING, FAILINGNONEdefaultExecutorType配置默认的执行器。SIMPLE 就是普通的执行器REUSE 执行器会重用预处理语句PreparedStatement BATCH 执行器不仅重用语句还会执行批量更新。SIMPLE REUSE BATCHSIMPLEdefaultStatementTimeout设置超时时间它决定数据库驱动等待数据库响应的秒数。任意正整数未设置 (null)defaultFetchSize为驱动的结果集获取数量fetchSize设置一个建议值。此参数只可以在查询设置中被覆盖。任意正整数未设置 (null)defaultResultSetType指定语句默认的滚动策略。新增于 3.5.2FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT等同于未设置未设置 (null)safeRowBoundsEnabled是否允许在嵌套语句中使用分页RowBounds。如果允许使用则设置为 false。true | falseFalsesafeResultHandlerEnabled是否允许在嵌套语句中使用结果处理器ResultHandler。如果允许使用则设置为 false。true | falseTruemapUnderscoreToCamelCase是否开启驼峰命名自动映射即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。true | falseFalselocalCacheScopeMyBatis 利用本地缓存机制Local Cache防止循环引用和加速重复的嵌套查询。 默认值为 SESSION会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT本地缓存将仅用于执行语句对相同 SqlSession 的不同查询将不会进行缓存。SESSION | STATEMENTSESSIONjdbcTypeForNull当没有为参数指定特定的 JDBC 类型时空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型多数情况直接用一般类型即可比如 NULL、VARCHAR 或 OTHER。JdbcType 常量常用值NULL、VARCHAR 或 OTHER。OTHERlazyLoadTriggerMethods指定对象的哪些方法触发一次延迟加载。用逗号分隔的方法列表。equals,clone,hashCode,toStringdefaultScriptingLanguage指定动态 SQL 生成使用的默认脚本语言。一个类型别名或全限定类名。org.apache.ibatis.scripting.xmltags.XMLLanguageDriverdefaultEnumTypeHandler指定 Enum 使用的默认 TypeHandler 。新增于 3.4.5一个类型别名或全限定类名。org.apache.ibatis.type.EnumTypeHandlercallSettersOnNulls指定当结果集中值为 null 的时候是否调用映射对象的 settermap 对象时为 put方法这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型int、boolean 等是不能设置成 null 的。true | falsefalsereturnInstanceForEmptyRow当返回行的所有列都是空时MyBatis默认返回 null。 当开启这个设置时MyBatis会返回一个空实例。 请注意它也适用于嵌套的结果集如集合或关联。新增于 3.4.2true | falsefalselogPrefix指定 MyBatis 增加到日志名称的前缀。任何字符串未设置logImpl指定 MyBatis 所用日志的具体实现未指定时将自动查找。SLF4J | LOG4J3.5.9 起废弃 | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING未设置proxyFactory指定 Mybatis 创建可延迟加载对象所用到的代理工具。CGLIB 3.5.10 起废弃 | JAVASSISTJAVASSIST MyBatis 3.3 以上vfsImpl指定 VFS 的实现自定义 VFS 的实现的类全限定名以逗号分隔。未设置useActualParamName允许使用方法签名中的名称作为语句参数名称。 为了使用该特性你的项目必须采用 Java 8 编译并且加上 -parameters 选项。新增于 3.4.1true | falsetrueconfigurationFactory指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration getConfiguration() 的方法。新增于 3.2.3一个类型别名或完全限定类名。未设置shrinkWhitespacesInSql从SQL中删除多余的空格字符。请注意这也会影响SQL中的文字字符串。 (新增于 3.5.5)true | falsefalsedefaultSqlProviderType指定一个拥有 provider 方法的 sql provider 类 新增于 3.5.6. 这个类适用于指定 sql provider 注解上的type或 value 属性当这些属性在注解中被忽略时。 (e.g. SelectProvider)类型别名或者全限定名未设置nullableOnForEach为 foreach 标签的 nullable 属性指定默认值。新增于 3.5.9true | falsefalseargNameBasedConstructorAutoMapping当应用构造器自动映射时参数名称被用来搜索要映射的列而不再依赖列的顺序。新增于 3.5.10true | falsefalseresultMap的属性值属性说明id属性 resultMap标签的标识。type属性 返回值的全限定类名或类型别名。autoMapping属性 值范围true默认值|false, 设置是否启动自动映射功能自动映射功能就是自动查找与字段名小写同名的属性名并调用setter方法。而设置为false后则需要在resultMap内明确注明映射关系才会调用对应的setter方法。resultMap idgetStudentRM typeEStudnetid propertyid columnID/result propertystudentName columnName/result propertystudentAge columnAge/ /resultMap子元素说明id元素 用于设置主键字段与领域模型属性的映射关系result元素 用于设置普通字段与领域模型属性的映射关系id、result语句属性配置细节属性描述property需要映射到JavaBean 的属性名称。column数据表的列名或者标签别名。javaType一个完整的类名或者是一个类型别名。如果你匹配的是一个JavaBean那MyBatis 通常会自行检测到。然后如果你是要映射到一个HashMap那你需要指定javaType 要达到的目的。jdbcType数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项但MyBatis 不需要。如果你是直接针对JDBC 编码且有允许空的列而你要指定这项。typeHandler使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名也可以是一个类型别名。association和collection的属性注意在采用嵌套结果的方式查询一对一、一对多关系时必须要通过resultMap下的id或result标签来显式设置属性/字段映射关系否则在查询多条记录时会仅仅返回最后一条记录的情况。collection 它的属性大部分和association标签的属性相同但多了个ofType属性property用于指定映射到的实体类对象的属性与表字段一 一对应column用于指定表中对应的字段javaType用于指定映射到实体对象的属性的类型要接收数据库数据的完整的java类对象名或别名jdbcType用于指定数据表中对应字段的类型fetchType用于指定在关联查询时是否启动延迟加载。有lazy和eager两个属性值默认值为lazyselect用于指定引入嵌套查询的子SQL语句autoMapping用于指定是否自动映射typeHandler用于指定一个类型处理器ofTypeofType与javaType属性对应它用于指定实体类对象中的集合类属性所包含的类型(如List A ,ofType就为A)MyBatis就是通过collection标签用来实现一对多和多对多association则用来实现一对一和多对一而这两种方式实际上都涉及到两种查询分别是联合查询和嵌套子查询https://www.cnblogs.com/achengmu/p/9241113.htmlXML 映射文件 熟悉https://www.w3cschool.cn/mybatis/f4uw1ilx.htmlhttps://blog.csdn.net/poloto_s/article/details/123067441Select 元素的属性属性描述id在命名空间中唯一的标识符可以被用来引用这条语句。parameterType将会传入这条语句的参数的类全限定名或别名。这个属性是可选的因为 MyBatis 可以通过类型处理器TypeHandler推断出具体传入语句的参数默认值为未设置unset。resultType期望从这条语句中返回结果的类全限定名或别名。 注意如果返回的是集合那应该设置为集合包含的类型而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。resultMap对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性如果你对其理解透彻许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。flushCache将其设置为 true 后只要语句被调用都会导致本地缓存和二级缓存被清空默认值false。useCache将其设置为 true 后将会导致本条语句的结果被二级缓存缓存起来默认值对 select 元素为 true。timeout这个设置是在抛出异常之前驱动程序等待数据库返回请求结果的秒数。默认值为未设置unset依赖数据库驱动。fetchSize这是一个给驱动的建议值尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置unset依赖驱动。statementType可选 STATEMENTPREPARED 或 CALLABLE。这会让 MyBatis 分别使用 StatementPreparedStatement 或 CallableStatement默认值PREPARED。resultSetTypeFORWARD_ONLYSCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT等价于 unset 中的一个默认值为 unset 依赖数据库驱动。databaseId如果配置了数据库厂商标识databaseIdProviderMyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句如果带和不带的语句都有则不带的会被忽略。resultOrdered这个设置仅针对嵌套结果 select 语句如果为 true则假设结果集以正确顺序排序后执行映射当返回新的主结果行时将不再发生对以前结果行的引用。 这样可以减少内存消耗。默认值false。resultSets这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称多个名称之间以逗号分隔。Insert, Update, Delete 元素的属性属性描述id在命名空间中唯一的标识符可以被用来引用这条语句。parameterType将会传入这条语句的参数的类全限定名或别名。这个属性是可选的因为 MyBatis 可以通过类型处理器TypeHandler推断出具体传入语句的参数默认值为未设置unset。parameterMap用于引用外部 parameterMap 的属性目前已被废弃。请使用行内参数映射和 parameterType 属性。flushCache将其设置为 true 后只要语句被调用都会导致本地缓存和二级缓存被清空默认值对 insert、update 和 delete 语句true。timeout这个设置是在抛出异常之前驱动程序等待数据库返回请求结果的秒数。默认值为未设置unset依赖数据库驱动。statementType可选 STATEMENTPREPARED 或 CALLABLE。这会让 MyBatis 分别使用 StatementPreparedStatement 或 CallableStatement默认值PREPARED。useGeneratedKeys仅适用于 insert 和 update这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键比如像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段默认值false。keyProperty仅适用于 insert 和 update指定能够唯一识别对象的属性MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值默认值未设置unset。如果生成列不止一个可以用逗号分隔多个属性名称。keyColumn仅适用于 insert 和 update设置生成键值在表中的列名在某些数据库像 PostgreSQL中当主键列不是表中的第一列的时候是必须设置的。如果生成列不止一个可以用逗号分隔多个属性名称。databaseId如果配置了数据库厂商标识databaseIdProviderMyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句如果带和不带的语句都有则不带的会被忽略。selectKey 元素的属性对于不支持自动生成主键列的数据库和可能不支持自动生成主键的 JDBC 驱动MyBatis 有另外一种方法来生成主键。属性描述keyPropertyselectKey 语句结果应该被设置到的目标属性。如果生成列不止一个可以用逗号分隔多个属性名称。keyColumn返回结果集中生成列属性的列名。如果生成列不止一个可以用逗号分隔多个属性名称。resultType结果的类型。通常 MyBatis 可以推断出来但是为了更加准确写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型包括字符串。如果生成列不止一个则可以使用包含期望属性的 Object 或 Map。order可以设置为 BEFORE 或 AFTER。如果设置为 BEFORE那么它首先会生成主键设置 keyProperty 再执行插入语句。如果设置为 AFTER那么先执行插入语句然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似在插入语句内部可能有嵌入索引调用。statementType和前面一样MyBatis 支持 STATEMENTPREPARED 和 CALLABLE 类型的映射语句分别代表 Statement, PreparedStatement 和 CallableStatement 类型。单表 sql 和动态 sql 熟悉动态 sql 熟悉MyBatis if标签条件判断最常见的场景是在 if 语句中包含 where 子句例如。select idselectAllWebsite resultMapmyResultselect id,name,url from websiteif testname ! nullwhere name like #{name}/if /select以上代表表示根据网站名称去查找相应的网站信息但是网站名称是一个可填可不填的条件不填写的时候不作为查询条件。可多个 if 语句同时使用。以下语句表示为可以按照网站名称name或者网址url进行模糊查询。如果您不输入名称或网址则返回所有的网站记录。但是如果你传递了任意一个参数它就会返回与给定参数相匹配的记录。select idselectAllWebsite resultMapmyResultselect id,name,url from website where 11if testname ! nullAND name like #{name}/ifif testurl! nullAND url like #{url}/if /selectMyBatis choose、when和otherwise标签MyBatis 中动态语句 choose-when-otherwise 类似于 Java 中的 switch-case-default 语句。由于 MyBatis 并没有为 if 提供对应的 else 标签如果想要达到if...else.../else /if 的效果可以借助 choose、when、otherwise 来实现。动态语句 choose-when-otherwise 语法如下。choosewhen test判断条件1SQL语句1/when when test判断条件2SQL语句2/when when test判断条件3SQL语句3/when otherwiseSQL语句4/otherwise /choosechoose 标签按顺序判断其内部 when 标签中的判断条件是否成立如果有一个成立则执行相应的 SQL 语句choose 执行结束如果都不成立则执行 otherwise 中的 SQL 语句。这类似于 Java 的 switch 语句choose 为 switchwhen 为 caseotherwise 则为 default。示例以下示例要求当网站名称不为空时只用网站名称作为条件进行模糊查询当网站名称为空而网址不为空时则用网址作为条件进行模糊查询当网站名称和网址都为空时则要求网站年龄不为空。mapper namespacenet.biancheng.mapper.WebsiteMapperselect idselectWebsiteparameterTypenet.biancheng.po.WebsiteresultTypenet.biancheng.po.WebsiteSELECT id,name,url,age,countryFROM website WHERE 11choosewhen testname ! null and name !AND name LIKE CONCAT(%,#{name},%)/whenwhen testurl ! null and url !AND url LIKE CONCAT(%,#{url},%)/whenotherwiseAND age is not null/otherwise/choose/select /mapperSQL 语句中加入了一个条件“11”如果没有加入这个条件那么可能就会变成下面这样一条错误的语句。SELECT id,name,url,age,country FROM website where AND name LIKE CONCAT(%,#{name},%)MyBatis where标签where 标签主要用来简化 SQL 语句中的条件判断可以自动处理 AND/OR 条件语法如下。whereif test判断条件AND/OR .../if /whereif 语句中判断条件为 true 时where 关键字才会加入到组装的 SQL 里面否则就不加入。where 会检索语句它会将 where 后的第一个 SQL 条件语句的 AND 或者 OR 关键词去掉。select idselectWebsite resultTypenet.biancheng.po.Websiteselect id,name,url from websitewhereif testname ! nullAND name like #{name}/ifif testurl! nullAND url like #{url}/if/where /selectMyBatis set标签在 Mybatis 中update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字剔除追加到条件末尾多余的逗号。?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacenet.biancheng.mapper.WebsiteMapperselect idselectWebsite resultTypenet.biancheng.po.WebsiteSELECT * FROM websitewhereif testid!null and id!id#{id}/if/where/select!--使用set元素动态修改一个网站记录 --update idupdateWebsiteparameterTypenet.biancheng.po.WebsiteUPDATE websitesetif testname!nullname#{name}/ifif testurl!nullurl#{url}/if/setWHERE id#{id}/update /mapperMyBatis foreach标签对于一些 SQL 语句中含有 in 条件需要迭代条件集合来生成的情况可以使用 foreach 来实现 SQL 条件的迭代。 Mybatis foreach 标签用于循环语句它很好的支持了数据和 List、set 接口的集合并对此提供遍历的功能。语法格式如下。foreach itemitem indexindex collectionlist|array|map key open( separator, close)参数值 /foreachforeach 标签主要有以下属性说明如下。item表示集合中每一个元素进行迭代时的别名。index指定一个名字表示在迭代过程中每次迭代到的位置。open表示该语句以什么开始既然是 in 条件语句所以必然以(开始。separator表示在每次进行迭代之间以什么符号作为分隔符既然是 in 条件语句所以必然以,作为分隔符。close表示该语句以什么结束既然是 in 条件语句所以必然以)开始。使用 foreach 标签时最关键、最容易出错的是 collection 属性该属性是必选的但在不同情况下该属性的值是不一样的主要有以下 3 种情况如果传入的是单参数且参数类型是一个 Listcollection 属性值为 list。如果传入的是单参数且参数类型是一个 array 数组collection 的属性值为 array。如果传入的参数是多个需要把它们封装成一个 Map当然单参数也可以封装成 Map。Map 的 key 是参数名collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。select idselectWebsiteparameterTypenet.biancheng.po.WebsiteresultTypenet.biancheng.po.WebsiteSELECT id,name,url,age,countryFROM website WHERE age inforeach itemage indexindex collectionlist open(separator, close)#{age}/foreach /selectMyBatis bind标签每个数据库的拼接函数或连接符号都不同例如 MySQL 的 concat 函数、Oracle 的连接符号“||”等。这样 SQL 映射文件就需要根据不同的数据库提供不同的实现显然比较麻烦且不利于代码的移植。幸运的是MyBatis 提供了 bind 标签来解决这一问题。bind 标签可以通过 OGNL 表达式自定义一个上下文变量。比如按照网站名称进行模糊查询SQL 映射文件如下。select idselectWebsite resultTypenet.biancheng.po.Websitebind namepattern value%_parameter% /SELECT id,name,url,age,countryFROM websiteWHERE name like #{pattern} /selectbind 元素属性如下。value对应传入实体类的某个字段可以进行字符串拼接等特殊处理。name给对应参数取的别名。以上代码中的“_parameter”代表传递进来的参数它和通配符连接后赋给了 pattern然后就可以在 select 语句中使用这个变量进行模糊查询不管是 MySQL 数据库还是 Oracle 数据库都可以使用这样的语句提高了可移植性。select idselectWebsite resultTypenet.biancheng.po.Websitebind namepattern_name value%name% /bind namepattern_url value%url% /SELECT id,name,url,age,countryFROM websiteWHERE name like #{pattern_name}AND url like #{pattern_url} /selectMyBatis trim标签在 MyBatis 中除了使用 ifwhere 实现多条件查询还有一个更为灵活的元素 trim 能够替代之前的做法。trim 一般用于去除 SQL 语句中多余的 AND 关键字、逗号或者给 SQL 语句前拼接 where、set 等后缀可用于选择性插入、更新、删除或者条件查询等操作。trim 语法格式如下。trim prefix前缀suffix后缀prefixOverrides忽略前缀字符suffixOverrides忽略后缀字符SQL语句 /trimtrim 中属性说明如下。属性描述prefix给SQL语句拼接的前缀为 trim 包含的内容加上前缀suffix给SQL语句拼接的后缀为 trim 包含的内容加上后缀prefixOverrides去除 SQL 语句前面的关键字或字符该关键字或者字符由 prefixOverrides 属性指定。suffixOverrides去除 SQL 语句后面的关键字或者字符该关键字或者字符由 suffixOverrides 属性指定。select idselectWebsite resultTypenet.biancheng.po.WebsiteSELECT id,name,url,age,countryFROM websitetrim prefixwhere prefixOverridesandif testname ! null and name !AND name LIKE CONCAT (%,#{name},%)/ifif testurl! nullAND url like concat (%,#{url},%)/if/trim /select单表sql好文https://blog.csdn.net/z2598849479/article/details/126288204动态sql好文https://blog.csdn.net/partworld/article/details/125232457动态sql好文http://c.biancheng.net/mybatis/sql-dynamic.htmlmybatis 逆向工程自动生成代码 了解https://cloud.tencent.com/developer/article/2095433SpringDruidDataSource Mybatis 框架整合 熟悉https://blog.csdn.net/Numb_ZL/article/details/126357068事务注意事项 熟悉https://www.myttjp.com/share/10771.htmlhttps://blog.csdn.net/CSDN_WYL2016/article/details/122254559mybatis sql语句里写 #和$区别#{}是预编译处理是占位符${}是字符串替换是拼接符Mybatis在处理#{}的时候会将sql中的#{}替换成号调用PreparedStatement来赋值,Mybatis在处理${}的时候就是把${}替换成变量的值调用Statement来赋值使用 #{} 可以有效的防止SQL注入但是使用${}不可以防止SQL注入。什么是SQL注入SQL 注入就是在用户输入的字符串中加入 SQL 语句如果在设计不良的程序中忽略了检查那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行攻击者就可以执行额外的命令或访问未被授权的数据。举个例子我们有一个简单的查询操作根据id查询一个用户信息。它的sql语句应该是这样select * from user where id 。我们根据传入条件填入id进行查询。如果正常操作传入一个正常的id比如说2那么这条语句变成select * from user where id 2。这条语句是可以正常运行并且符合我们预期的。但是如果传入的参数变成 or 11这时这条语句变成select * from user where id or 11。它会将我们用户表中所有的数据查询出来显然这是一个大的错误。这就是SQL注入。也就是可以恶意的拼接sql语句来达到查询所有的数据的目的#{} 方式#{}: 解析为SQL时会将形参变量的值取出并自动给其添加双引号。 例如当实参usernameAmy时传入下Mapper映射文件后 select idfindByName parameterTypeString resultMapstudentResultMapSELECT * FROM user WHERE username#{value}/selectSQL将解析为SELECT * FROM user WHERE usernameAmy${} 方式${}: 解析为SQL时将形参变量的值直接取出直接拼接显示在SQL中例如当实参usernameAmy时传入下Mapper映射文件后 select idfindByName parameterTypeString resultMapstudentResultMap SELECT * FROM user WHERE username${value} /selectSQL将解析如下SELECT * FROM user WHERE usernameAmymybaits怎么防止SQL注入这个问题其实就是问#{}是能够防止sql注入是什么原理#{}方式是先用占位符代替参数sql中的#{}替换为?号将SQL语句先进行预编译最后再将参数中的内容替换进来。由于SQL语句已经被预编译过其SQL注入将无法通过非法的参数内容实现更改其参数中的内容无法变为SQL命令的一部分故#{}可以防止SQL注入。${}之所以不能防止SQL注入是因为它是直接把那个传入的值拼接在sql语句后面这个时候如果恶意拼装sql就可以实现sql注入。说白了就是#{}会把sql语句中的参数部分用代替进行预编译这个时候由于没有具体的参数所以叫预编译最后把参数替换那个问号进行真正的sql操作然后这个时候sql语句就已经固定了所以你后面传的参数哪怕恶意拼装成了一个sql样式也没用因为sql已经固定了你传的任何参数在它眼里只是一个字符串而不会当做一个sql语句去执行更加底层的讲解MyBatis防止SQL注入的原理MyBatis在处理#{}时会将sql中的#{}替换为?号调用PreparedStatement的set方法来赋值 ,PreparedStatement在执行阶段只是把输入串作为数据处理,不再对sql语句进行解析,准备,因此也就避免了sql注入问题。PreparedStatement防止SQL注入的原理JDBC的PreparedStatement会将带?占位符的sql语句预先编译好也就是SQL引擎会预先进行语法分析产生语法树生成执行计划。对于占位符输入的参数无论是什么都不会影响该SQL语句的语法结构了因为语法分析已经完成了即使你后面输入了这些sql命令也不会被当成sql命令来执行了只会被当做字符串字面值参数。所以的sql语句预编译可以防御SQL注入。而且在多次执行同一个SQL时能够提高效率。原因是SQL已编译好再次执行时无需再编译。MyBatis Plus 框架MyBatis-Plus 是什么 了解MyBatis-Plus 是一个 Mybatis 增强版工具在 MyBatis 上扩充了其他功能没有改变其基本功能为了简化开发提高效率而存在适用情况1、对于只进行单表操作来说mybatis-plus代码量比mybatis的代码量少很多极大的提高了开发效率2、对于多表操作来说更推荐mybatis因为mybatis-plus的方法比较难以理解用起来不太方便不如自己写sql语句的逻辑那么清晰明了MyBatis-Plus 与 Mybatis 的区别 了解MyBatis1所有SQL语句全部自己写2手动解析实体关系映射转换为MyBatis内部对象注入容器3不支持Lambda形式调用Mybatis Plus1强大的条件构造器,满足各类使用需求2内置的Mapper,通用的Service,少量配置即可实现单表大部分CRUD操作,连SQL语句都不需要编写3支持Lambda形式调用4自动解析实体关系映射转换为MyBatis内部对象注入容器总结Mybatis Plus的宗旨是简化开发但是它在提供方便的同时却容易造成代码层次混乱我们可能会把大量数据逻辑写到service层甚至contoller层中使代码难以阅读。凡事过犹不及在使用Mybatis Plus时一定要做分析不要将所有数据操作都交给Mybatis Plus去实现。毕竟Mybatis Plus只是Mybatis的增强工具它并没有侵入Mybatis的原生功能在使用Mybatis Plus的增强功能的同时原生Mybatis的功能依然是可以正常使用的。通用 CRUD 熟悉https://blog.csdn.net/LXZ_1024/article/details/123930130https://blog.csdn.net/qq_37829947/article/details/125852116配置 熟悉https://blog.csdn.net/weixin_45525272/article/details/123694959条件构造器 熟悉 https://blog.csdn.net/m0_63300795/article/details/126953915https://blog.csdn.net/PIKapikaaaa/article/details/125628180Sequence 主键 熟悉https://blog.csdn.net/weixin_42220853/article/details/114585361https://www.bookstack.cn/read/mybatis-plus-3.x/6139df349d82599b.md分页插件 PageHelper 熟悉 https://blog.csdn.net/weixin_44720982/article/details/125152107使用注意事项多数源应用介绍 了解数据库操作风险意识数据操作风险意识 熟悉sql 性能优化问题 了解1 对查询进行优化应尽量避免全表扫描首先应考虑在 where 及 order by 涉及的列上建立索引。2应尽量避免在 where 子句中对字段进行 null 值判断创建表时NULL是默认值但大多数时候应该使用NOT NULL或者使用一个特殊的值如0-1作为默 认值。3应尽量避免在 where 子句中使用!或操作符 MySQL只有对以下操作符才使用索引BETWEENIN以及某些时候的LIKE。4应尽量避免在 where 子句中使用 or 来连接条件 否则将导致引擎放弃使用索引而进行全表扫描 可以 使用UNION合并查询 select id from t where num10 union all select id from t where num205in 和 not in 也要慎用否则会导致全表扫描对于连续的数值能用 between 就不要用 in 了Select id from t where num between 1 and 36下面的查询也将导致全表扫描select id from t where name like ‘%abc%’ 或者select id from t where name like ‘%abc’若要提高效率可以考虑全文检索。而select id from t where name like ‘abc%’ 才用到索引7 如果在 where 子句中使用参数也会导致全表扫描。8应尽量避免在 where 子句中对字段进行表达式操作应尽量避免在where子句中对字段进行函数操作9,很多时候用 exists 代替 in 是一个好的选择 select num from a where num in(select num from b).用下面的语句替换 select num from a where exists(select 1 from b where numa.num)10,索引固然可以提高相应的 select 的效率但同时也降低了 insert 及 update 的效率因为 insert 或 update 时有可能会重建索引所以怎样建索引需要慎重考虑视具体情况而定。一个表的索引数最好不要超过6个若太多则应考虑一些不常使用到的列上建的索引是否有必要。11,应尽可能的避免更新 clustered 索引数据列 因为 clustered 索引数据列的顺序就是表记录的物理存储顺序一旦该列值改变将导致整个表记录的顺序的调整会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列那么需要考虑是否应将该索引建为 clustered 索引。12尽量使用数字型字段若只含数值信息的字段尽量不要设计为字符型这会降低查询和连接的性能并会增加存储开销。13尽可能的使用 varchar/nvarchar 代替 char/nchar 因为首先变长字段存储空间小可以节省存储空间其次对于查询来说在一个相对较小的字段内搜索效率显然要高些。14最好不要使用”“返回所有 select from t 用具体的字段列表代替“”不要返回用不到的任何字段。15尽量避免向客户端返回大数据量若数据量过大应该考虑相应需求是否合理。16使用表的别名(Alias)当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。17使用“临时表”暂存中间结果 简化SQL语句的重要方法就是采用临时表暂存中间结果但是临时表的好处远远不止这些将临时结果暂存在临时表后面的查询就在tempdb中了这可以避免程序中多次扫描主表也大大减少了程序执行中“共享锁”阻塞“更新锁”减少了阻塞提高了并发性能。18一些SQL查询语句应加上nolock读、写是会相互阻塞的为了提高并发性能对于一些查询可以加上nolock这样读的时候可以允许写但缺点是可能读到未提交的脏数据。使用 nolock有3条原则。查询的结果用于“插、删、改”的不能加nolock 查询的表属于频繁发生页分裂的慎用nolock 使用临时表一样可以保存“数据前影”起到类似Oracle的undo表空间的功能能采用临时表提高并发性能的不要用nolock 。19常见的简化规则如下不要有超过5个以上的表连接JOIN考虑使用临时表或表变量存放中间结果。少用子查询视图嵌套不要过深,一般视图嵌套不要超过2个为宜。20将需要查询的结果预先计算好放在表中查询的时候再Select。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。21用OR的字句可以分解成多个查询并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引用UNION all执行的效率更高.多个OR的字句没有用到索引改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。22在IN后面值的列表中将出现最频繁的值放在最前面出现得最少的放在最后面减少判断的次数。23尽量将数据的处理工作放在服务器上减少网络的开销如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句是控制流语言的集合速度当然快。反复执行的动态SQL,可以使用临时存储过程该过程临时表被放在Tempdb中。24当服务器的内存够多时配制线程数量 最大连接数5这样能发挥最大的效率否则使用 配制线程数量最大连接数启用SQL SERVER的线程池来解决,如果还是数量 最大连接数5严重的损害服务器的性能。25查询的关联同写的顺序 select a.personMemberID, * from chineseresume a,personmember b where personMemberID b.referenceid and a.personMemberID ‘JCNPRH39681’ A B ,B ‘号码’ select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID b.referenceid and a.personMemberID ‘JCNPRH39681’ and b.referenceid ‘JCNPRH39681’ A B ,B ‘号码’ A ‘号码’ select a.personMemberID, * from chineseresume a,personmember b where b.referenceid ‘JCNPRH39681’ and a.personMemberID ‘JCNPRH39681’ B ‘号码’ A ‘号码’26尽量使用exists代替select count(1)来判断是否存在记录count函数只有在统计表中所有行数时使用而且count(1)比count()更有效率。27尽量使用“”不要使用“”。28索引的使用规范索引的创建要与应用结合考虑建议大的OLTP表不要超过6个索引尽可能的使用索引字段作为查询条件尤其是聚簇索引必要时可以通过index index_name来强制指定索引避免对大表查询时进行table scan必要时考虑新建索引在使用索引字段作为条件时如果该索引是联合索引那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引否则该索引将不会被使用要注意索引的维护周期性重建索引重新编译存储过程。  29下列SQL条件语句中的列都建有恰当的索引但执行速度却非常慢 SELECT * FROM record WHERE substrINg(card_no,1,4)’5378’ (13秒) SELECT * FROM record WHERE amount/30 1000 11秒 SELECT * FROM record WHERE convert(char(10),date,112)’19991201’ 10秒 分析 WHERE子句中对列的任何操作结果都是在SQL运行时逐列计算得到的因此它不得不进行表搜索而没有使用该列上面的索引如果这些结果在查询编译时就能得到那么就可以被SQL优化器优化使用索引避免表搜索因此将SQL重写成下面这样 SELECT * FROM record WHERE card_no like ‘5378%’ 1秒 SELECT * FROM record WHERE amount 100030 1秒 SELECT * FROM record WHERE date ‘1999/12/01’ 1秒30当有一批处理的插入或更新时用批量插入或批量更新绝不会一条条记录的去更新!31在所有的存储过程中能够用SQL语句的我绝不会用循环去实现! (例如列出上个月的每一天我会用connect by去递归查询一下绝不会去用循环从上个月第一天到最后一天)32选择最有效率的表名顺序(只在基于规则的优化器中有效) oracle 的解析器按照从右到左的顺序处理FROM子句中的表名FROM子句中写在最后的表(基础表 driving table)将被最先处理在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.33提高GROUP BY语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多. 低效: SELECT JOB , AVG(SAL) FROM EMP GROUP BY JOB HAVING JOB ’PRESIDENT’ OR JOB ’MANAGER’ 高效: SELECT JOB , AVG(SAL) FROM EMP WHERE JOB ’PRESIDENT’ OR JOB ’MANAGER’ GROUP BY JOB34sql语句用大写因为oracle 总是先解析sql语句把小写的字母转换成大写的再执行。35别名的使用别名是大型数据库的应用技巧就是表名、列名在查询中以一个字母为别名查询速度要比建连接表快1.5倍。36避免死锁在你的存储过程和触发器中访问同一个表时总是以相同的顺序;事务应经可能地缩短在一个事务中应尽可能减少涉及到的数据量;永远不要在事务中等待用户输入。37避免使用临时表除非却有需要否则应尽量避免使用临时表相反可以使用表变量代替;大多数时候(99%)表变量驻扎在内存中因此速度比临时表更快临时表驻扎在TempDb数据库中因此临时表上的操作需要跨数据库通信速度自然慢。38最好不要使用触发器触发一个触发器执行一个触发器事件本身就是一个耗费资源的过程;如果能够使用约束实现的尽量不要使用触发器;不要为不同的触发事件(InsertUpdate和Delete)使用相同的触发器;不要在触发器中使用事务型代码。39索引创建规则 表的主键、外键必须有索引 数据量超过300的表应该有索引 经常与其他表进行连接的表在连接字段上应该建立索引 经常出现在Where子句中的字段特别是大表的字段应该建立索引 索引应该建在选择性高的字段上 索引应该建在小字段上对于大的文本字段甚至超长字段不要建索引 复合索引的建立需要进行仔细分析尽量考虑用单字段索引代替 正确选择复合索引中的主列字段一般是选择性较好的字段 复合索引的几个字段是否经常同时以AND方式出现在Where子句中单字段查询是否极少甚至没有如果是则可以建立复合索引否则考虑单字段索引 如果复合索引中包含的字段经常单独出现在Where子句中则分解为多个单字段索引 如果复合索引所包含的字段超过3个那么仔细考虑其必要性考虑减少复合的字段 如果既有单字段索引又有这几个字段上的复合索引一般可以删除复合索引 频繁进行数据操作的表不要建立太多的索引 删除无用的索引避免对执行计划造成负面影响 表上建立的每个索引都会增加存储开销索引对于插入、删除、更新操作也会增加处理上的开销。另外过多的复合索引在有单字段索引的情况下一般都是没有存在价值的相反还会降低数据增加删除时的性能特别是对频繁更新的表来说负面影响更大。 尽量不要对数据库中某个含有大量重复的值的字段建立索引。40mysql查询优化总结使用慢查询日志去发现慢查询使用执行计划去判断查询是否正常运行总是去测试你的查询看看是否他们运行在最佳状态下。久而久之性能总会变化避免在整个表上使用count(),它可能锁住整张表使查询保持一致以便后续相似的查询可以使用查询缓存 在适当的情形下使用GROUP BY而不是DISTINCT在WHERE, GROUP BY和ORDER BY子句中使用有索引的列保持索引简单,不在多个索引中包含同一个列有时候MySQL会使用错误的索引,对于这种情况使用USE INDEX检查使用SQL_MODESTRICT的问题对于记录数小于5的索引字段在UNION的时候使用LIMIT不是是用OR。 为了 避免在更新前SELECT使用INSERT ON DUPLICATE KEY或者INSERT IGNORE ,不要用UPDATE去实现不要使用 MAX,使用索引字段和ORDER BY子句LIMIT MN实际上可以减缓查询在某些情况下有节制地使用在WHERE子句中使用UNION代替子查询在重新启动的MySQL记得来温暖你的数据库以确保您的数据在内存和查询速度快考虑持久连接而不是多个连接以减少开销基准查询包括使用服务器上的负载有时一个简单的查询可以影响其他查询当负载增加您的服务器上使用SHOW PROCESSLIST查看慢的和有问题的查询在开发环境中产生的镜像数据中 测试的所有可疑的查询。41MySQL 备份过程: 从二级复制服务器上进行备份。在进行备份期间停止复制以避免在数据依赖和外键约束上出现不一致。彻底停止MySQL从数据库文件进行备份。 如果使用 MySQL dump进行备份请同时备份二进制日志文件 – 确保复制没有中断。不要信任LVM 快照这很可能产生数据不一致将来会给你带来麻烦。为了更容易进行单表恢复以表为单位导出数据 – 如果数据是与其他表隔离的。 当使用mysqldump时请使用 –opt。在备份之前检查和优化表。为了更快的进行导入在导入时临时禁用外键约束。 为了更快的进行导入在导入时临时禁用唯一性检测。在每一次备份后计算数据库表以及索引的尺寸以便更够监控数据尺寸的增长。 通过自动调度脚本监控复制实例的错误和延迟。定期执行备份。42查询缓冲并不自动处理空格因此在写SQL语句时应尽量减少空格的使用尤其是在SQL首和尾的空格(因为查询缓冲并不自动截取首尾空格)。43member用mid做標準進行分表方便查询么一般的业务需求中基本上都是以username为查询依据正常应当是username做hash取模来分表吧。分表的话 mysql 的partition功能就是干这个的对代码是透明的 在代码层面去实现貌似是不合理的。44我们应该为数据库里的每张表都设置一个ID做为其主键而且最好的是一个INT型的推荐使用UNSIGNED并设置上自动增加的AUTO_INCREMENT标志。45在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON 在结束时设置 SET NOCOUNT OFF 。 无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。46MySQL查询可以启用高速查询缓存。这是提高数据库性能的有效Mysql优化方法之一。当同一个查询被执行多次时从缓存中提取数据和直接从数据库中返回数据快很多。47EXPLAIN SELECT 查询用来跟踪查看效果 使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的你的数据表是如何被搜索和排序的……等等等等。48当只要一行数据时使用 LIMIT 1 当你查询表的有些时候你已经知道结果只会有一条结果但因为你可能需要去fetch游标或是你也许会去检查返回的记录数。在这种情况下加上 LIMIT 1 可以增加性能。这样一样MySQL数据库引擎会在找到一条数据后停止搜索而不是继续往后查少下一条符合记录的数据。49,选择表合适存储引擎 myisam: 应用时以读和插入操作为主只有少量的更新和删除并且对事务的完整性并发性要求不是很高的。 Innodb 事务处理以及并发条件下要求数据的一致性。除了插入和查询外包括很多的更新和删除。Innodb有效地降低删除和更新导致的锁定。对于支持事务的InnoDB类型的表来说影响速度的主要原因是AUTOCOMMIT默认设置是打开的而且程序没有显式调用BEGIN 开始事务导致每插入一条都自动提交严重影响了速度。可以在执行sql前调用begin多条sql形成一个事物即使autocommit打开也可以将大大提高性能。50,优化表的数据类型,选择合适的数据类型 原则更小通常更好简单就好所有字段都得有默认值,尽量避免null。 例如数据库表设计时候更小的占磁盘空间尽可能使用更小的整数类型.(mediumint就比int更合适) 比如时间字段datetime和timestamp, datetime占用8个字节而timestamp占用4个字节只用了一半而timestamp表示的范围是1970—2037适合做更新时间 MySQL可以很好的支持大数据量的存取但是一般说来数据库中的表越小在它上面执行的查询也就会越快。 因此在创建表的时候为了获得更好的性能我们可以将表中字段的宽度设得尽可能小。例如 在定义邮政编码这个字段时如果将其设置为CHAR(255),显然给数据库增加了不必要的空间 甚至使用VARCHAR这种类型也是多余的因为CHAR(6)就可以很好的完成任务了。同样的如果可以的话 我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。 应该尽量把字段设置为NOT NULL这样在将来执行查询的时候数据库不用去比较NULL值。 对于某些文本字段例如“省份”或者“性别”我们可以将它们定义为ENUM类型。因为在MySQL中ENUM类型被当作数值型数据来处理 而数值型数据被处理起来的速度要比文本类型快得多。这样我们又可以提高数据库的性能。51 字符串数据类型charvarchartext选择区别52任何对列的操作都将导致表扫描它包括数据库函数、计算表达式等等查询时要尽可能将操作移至等号右边。
http://www.w-s-a.com/news/337296/

相关文章:

  • 学校网站建设说明书海南省建设执业资格注册管理中心网站
  • 东莞哪家网站建设好网站风格设定
  • 自驾游网站模板搭建wordpress步骤
  • wordpress视频网站上传视频提升学历是什么意思
  • 江西省城乡建设厅建设网站浙江建设
  • 网站联系我们页面临平做网站
  • 如何用网站做cpa交互比较好的网站
  • 一家只做特卖的网站wordpress修改模板教程
  • 与恶魔做交易的网站成都到西安高铁票价
  • 太原网站制作哪家便宜长春昆仑建设股份有限公司网站
  • 优质做网站价格设计手机商城网站建设
  • 高校网站建设制度无锡网站建设排名
  • 做网站的软件wd的叫啥无锡公司网站建设服务
  • 网站建设一般需要多久网站服务器基本要素有哪些
  • 大连开发区网站开发公司免费网站建设哪个好?
  • 关于建设门户网站的通知海曙区建设局网站
  • 韩国建设部网站温州企业网站制作
  • 苏州网站建设优化贵州网站建设lonwone
  • 网站建设与推广方案模板网站建设教程搭建浊贝湖南岚鸿给力
  • 网站建设内部下单流程图昆明网站制作公司
  • 手机网站焦点图在线外链推广
  • 做静态页面的网站中国建设银行河南省分行网站
  • 镇平县两学一做专题网站佛山家居网站全网营销
  • 做网站的需求wordpress图片怎么居中
  • 网站开发的技术流程图抖音seo排名优化软件
  • dedecms做电商网站得物app官方下载安装
  • python做网站教程微网站 举例
  • 百度喜欢什么样的网站如何引用网站上的资料做文献
  • 如何给网站添加网站地图军刀seo
  • 模板网站开发推广陈村大良网站建设