对其做了些优化,但此种sql生成方式仅适用于复杂程度不高的sql,所以实用性不是很高,仅仅是写着玩的,知道点mybatis的注解形式的使用方式,可能以后会逐渐完善起来。第一次写博客,写的简单点。
				?
			
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
						 | packagecom.bob.config.mvc.mybatis;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/*** 实体类对应的列** @author jjb* @create 2017-09-08 14:42*/@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD, ElementType.METHOD})public@interfaceColumn {/*** 当前属性对应的列名** @return*/String value() default"";/*** 当前属性是不是表必须的** @return*/booleanrequired() defaulttrue;} | 
				?
			
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
						 | packagecom.bob.config.mvc.mybatis;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/*** 实体类对应的表** @author jjb* @create 2017-09-08 14:44*/@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})public@interfaceTable {String value() default"";/*** 当前表的主键** @return*/String key();} | 
				?
			
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
 
								30
 
								31
 
								32
 
								33
 
								34
 
								35
 
								36
 
								37
 
								38
 
								39
 
								40
 
								41
 
								42
 
								43
 
								44
 
								45
 
								46
 
								47
						 | packagecom.bob.config.mvc.mybatis;importorg.apache.ibatis.annotations.DeleteProvider;importorg.apache.ibatis.annotations.InsertProvider;importorg.apache.ibatis.annotations.Options;importorg.apache.ibatis.annotations.SelectProvider;importorg.apache.ibatis.annotations.UpdateProvider;/*** Mybatis基础Mapper** @author jjb* @create 2017-09-08 14:37*/publicinterfaceBaseMapper<T> {/*** 插入语句** @param bean* @return*/@Options(useGeneratedKeys = true)@InsertProvider(type = SqlProvider.class, method = "insert")publicintinsert(T bean);/*** 删除语句** @param bean* @return*/@DeleteProvider(type = SqlProvider.class, method = "delete")publicintdelete(T bean);/*** 更新语句** @param bean* @return*/@UpdateProvider(type = SqlProvider.class, method = "update")publicintupdate(T bean);/*** 查找语句** @param bean* @return*/@SelectProvider(type = SqlProvider.class, method = "select")publicT findFirst(T bean);} | 
				?
			
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
 
								30
 
								31
 
								32
 
								33
 
								34
 
								35
 
								36
 
								37
 
								38
 
								39
 
								40
 
								41
 
								42
 
								43
 
								44
 
								45
 
								46
 
								47
 
								48
 
								49
 
								50
 
								51
						 | packagecom.bob.config.mvc.mybatis;importjava.time.LocalDate;/*** Mybatis实体类** @author jjb* @create 2017-09-08 17:16*/@Table(key = "id")publicclassMybatisEntity {@Column()privateString id;@Column("USER_NAME")privateString name;@Column()privateInteger age;privateLocalDate date;@Column("ADRESS_NUMBER")privateInteger userAdressNumber;publicString getId() {returnid;}publicvoidsetId(String id) {this.id = id;}publicString getName() {returnname;}publicvoidsetName(String name) {this.name = name;}publicInteger getAge() {returnage;}publicvoidsetAge(Integer age) {this.age = age;}@Column("CUR_DATE")publicLocalDate getDate() {returndate;}publicvoidsetDate(LocalDate date) {this.date = date;}publicInteger getUserAdressNumber() {returnuserAdressNumber;}publicvoidsetUserAdressNumber(Integer userAdressNumber) {this.userAdressNumber = userAdressNumber;}} | 
				?
			
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
 
								30
 
								31
 
								32
 
								33
 
								34
 
								35
 
								36
 
								37
 
								38
 
								39
 
								40
 
								41
 
								42
 
								43
 
								44
 
								45
						 | packagecom.bob.config.mvc.mybatis;importjava.lang.reflect.Field;importjava.util.Map;/*** 表到实体的格式化器** @author jjb* @create 2017-09-08 14:51*/publicinterfaceTableFormatter {/*** 根据属性获取字段名称** @param field* @return*/publicString getColumnName(Field field);/*** 获取主键属性对应的列名** @return*/publicString getKeyColumnName(Class<?> clazz);/*** 获取主键的属性名称** @param clazz* @return*/publicString getKeyFiledName(Class<?> clazz);/*** 根据类获取表名称** @param clazz* @return*/publicString getTableName(Class<?> clazz);/*** 获取一个类的所有属性的映射信息** @param clazz* @return*/publicMap<Field, String> getFieldMappings(Class<?> clazz);} | 
				?
			
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
 
								30
 
								31
 
								32
 
								33
 
								34
 
								35
 
								36
 
								37
 
								38
 
								39
 
								40
 
								41
 
								42
 
								43
 
								44
 
								45
 
								46
 
								47
 
								48
 
								49
 
								50
 
								51
 
								52
 
								53
 
								54
 
								55
 
								56
 
								57
 
								58
 
								59
 
								60
 
								61
 
								62
 
								63
 
								64
 
								65
 
								66
 
								67
 
								68
 
								69
 
								70
 
								71
 
								72
 
								73
 
								74
 
								75
 
								76
 
								77
 
								78
 
								79
 
								80
 
								81
 
								82
 
								83
 
								84
 
								85
 
								86
 
								87
 
								88
 
								89
 
								90
 
								91
 
								92
 
								93
 
								94
 
								95
 
								96
 
								97
 
								98
 
								99
 
								100
 
								101
 
								102
 
								103
 
								104
 
								105
 
								106
 
								107
 
								108
 
								109
 
								110
 
								111
 
								112
 
								113
 
								114
 
								115
 
								116
 
								117
 
								118
 
								119
 
								120
 
								121
 
								122
 
								123
 
								124
 
								125
 
								126
 
								127
 
								128
 
								129
 
								130
 
								131
 
								132
 
								133
 
								134
 
								135
 
								136
 
								137
 
								138
 
								139
 
								140
 
								141
 
								142
 
								143
 
								144
 
								145
 
								146
 
								147
 
								148
 
								149
 
								150
 
								151
 
								152
 
								153
 
								154
 
								155
 
								156
 
								157
 
								158
 
								159
 
								160
 
								161
 
								162
 
								163
 
								164
 
								165
 
								166
 
								167
 
								168
 
								169
 
								170
 
								171
 
								172
 
								173
 
								174
 
								175
 
								176
 
								177
 
								178
 
								179
 
								180
 
								181
 
								182
 
								183
 
								184
 
								185
 
								186
 
								187
 
								188
 
								189
 
								190
						 | packagecom.bob.config.mvc.mybatis;importjava.lang.reflect.Field;importjava.lang.reflect.Modifier;importjava.util.HashMap;importjava.util.Map;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.BeanUtils;importorg.springframework.stereotype.Component;importorg.springframework.util.Assert;importorg.springframework.util.ReflectionUtils;importorg.springframework.util.StringUtils;/*** 依据驼峰原则来将表的信息格式化为实体类的信息,在驼峰处改小写同时插入下划线** @author jjb* @create 2017-09-08 14:55*/@ComponentpublicclassHumpToUnderLineFormatter implementsTableFormatter {privatestaticfinalLogger LOGGER = LoggerFactory.getLogger(HumpToUnderLineFormatter.class);privatestaticfinalMap<Class<?>, Map<Field, String>> FIELD_TO_COLUMN_MAPPINGS = newHashMap<Class<?>, Map<Field, String>>();privatestaticfinalMap<Class, String> CLASS_TO_TABLE_MAPPING = newHashMap<Class, String>();privatestaticfinalStringBuilder SB = newStringBuilder();privatestaticfinalObject LOCK = newObject();@OverridepublicString getColumnName(Field field) {Assert.notNull(field, "属性不能为空");Map<Field, String> mappings = FIELD_TO_COLUMN_MAPPINGS.get(field.getDeclaringClass());if(mappings == null) {synchronized(LOCK) {mappings = FIELD_TO_COLUMN_MAPPINGS.get(field.getDeclaringClass());if(mappings == null) {mappings = buildMapping(field.getDeclaringClass());}}}returnmappings.get(field);}@OverridepublicString getKeyColumnName(Class<?> clazz) {Table table = checkClass(clazz);returngetColumnName(ReflectionUtils.findField(clazz,table.key()));}@OverridepublicString getKeyFiledName(Class<?> clazz) {Table table = checkClass(clazz);Field field = ReflectionUtils.findField(clazz,table.key());Assert.state(field != null,"@Table的key()指定的属性必须存在");returnfield.getName();}privateTable checkClass(Class<?> clazz){Assert.isTrue(clazz != null, "与Table对应的Class不能为空");Table table = clazz.getAnnotation(Table.class);Assert.isTrue(table != null&& StringUtils.hasText(table.key()),"["+clazz.getName()+"]必须标识@Table注解且key()不能为空");returntable;}@OverridepublicString getTableName(Class<?> clazz) {Assert.notNull(clazz, "类不能为空");Assert.isTrue(clazz.isAnnotationPresent(Table.class), "["+ clazz.getName() + "]类上必须含有@Table注解");String name = CLASS_TO_TABLE_MAPPING.get(clazz);if(name == null) {synchronized(LOCK) {name = CLASS_TO_TABLE_MAPPING.get(clazz);if(name == null) {buildMapping(clazz);}}}returnCLASS_TO_TABLE_MAPPING.get(clazz);}@OverridepublicMap<Field, String> getFieldMappings(Class<?> clazz) {Assert.isTrue(clazz != null&& clazz.isAnnotationPresent(Table.class), "与Table对应的Class不能为空且必须标识@Table注解");Map<Field, String> mappings = FIELD_TO_COLUMN_MAPPINGS.get(clazz);if(mappings == null) {synchronized(LOCK) {mappings = FIELD_TO_COLUMN_MAPPINGS.get(clazz);if(mappings == null) {mappings = buildMapping(clazz);}}}returnFIELD_TO_COLUMN_MAPPINGS.get(clazz);}/*** 创建实体到表映射** @param clazz*/privateMap<Field, String> buildMapping(Class<?> clazz) {buildClassToTableMapping(clazz);Map<Field, String> mappings = newHashMap<Field, String>();FIELD_TO_COLUMN_MAPPINGS.put(clazz, mappings);buildFiledToColumnMapping(clazz, mappings);buildFiledToColumnMappingWithGetter(clazz, mappings);returnmappings;}/*** 创建类名到表名的名称映射** @param clazz*/privatevoidbuildClassToTableMapping(Class<?> clazz) {Table table = clazz.getAnnotation(Table.class);Assert.notNull(table, "["+ clazz.getName() + "]类上必须有@Table注解");CLASS_TO_TABLE_MAPPING.put(clazz, StringUtils.hasText(table.value()) ? table.value() : doFormatWithHunmRule(clazz.getSimpleName()));}/*** 通过Filed建立属性名称到字段名称的映射** @param clazz* @param mappings*/privatevoidbuildFiledToColumnMapping(Class<?> clazz, Map<Field, String> mappings) {ReflectionUtils.doWithLocalFields(clazz, (field) -> {Column column = field.getAnnotation(Column.class);if(column != null) {if(Modifier.isStatic(field.getModifiers())) {LOGGER.error("[{}]注解不适用于静态方法:[{}]", Column.class.toString(), field);return;}mappings.put(field, StringUtils.hasText(column.value()) ? column.value() : doFormatWithHunmRule(field.getName()));}});}/*** 通过getter()建立属性名称到字段名称的映射** @param clazz* @param mappings*/privatevoidbuildFiledToColumnMappingWithGetter(Class<?> clazz, Map<Field, String> mappings) {ReflectionUtils.doWithLocalMethods(clazz, (method) -> {Column column = method.getAnnotation(Column.class);if(column != null) {if(Modifier.isStatic(method.getModifiers())) {LOGGER.warn("[{}]注解不适用于静态方法: [{}]", Column.class.toString(), method);return;}if(!method.getName().startsWith("get") || method.getParameterTypes().length > 0) {LOGGER.warn("[{}]注解只适用于getter方法,而非: [{}]方法", Column.class.toString(), method);return;}String fieldName = BeanUtils.findPropertyForMethod(method).getName();mappings.put(ReflectionUtils.findField(clazz, fieldName),StringUtils.hasText(column.value()) ? column.value() : doFormatWithHunmRule(fieldName));}});}/*** 依据驼峰原则格式化属性或者类名称,在驼峰处改小写同时前一位插入下划线,忽略首字母** @param name* @return*/privatestaticString doFormatWithHunmRule(String name) {Assert.hasText(name, "属性或者类名称不能为空");SB.delete(0, SB.length());SB.append(toUpperCase(name.charAt(0)));for(inti = 1; i < name.length(); i++) {if(isUpperCase(name.charAt(i))) {SB.append("_");}SB.append(toUpperCase(name.charAt(i)));}returnSB.toString();}/*** 将字符转换为大写** @param ch* @return*/privatestaticchartoUpperCase(charch) {returnCharacter.toUpperCase(ch);}/*** 判断是否为大写** @param ch* @return*/privatestaticbooleanisUpperCase(charch) {returnCharacter.isUpperCase(ch);}} | 
				?
			
                	
    
	
	
		
		
	
 
	
		
			
	
	 
     
	
			
                 
			
		
		
			
			
			
    
        
        
	
			
						
			
            			
    		
    		
		
	    
    	
    	
        
    	
    
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
 
								30
 
								31
 
								32
 
								33
 
								34
 
								35
 
								36
 
								37
 
								38
 
								39
 
								40
 
								41
 
								42
 
								43
 
								44
 
								45
 
								46
 
								47
 
								48
 
								49
 
								50
 
								51
 
								52
 
								53
 
								54
 
								55
 
								56
 
								57
 
								58
 
								59
 
								60
 
								61
 
								62
 
								63
 
								64
 
								65
 
								66
 
								67
 
								68
 
								69
 
								70
 
								71
 
								72
 
								73
 
								74
 
								75
 
								76
 
								77
 
								78
 
								79
 
								80
 
								81
 
								82
 
								83
 
								84
 
								85
 
								86
 
								87
 
								88
 
								89
 
								90
 
								91
 
								92
 
								93
 
								94
 
								95
 
								96
 
								97
 
								98
 
								99
 
								100
 
								101
 
								102
 
								103
 
								104
 
								105
 
								106
 
								107
 
								108
 
								109
 
								110
 
								111
 
								112
 
								113
 
								114
 
								115
 
								116
 
								117
 
								118
 
								119
 
								120
 
								121
 
								122
 
								123
 
								124
 
								125
 
								126
 
								127
 
								128
 
								129
 
								130
 
								131
 
								132
 
								133
 
								134
 
								135
 
								136
 
								137
 
								138
 
								139
 
								140
						 | packagecom.bob.config.mvc.mybatis;importjava.lang.reflect.Field;importjava.util.ArrayList;importjava.util.List;importjava.util.Map.Entry;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.util.StringUtils;/*** Mybatis的SQL语句供应器** @author jjb* @create 2017-09-08 14:37*/publicclassSqlProvider {privatestaticfinalLogger LOGGER = LoggerFactory.getLogger(SqlProvider.class);privateTableFormatter tableFormat = newHumpToUnderLineFormatter();/*** 根据Bean对象生成插入SQL语句** @param bean* @return*/publicString insert(Object bean) {Class<?> beanClass = bean.getClass();String tableName = tableFormat.getTableName(beanClass);StringBuilder insertSql = newStringBuilder();List<String> columns = newArrayList<String>();List<String> values = newArrayList<String>();insertSql.append("INSERT INTO ").append(tableName).append("(");try{for(Entry<Field, String> entry : tableFormat.getFieldMappings(beanClass).entrySet()) {Field field = entry.getKey();field.setAccessible(true);if(field.get(bean) != null) {columns.add(entry.getValue());values.add("#{"+ field.getName() + "}");}}} catch(Exception e) {newRuntimeException("get insert sql has exceptoin:"+ e);}intcolumnSize = columns.size();for(inti = 0; i < columnSize; i++) {insertSql.append(columns.get(i));insertSql.append(i != columnSize - 1? ",": ") VALUES(");}for(inti = 0; i < columnSize; i++) {insertSql.append(values.get(i));insertSql.append(i != columnSize - 1? ",": ")");}returninsertSql.toString();}/*** 根据Bean对象生成更新SQL语句** @param bean* @return*/publicString update(Object bean) {Class<?> beanClass = bean.getClass();String tableName = tableFormat.getTableName(beanClass);StringBuilder updateSql = newStringBuilder();updateSql.append(" UPDATE ").append(tableName).append(" SET ");try{for(Entry<Field, String> entry : tableFormat.getFieldMappings(beanClass).entrySet()) {Field field = entry.getKey();field.setAccessible(true);if(field.get(bean) != null) {updateSql.append(entry.getValue()).append("=#{").append(field.getName()).append("},");}}updateSql.deleteCharAt(updateSql.length() - 1);} catch(Exception e) {newRuntimeException("get update sql is exceptoin:"+ e);}updateSql.append(" WHERE ").append(tableFormat.getKeyColumnName(beanClass) + " =#{"+ tableFormat.getKeyFiledName(beanClass) + "}");returnupdateSql.toString();}/*** 根据Bean对象生成删除SQL语句** @param bean* @return*/publicString delete(Object bean) {Class<?> beanClass = bean.getClass();String tableName = tableFormat.getTableName(beanClass);StringBuilder deleteSql = newStringBuilder();deleteSql.append(" DELETE FROM ").append(tableName).append(" WHERE ");try{for(Entry<Field, String> entry : tableFormat.getFieldMappings(beanClass).entrySet()) {Field field = entry.getKey();field.setAccessible(true);if(field.get(bean) != null) {deleteSql.append(entry.getValue()).append("=#{").append(field.getName()).append("} AND ");}}deleteSql.delete(deleteSql.length() - 5, deleteSql.length() - 1);} catch(Exception e) {newRuntimeException("get delete sql is exceptoin:"+ e);}returndeleteSql.toString();}/*** 生成查询SQL语句** @param bean* @return*/publicString select(Object bean) {Class<?> beanClass = bean.getClass();String tableName = tableFormat.getTableName(beanClass);StringBuilder selectSql = newStringBuilder();List<String> columns = newArrayList<String>();List<String> values = newArrayList<String>();selectSql.append("SELECT ");try{for(Entry<Field, String> entry : tableFormat.getFieldMappings(beanClass).entrySet()) {Field field = entry.getKey();field.setAccessible(true);selectSql.append(entry.getValue() + ",");if(field.get(bean) != null) {columns.add(entry.getValue());values.add("#{"+ field.getName() + "}");}}selectSql.deleteCharAt(selectSql.length() - 1);} catch(Exception e) {newRuntimeException("get select sql is exceptoin:"+ e);}selectSql.append(" FROM ").append(tableName).append(" WHERE ");intcolumnSize = columns.size();for(inti = 0; i < columnSize; i++) {selectSql.append(columns.get(i)).append("=").append(values.get(i)).append(" AND ");}selectSql.delete(selectSql.length() - 5, selectSql.length() - 1);returnselectSql.toString();}} | 
				?
			
	
						
						
						
						
						
						
						
																		
    
        
    
        
                        
                
                    
                
                
                
                    
                
                
                
                    
                
                
                
                    
                
                        
    
 																		
						
																		
    
        
 												
						
																		
	
	
		
				
			
																		
						
						
					
				
				                | 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
 
								30
 
								31
 
								32
 
								33
 
								34
 
								35
 
								36
 
								37
 
								38
 
								39
 
								40
 
								41
 
								42
 
								43
 
								44
 
								45
 
								46
						 | packagecom.bob.test.concrete.mysqlGenerate;importjava.time.LocalDate;importcom.bob.config.mvc.mybatis.MybatisEntity;importcom.bob.config.mvc.mybatis.SqlProvider;importorg.junit.Before;importorg.junit.Test;/*** Mysql基于注解形式的sql语句生成测试** @author jjb* @create 2017-09-11 11:10*/publicclassMysqlGenerateTest {privateSqlProvider sqlProvider;privateMybatisEntity mybatisEntity;@BeforepublicvoiddoBefore(){sqlProvider = newSqlProvider();mybatisEntity = newMybatisEntity();mybatisEntity.setId("0015415");mybatisEntity.setName("lanboal");mybatisEntity.setAge(28);mybatisEntity.setDate(LocalDate.now());mybatisEntity.setUserAdressNumber(24);}@TestpublicvoidtestInsert(){String sql = sqlProvider.insert(mybatisEntity);System.out.println(sql);}@TestpublicvoidtestUpdate(){String sql = sqlProvider.update(mybatisEntity);System.out.println(sql);}@TestpublicvoidtestDelete(){String sql = sqlProvider.delete(mybatisEntity);System.out.println(sql);}@TestpublicvoidtestSelect(){String sql = sqlProvider.select(mybatisEntity);System.out.println(sql);}} | 
总结
以上所述是小编给大家介绍的 Mybatis基于注解形式的sql语句生成实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对快网idc网站的支持!
原文链接:http://blog.csdn.net/longdayu4544/article/details/77931795
相关文章
             猜你喜欢
        
        - 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
			TA的动态
			
		
				- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
				您的支持,是我们最大的动力!				
			
		
        热门文章
        
    
    - 
            2025-05-24 98
- 
            2025-05-29 36
- 
            2025-05-29 37
- 
            2025-05-29 94
- 
            2025-05-29 20
		热门评论
	
	 
        
 
    		 
            	 
															 
         
         
        
 
                        