发表于: 2017-11-29 22:44:08

1 618


今日完成的事情:

今日完成任务七的最后两个模块,数据从七牛云迁移到阿里云,从阿里云迁移到七牛云。

刚开始看接口文档的时候发现,两家都提供了可以迁移的工具:

上面是七牛云的,阿里也有。然后就想着用工具进行迁移,但是师兄告诉我,不能用这个方法,要用Java代码事先。

然后看了一下接口文档,发现,两家都提供了下载和上传的工具,就先想出了一个思路:

从阿里云把文件下载到本地,然后从本地把文件上传到七牛云,完成数据迁移。

但是师兄听了我的方案之后,直接否决了。理由很简单,要是程序部署到服务器,而且文件数量比较大,这种方法是行不通的。

然后在阿里云的接口文档中发现了这个:

上传网络流,刚开始看到的时候,不是很理解,然后百度了一波,和师兄讨论了一下。发现我昨天不知道是干什么用的外链在这里可以转换为流。而且网络上的资源都可以以流的形式进行上传和下载。而存储的时候只需要存储外链就可以了,今天终于是理解了。

然后有了思路就好办了。

首先是七牛云获取在七牛存储的所有文件的文件名称:

//获取文件信息
public List<String> getFile() {
List<String> keys=new ArrayList<String>();
   Zone z = Zone.autoZone();
   Configuration c = new Configuration(z);
   BucketManager bucketManager = new BucketManager(authCreate(), c);
   //文件名前缀
   String prefix = "";
   //每次迭代的长度限制,最大1000,推荐值 1000
   int limit = 1000;
   //指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
   String delimiter = "";
   //列举空间文件列表
   BucketManager.FileListIterator fileListIterator =
bucketManager.createFileListIterator(bucketname, prefix, limit, delimiter);
   while (fileListIterator.hasNext()) {
//处理获取的file list结果
       FileInfo[] items = fileListIterator.next();
       for (FileInfo item : items) {
keys.add(item.key);
       }
}
return keys;
}

然后把名称存在一个list里面,return回去。

然后是七牛下载,七牛下载下来直接就是外链:

public String  download(String fileName) throws UnsupportedEncodingException {
String domainOfBucket = "http://ozuqudaqr.bkt.clouddn.com/";
       String encodedFileName = URLEncoder.encode(fileName, "utf-8");
       String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
       //构造私有空间的需要生成的下载的链接
//        String URL = "http://ozuqudaqr.bkt.clouddn.com/c04-03.jpg";
       //调用privateDownloadUrl方法生成下载链接,第二个参数可以设置Token的过期时间
       String downloadRUL = authCreate().privateDownloadUrl(publicUrl, 3600);
       return downloadRUL;
   }

这个下载是提供文件名称,就可以下载外链,把上面获取的所有文件名称直接传到这个方法,就可以拿到所有文件按的外链。然后把外链提过给阿里上传:

public void uploadStream(String urlStr,String key) throws IOException {
DownLoadFromUrl downLoadFromUrl=new DownLoadFromUrl();
   InputStream inputStream=downLoadFromUrl.streamForUrl(urlStr);
   initOssClient().putObject("task0",key, inputStream);
   initOssClient().shutdown();
}

urlStr是外链名称,key是存储到阿里云的文件名称,最后七牛上传到阿里的接口:

//七牛迁移到阿里
@RequestMapping(value = "/qiniutoali",method = RequestMethod.GET)
@ResponseBody
public String aliToqiniu() throws IOException {
List<String> keys=qiniuDemo.getFile();
   for(String key:keys){
String url=qiniuDemo.download(key);
       aliDemo.uploadStream(url,key);
   }
return "success";
}

然后反过来是阿里云下载上传到七牛云,在这里阿里是直接下载文件,阿里的下载外链是自己拼接的url,其实都是一个道理,上代码,首先获取阿里云存储的所有文件名称:

public List<String> getFile(){
List<String> keys=new ArrayList<String>();
   // 列举Object
   ObjectListing objectListing = initOssClient().listObjects(bucketName, "");
   List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
   for (OSSObjectSummary s : sums) {
keys.add(s.getKey());
   }
// 关闭client
   initOssClient().shutdown();
   return keys;
}

然后根据这些文件名称拼接可供下载的外链:

public URL getUrl(String key){
String bucketName = "task0";
   // 设置URL过期时间为1小时
   Date expiration = new Date(new Date().getTime() + 3600 * 1000);
   // 生成URL
   URL url = initOssClient().generatePresignedUrl(bucketName, key, expiration);
   return url;
}

传入文件名,拼接url,然后再把url返回,七牛云根据这些外链,进行上传:

//stream的方式上传到空间
public void uploadStream(String remoteSrcUrl,String key){
Zone z = Zone.autoZone();
   Configuration c = new Configuration(z);
   BucketManager bucketManager = new BucketManager(authCreate(), c);
   //抓取网络资源到空间
   try {
FetchRet fetchRet = bucketManager.fetch(remoteSrcUrl, bucketname, key);
   } catch (QiniuException ex) {
System.err.println(ex.response.toString());
   }
}

remoteStrUrl是外链,key是存储到七牛云的文件名称,最后阿里云迁移到七牛云的接口:

//阿里迁移到七牛
@RequestMapping(value = "/alitoqiniu",method = RequestMethod.GET)
@ResponseBody
public String qiniuToali(){
List<String> keys=aliDemo.getFile();
   for(String key:keys){
URL url=aliDemo.getUrl(key);
       qiniuDemo.uploadStream(url.toString(),key);
   }
return "success";
}

两个接口完成,然后跟着韦杰师兄学习了一波代码的规范:

if里面最多三个嵌套,接口只返回给前台json数据,和一些状态信息。

然后还学习了一波动态sql(以前这部分内容没有学习,今天补回来):

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。

动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

这些是官方文档里面的话,然后是自己的xml文件更改成下面:

<update id="updateUser" parameterType="com.mmy.model.User">
   update users
<set>
       <if test="name != null">name=#{name},</if>
       <if test="passWord != null">pass_word=#{passWord},</if>
       <if test="salt != null">salt=#{salt},</if>
       <if test="phone != null">phone=#{phone},</if>
       <if test="mail != null">mail=#{mail},</if>
       <if test="head != null">head=#{head},</if>
       <if test="createUser != null">create_user=#{createUser},</if>
       <if test="updateUser != null">update_user=#{updateUser},</if>
   </set>
   where phone LIKE #{phone}
</update>

举个例子,当我更改密码的时候,我只更改了密码,其他的都没有动,这个时候mybatis动态生成的语句就是:

update users pass_word = #{passWord} where phone LIKE #{phone}

动态的把pass_word = #{passWord}后面的“,”给去掉了。

原理就相当于 :

<trim prefix="SET" suffixOverrides=",">
  ...</trim>

去除<set></set>包围里面生效的语句,紧邻where语句的“,”。

明日计划的事情

明天完善一下代码,开始进行任务八。

遇到的问题:

今天学习的内容,都在第三方接口文档里面,耐心看都可以找到对应的方法,没有困难。

收获:

动态sql,以及第三方接口的使用。

任务开始时间:2017/11/23

预计完成时间:2017/12/1

延期:无

禅道:http://task.ptteng.com/zentao/my-task.html



返回列表 返回列表
评论

    分享到