自己手动实现的前提,对maven项目有基本的了解,在本地成功搭建了maven环境,可以参考我之前的文章:maven环境搭建

项目里新建表时model,mapper以及mapper.xml基本都是用Mybatis Generator(以下简称为MBG)自动生成的,但是MBG自动生成的model的注释实在有点非人类,至少中国人是完全接受不了的,在配置中禁用掉注释吧,倒是简单了,可是生成的model类光秃秃的,啥都没有,字段方法没有注释,使用很不方便,别人看也不知道这个字段是啥含义,到最后还是要自己添加,一张表多点几十个字段,特么添加累死了,不能这么干,得想法子,百度了一下网上,基本有两种方法,第一种,就是直接修改MGB的源代码,第二种就是自己写一个类实现CommentGenerator接口,先说自己写一个新类实现CommentGenerator接口的方法来使自动生成的model类含有中文注释吧.

  • 1.首先新建一个maven项目,请选择一个简单的maven项目:或者在选择的时候直接选择create a simple project.

  • 2,右键项目->build path->config build path...->Libraries,修改jdk为你工作空间的默认jdk,然后右键项目->new->source folder,输入src/main/resources,建好resources目录,如果已经建好就直接跳过.这里最好不要忘记,否则有的时候建立默认jdk是1.5的,运行可能会有莫名其妙的问题.
  • 3 因为是要写一个类实现CommentGenerator接口,所以先在项目中引入mybatis-generator-core的jar包 在pom.xml中添加依赖, 这里统一使用1.3.2版本.为了不用每次使用都要使用者自己指定ojdbc6.jar位置,直接将其引入到项目中,这里要使用该引入,需要先将jar包安装到本地maven仓库中,否则这里这样引入会报错的,怎么安装可以参考这篇文章:

    maven手动安装jar包到本地仓库,以ojdbc6为例,

   同时为了支持mysql,也一起加入mysql的驱动包,mysql的驱动包不用手动安装,直接引入就会自动下载的

<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
     <groupId>com.oracle</groupId>
     <artifactId>ojdbc6</artifactId>
     <version>6.0</version>
</dependency>
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.9</version>
</dependency>
  • 4 在源代码中新建一个类MyCommentGenerator,实现CommentGenerator接口,类的代码如下:
package org.mybatis.generator;

import static org.mybatis.generator.internal.util.StringUtility.isTrue;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties; import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.InnerClass;
import org.mybatis.generator.api.dom.java.InnerEnum;
import org.mybatis.generator.api.dom.java.JavaElement;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.MergeConstants;
import org.mybatis.generator.config.PropertyRegistry; /**
* 描述:
* @since 1.9.10
* @version 1.9.10
* @作者:niexiaohui
* @创建时间:2016年11月22日
* @修改记录:
*/
public class MyCommentGenerator implements CommentGenerator{
private Properties properties;
private Properties systemPro;
private boolean suppressDate;
private boolean suppressAllComments;
private String currentDateStr; public MyCommentGenerator() {
super();
properties = new Properties();
systemPro = System.getProperties();
suppressDate = false;
suppressAllComments = false;
currentDateStr = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date());
} public void addJavaFileComment(CompilationUnit compilationUnit) {
// add no file level comments by default
return;
} /**
* Adds a suitable comment to warn users that the element was generated, and
* when it was generated.
*/
public void addComment(XmlElement xmlElement) {
return;
} public void addRootComment(XmlElement rootElement) {
// add no document level comments by default
return;
} public void addConfigurationProperties(Properties properties) {
this.properties.putAll(properties); suppressDate = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE)); suppressAllComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
} /**
* This method adds the custom javadoc tag for. You may do nothing if you do
* not wish to include the Javadoc tag - however, if you do not include the
* Javadoc tag then the Java merge capability of the eclipse plugin will
* break.
*
* @param javaElement
* the java element
*/
protected void addJavadocTag(JavaElement javaElement, boolean markAsDoNotDelete) {
javaElement.addJavaDocLine(" *");
StringBuilder sb = new StringBuilder();
sb.append(" * ");
sb.append(MergeConstants.NEW_ELEMENT_TAG);
if (markAsDoNotDelete) {
sb.append(" do_not_delete_during_merge");
}
String s = getDateString();
if (s != null) {
sb.append(' ');
sb.append(s);
}
javaElement.addJavaDocLine(sb.toString());
} /**
* This method returns a formated date string to include in the Javadoc tag
* and XML comments. You may return null if you do not want the date in
* these documentation elements.
*
* @return a string representing the current timestamp, or null
*/
protected String getDateString() {
String result = null;
if (!suppressDate) {
result = currentDateStr;
}
return result;
} public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
if (suppressAllComments) {
return;
}
StringBuilder sb = new StringBuilder();
innerClass.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedTable.getFullyQualifiedTable());
sb.append(" ");
sb.append(getDateString());
innerClass.addJavaDocLine(sb.toString().replace("\n", " "));
innerClass.addJavaDocLine(" */");
} public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
if (suppressAllComments) {
return;
}
StringBuilder sb = new StringBuilder();
innerEnum.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedTable.getFullyQualifiedTable());
innerEnum.addJavaDocLine(sb.toString().replace("\n", " "));
innerEnum.addJavaDocLine(" */");
} public void addFieldComment(Field field, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
if (suppressAllComments) {
return;
}
StringBuilder sb = new StringBuilder();
field.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedColumn.getRemarks());
field.addJavaDocLine(sb.toString().replace("\n", " "));
field.addJavaDocLine(" */");
} public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
if (suppressAllComments) {
return;
}
StringBuilder sb = new StringBuilder();
field.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedTable.getFullyQualifiedTable());
field.addJavaDocLine(sb.toString().replace("\n", " "));
field.addJavaDocLine(" */");
} public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
if (suppressAllComments) {
return;
}
method.addJavaDocLine("/**");
addJavadocTag(method, false);
method.addJavaDocLine(" */");
} public void addGetterComment(Method method, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
if (suppressAllComments) {
return;
}
method.addJavaDocLine("/**");
StringBuilder sb = new StringBuilder();
sb.append(" * ");
sb.append(introspectedColumn.getRemarks());
method.addJavaDocLine(sb.toString().replace("\n", " "));
sb.setLength(0);
sb.append(" * @return ");
sb.append(introspectedColumn.getActualColumnName());
sb.append(" ");
sb.append(introspectedColumn.getRemarks());
method.addJavaDocLine(sb.toString().replace("\n", " "));
method.addJavaDocLine(" */");
} public void addSetterComment(Method method, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
if (suppressAllComments) {
return;
}
method.addJavaDocLine("/**");
StringBuilder sb = new StringBuilder();
sb.append(" * ");
sb.append(introspectedColumn.getRemarks());
method.addJavaDocLine(sb.toString().replace("\n", " "));
Parameter parm = method.getParameters().get(0);
sb.setLength(0);
sb.append(" * @param ");
sb.append(parm.getName());
sb.append(" ");
sb.append(introspectedColumn.getRemarks());
method.addJavaDocLine(sb.toString().replace("\n", " "));
method.addJavaDocLine(" */");
} public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
if (suppressAllComments) {
return;
}
StringBuilder sb = new StringBuilder();
innerClass.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedTable.getFullyQualifiedTable());
innerClass.addJavaDocLine(sb.toString().replace("\n", " "));
sb.setLength(0);
sb.append(" * @author ");
sb.append(systemPro.getProperty("user.name"));
sb.append(" ");
sb.append(currentDateStr);
innerClass.addJavaDocLine(" */");
}
}
  • 5.再新建一个类StartUp,用于运行项目,类的代码如下:
package org.mybatis.generator;

import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback; /**
* 描述:
* @since 1.9.10
* @version 1.9.10
* @作者:niexiaohui
* @创建时间:2016年11月22日
* @修改记录:
*/
public class StartUp {
public static void main(String[] args) throws URISyntaxException {
try {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (InvalidConfigurationException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
}
}
}
  • 6. 然后将generatorConfig.xml放入resources目录下,generatorConfig.xml内容如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration>
<!-- ojdbc6.jar已经直接放到项目中,无需指定了,同时mysql驱动包也一样,这里同样无需指定 -->
<!-- <classPathEntry location="ojdbc6.jar" /> -->
<context id="context1" targetRuntime="MyBatis3">
<!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 这里的type里写的是你的实现类的类全路径 -->
<commentGenerator type="org.mybatis.generator.MyCommentGenerator">
</commentGenerator> <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@远程ip地址或localhost:1521:orcl" userId="用户名"
password="密码">
<!-- 针对oracle数据库 -->
<property name="remarksReporting" value="true"></property>
</jdbcConnection>
    
     <!-- mysql配置 -->
        <!--   <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                  connectionURL="jdbc:mysql://localhost:3306/bookshop" userId="root"
                  password="root">
                    针对mysql数据库
                    <property name="useInformationSchema" value="true"></property>
          </jdbcConnection> -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver> <!-- dto class -->
<javaModelGenerator targetPackage="model"
targetProject="C:\Users\Administrator\Desktop">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator> <!-- mybatis xml file -->
<sqlMapGenerator targetPackage="dao"
targetProject="C:\Users\Administrator\Desktop">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator> <!-- mapper class -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="dao" targetProject="C:\Users\Administrator\Desktop">
<property name="enableSubPackages" value="true" />
</javaClientGenerator> <!--不生成帮助类(Exmaples) -->
<!-- enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false" -->
<!--已生成的表 <table schema="demo" tableName="USER" domainObjectName="User"></table> -->
<table schema="" tableName="ABS_DEAL" domainObjectName="AbsDeal"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
</table> </context>
</generatorConfiguration>

到此为止项目的结构如下:

这个时候我们运行StartUp的main方法,已经可以实现了,发现桌面上生成了两个文件夹,model和mapper文件夹,里面有生成的文件.看一下效果:

是不是很符合中国人的审美观呢,如果不满意,或者有什么要加的,可以自己在实现类中加入代码修改,addFieldComment,addGetterComment,addSetterComment这几个方法就行了,里面的代码也很容易看懂,很容易改.

  • 6.到此为止虽然已经生成成功了,但是事情还不算完,不能要求每个人都从无到有搞这么一个项目,所以要把它打成一个可以运行的jar包才行.这里要使依赖包被打包到最后的jar包中,要在pom.xml中进行相应的配置,这里给出全部的pom.xml的代码:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.mybatis</groupId>
<artifactId>mygenerator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>mygenerator</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>6.0</version>
</dependency>
</dependencies> <build>
<!-- 这里指定最终生成的jar包的名字,为了盗版到底,直接使用原先的名称,嘿嘿 -->
<finalName>mybatis-generator-core-1.3.2</finalName>
<plugins>
<plugin>
<!-- 因为项目中使用了依赖包,所以要使用maven-assembly-plugin来构建,会把依赖包同时打进jar包中 -->
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- 这里不指定为false打包会生成两个jar包,我们要用的那个jar包命名很乱,后面加了
jar-with-dependencies,不喜欢,直接禁用掉 -->
<appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<!-- 指定main方法的类的全路径 否则运行会报找不到main class的错误-->
<mainClass>org.mybatis.generator.StartUp</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>

到这里项目就完成了,在项目根路径使用打包命令mvn clean package,当然可以在eclipse中使用maven build中输入命令来生成,我习惯使用控制台来生成,在项目根路径,按住shift的同时右键,选择在此处打开命令窗口,然后输入mvn clean package命令按下enter,当然这些可以实现的前提是你本地maven环境配置好了,如果没有设置maven_home环境变量的话运行会提示无法识别的mvn命令的,成功构建后显示build success,到target目录下,看到生成了jar包:

同样在target目录下:按住shift同时右键->在此处打开命令行,输入java -jar mybatis-generator-core-1.3.2.jar命令运行jar包,注意-jar后打出my时按tab键mybatis-generator-core-1.3.2.jar就自动补全了,运行结束后,同样的在桌面上回看到生成的model和mapper文件夹及里面的文件.这里是测试,所以配置中写文件生成在了桌面上,可以改一下配置,设置在项目中输出,直接输出到项目中.

当然为了使用方便,不用每次都输入java -jar mybatis-generator-core-1.3.2.jar命令,可以把命令放入脚本文件中,新建一个记事本,重命名为generator.bat,然后把java -jar mybatis-generator-core-1.3.2.jar命令拷贝进去,以后只要双击generator.bat就可以直接生成了,当然你的generator.bat得和jar包在同一个目录下.

还有要修改generatorConfig.xml文件可以使用压缩软件打开mybatis-generator-core-1.3.2.jar,双击generatorConfig.xml,修改后保存并更新回压缩包.因为这里StartUp文件中使用的是加载generatorConfig.xml的方法,所以会加载jar包里的generatorConfig.xml配置文件,如果StartUp文件中加载配置文件的方式使用MBG原生态的加载方式,就可以使用jar包同目录下的generatorConfig.xml,不过那时运行命令就为:java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite,我觉得这样挺好的,不用每次都拖着一个generatorConfig.xml,移动都不方便,放在jar包里跟着跑挺方便的.

抱歉,使用了才知道,generatorConfig.xml放在jar包里似乎生成到项目里不好配置,只能写绝对路径,相对路径好像不好弄,可以稍微修改一下,用MBG原来的加载外部的generatorConfig.xml,只需要修改pom.xml的构建中的main class节点由startup改为org.mybatis.generator.api.ShellRunner然后重新打包,运行jar包时命令为

java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite,以下提供的下载更新为使用ShellRunner运行的.如果使用ShellRunner运行,则之前的startup可以删除了,项目resource目录下的generatorConfig.xml也不需要了,直接使用外部的generatorConfig.xml.

生成的jar包下载:  MybatisGenerator

当然通过实现借口来实现还是有一定问题的,下一篇直接通过修改源代码来实现:

下一篇:Mybatis Generator的model生成中文注释,支持oracle和mysql(通过修改源码的方式来实现)

Mybatis Generator的model生成中文注释,支持oracle和mysql(通过实现CommentGenerator接口的方法来实现)的更多相关文章

  1. Mybatis Generator的model生成中文注释,支持oracle和mysql(通过修改源码的方式来实现)

    在看本篇之前,最好先看一下上一篇通过实现CommentGenerator接口的方法来实现中文注释的例子,因为很多操作和上一篇基本是一致的,所以本篇可能不那么详细. 首先说一下上篇通过实现Comment ...

  2. mybatis generator 使用教程(生成带注释的实体类)

    引言: 最近的一个项目,由于数据库表巨多,导致需要创建N多个java实体.dao.mapper.xml映射文件,如果均使用纯手工编写,无疑需要耗费大量时间和精力.于是上网学习了mybatis gene ...

  3. Eclipse 使用mybatis generator插件自动生成代码

    Eclipse 使用mybatis generator插件自动生成代码 标签: mybatis 2016-12-07 15:10 5247人阅读 评论(0) 收藏 举报 .embody{ paddin ...

  4. mybatis generator 生成中文注释

    mybatis generator默认生成 的注释太奇葩了,完全不能拿到生产去用,不过幸亏提供了接口可以自己扩展.长话短说,要生成如下的domain, package com.demo.domain; ...

  5. JAVA入门[7]-Mybatis generator(MBG)自动生成mybatis代码

    一.新建测试项目 新建Maven项目MybatisDemo2,修改pom.xml引入依赖.dependencies在上节基础上新增 <dependency> <groupId> ...

  6. Mybatis generator 数据库反向生成插件的使用

    直接上干货: 可生成数据库表对应的po  mpper接口文件 mapper.xml文件.文件中自动配置了部分常用的dao层方法.用于快速快发. 1.pom中引入插件: <plugin> & ...

  7. Mybatis Generator代码自动生成(实体类、dao层、映射文件)

    写了一段时间增删改查有点厌烦,自己找了下网上的例子鼓捣了下自动生成. 首先得有一个配置文件: generatorConfig.xml <?xml version="1.0" ...

  8. 使用Mybatis Generator插件自动生成映射文件(cmd无法进入文件,dns服务器对区域没有权威等问题)遇到问题

           使用Mybatis Genertor插件自动生MyBatis所需要的DAO接口,实体模型类,Mapping映射文件,将生成的代码赋值到项目工程中即可.     有命令行,Eclipse插 ...

  9. 使用eclipse插件mybatis generator来自动生成实体类及映射文件

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...

随机推荐

  1. 如何为 .NET Core CLI 启用 TAB 自动补全功能

    如何为 .NET Core CLI 启用 TAB 自动补全功能 Intro 在 Linux 下经常可以发现有些目录/文件名,以及有些工具可以命令输入几个字母之后按 TAB 自动补全,最近发现其实 do ...

  2. Git:八、Git自定义:忽略特殊文件&配置别名

    1..gitignore配置文件 1)防止加入Git或输入git status时显示,需要让Git忽略的文件: 程序编译生成的非原代码的文件 存放密码的文件 2)配置文件:.gitignore Git ...

  3. Docker 创建 Jira Core(Jira SoftWare) 7.12.3 中文版

    目录 目录 1.介绍 1.1.什么是 JIRA Core? 1.2.什么是 JIRA SoftWare 2.JIRA 的官网在哪里? 3.如何下载安装? 4.对 JIRA 进行配置 4.1.JIRA ...

  4. Windows WMIC命令使用详解(附实例)

    第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符.在WMIC命令行提示符上,命令以交互的方式执行 执行“wmic”命令启动WMIC命令行环境.这个命令可以在 ...

  5. 系统功能调用Windows操作系统原理实验

    一.实验目的 1.熟悉操作系统的系统功能调用. 2.掌握用C语言实现系统功能调用的方法和步骤. 3.掌握利用10H号功能调用(BIOS的显示I/O功能调用)来实现对屏幕的操作与控制. 二.实验内容 1 ...

  6. Windows系统资源监控

    1.windows自带系统资源监控工具 2.Windows监控的数据来源:Performance Counters 2.1 Performance Counter架构 2.2 Performance ...

  7. socketServer并发处理socket

    socketserver简单介绍 ''' socketserver:是对socket的封装,实现并发处理 前两个TCP,UDP常用,后两个不常用 ''' import socketserver soc ...

  8. git -分支管理(创建、推送、删除)

    分支创建并推送: 1.查看当前所有分支,当前分支前面会标出一个*号 git branch -a 2.新建分支 git branch android_O 3.切换到新分支 git checkout an ...

  9. TNS-12535/12606 and ORA-3136 on Connection to Database (Doc ID 2313573.1)

    今天遇到一问题 telnet 都是通的,但是两台数据库服务器还是无法 sqlplus 连接 ,最后发现 两台服务器的 mtu 值不同,其中一台为 1500 一台为9000, 以前只是认为 telnet ...

  10. UIImagePickerController - 官方文档说明

    使用UIImagePickerController对象的步骤: 1)验证设备是否能从目标源获取内容,通过调用 + (BOOL)isSourceTypeAvailable:(UIImagePickerC ...