2021年3月31日星期三

[Azure Devops] 使用 Azure Repos 管理代码

1. 什么是 Azure Repos

Azure Repos 是一组版本控制工具,可用于管理代码。无论您的软件项目是大型项目还是小型项目,都应尽快使用版本控制。

版本控制系统是可帮助您跟踪随时间变化对代码所做的更改的软件。在编辑代码时,您告诉版本控制系统对文件进行快照。版本控制系统会永久保存该快照,以便以后需要时可以重新调用它。使用版本控制来保存您的工作并协调整个团队中的代码更改。

即使您只是一个开发人员,版本控制也可以帮助您在修复错误和开发新功能时保持井井有条。版本控制保留了您的开发历史,因此您可以轻松查看甚至回滚到任何版本的代码。

Azure Repos提供两种类型的版本控制:

  • Git:分布式版本控制
  • Team Foundation版本控制(TFVC):集中式版本控制

上面是官方文档的内容。虽然给出了两个选项,但现在大部分人都对 Git 比较熟悉,我也假设读者对 Git 有一定了解而无需多做解释。

2. 创建项目

在上一篇文章里我已经创建了一个项目并且选择了 Git 作为版本控制方式,在 Azure Devops 左边菜单选中 "Files" 进入文件页面,首先看到的就是上图这样的画面。可以看到除了刚创建的存储库,还可以添加新的存储库或导入其它存储库。这篇文章我将配合最新版本的 Visual Studio 16.9 从头开始创建项目并介绍 Azure Repos 的基本功能。

因为现有的视频和教程几乎都是围绕 Azure 和 Asp.net 讲解 Azure Repos 和 Pipelines,所以我特地选择 WPF 应用来实现同样的功能。

首先复制下面这个链接,然后打开 Visual Studio,随便创建一个 WPF .Net Framework 项目。

创建项目后在 Visual Studio 右下角找到"添加到源代码管理器"按钮,选择"Git"。

在弹出的创建Git存储库对话框选择"现有远程",在 Remote URL 中粘贴刚刚复制的链接。点击创建并推送。

完成后,Visual Studio 右下角应该是这个样子,代表现在是 wpf 存储库的 master 分支。

刷新 Files 页面,可以看到刚刚创建的项目已经上传到 master 分支了。

3. 使用策略保护分支

创建好分支后,代码就已经在团队里共享。通常来说团队中的人都需要修改代码,但将代码提交到 master 分之前需要先通过 CodeReview。接下来将介绍如何在 Azure Repos 中通过 Branch Policies(分治策略)保护代码安全性。

在左侧菜单中选中 Branches,进入 Branches 页面后可以看到刚刚创建的 master 分支。点击右侧的"More… "按钮,然后选择"Brance policies"进入 master 分支的分支策略页面。

如下图所示,在 Branch Policies,打开"Require a minimum number of reviewers"选项,将"Minimum number of reviewers"这是为 1,打开"When new changes are pushed:"并选中"Reset all code reviewer votes "。

这样设置完以后,master 分支就不能删除,并且只能通过 Pull Request 修改;最少需要一个 Code reviewer;PR 每次发生更改都重置代码审阅者的投票。

下面还可以选中"Check for linked work items",避免无缘无故的代码提交。

"Build Validation"涉及到 Pipelines 的内容,下一篇再解释。

最后添加一些 Code reviewer,Optional 标识可选的,即如果有多个 Code reviewer,只需要其中一个通过就可以签入到 master 分支。最好取消"Allow requestors to approve their own changes"。

4. 通过 Pull Request 修改代码

假设项目里有一个"添加单元测试"的 PBI 及它的 Task,现在我需要添加单元测试并修改一些代码后提交到 master 分支。但之前修改了分支策略后就不可以直接修改代码,而需要通过 Pull Request。

首先我需要新建分支,然后随便更新些代码。然后在 Visual Studio 右下角点击这个按钮。

在 "Git 更改" 页面输入提交的消息,并且输入 #1 #2,关联 ID 号为 1 和 2 的工作项。然后选中"全部提交并推送"。

然后回到 Azure Devops,在左侧菜单选中 Pull requests,在 Pull requests 页面可以看到系统贴心地提示我要不要创建一个 Pull request,从了它,点击"Create a pull request"。

在创建 Pull request 的页面可以看到这个 PR 有 1 个提交并修改了 9 个文件,系统已经贴心帮我填好 Title,并关联了两个工作项。点击"Create"创建完成 Pull request 的创建。

顺便一提,如果标题有"[WIP]",右下角的按钮默认选中"创建为草稿"。

Pull request 创建后,在 PR 的详细页面可以看到它的内容、是否冲突、关联的工作项、历史记录等。这时候只需要等待一个 code reviewer 审核通过,通过后右上角的蓝色按钮会变成"Complete",点击即可完成这个 PR 并将代码合并到 master 分支。

也可以点击右上角的"Set auto-complete"按钮,设置为当审核通过后马上自动完成。可以选中"Complete associated work items after merging",这样 Pull request 完成后管理的 work item (在这里只有 Task 会自动完成,PBI 还是需要人手操作)也会被自动完成。

这时候 reviewer 会收到通知要做 review,然后他就可以来看看这个 Pull request 做了些什么,没问题的话他就可以 Approve 这个 Pull request。

5. 最后

上面就是 Azure Repos 的基本使用方式。对属性 Github 的开发者来说可能很容易就能上手。更多的使用方式请参考微软提供的文档:

Azure Repos Documentation









原文转载:http://www.shaoqun.com/a/656738.html

跨境电商:https://www.ikjzd.com/

李群:https://www.ikjzd.com/w/1767

优1宝贝:https://www.ikjzd.com/w/1507


1.什么是AzureReposAzureRepos是一组版本控制工具,可用于管理代码。无论您的软件项目是大型项目还是小型项目,都应尽快使用版本控制。版本控制系统是可帮助您跟踪随时间变化对代码所做的更改的软件。在编辑代码时,您告诉版本控制系统对文件进行快照。版本控制系统会永久保存该快照,以便以后需要时可以重新调用它。使用版本控制来保存您的工作并协调整个团队中的代码更改。即使您只是一个开发人员,版本控
扬帆计划:https://www.ikjzd.com/w/1581
淘粉:https://www.ikjzd.com/w/1725
夸克:https://www.ikjzd.com/w/1237
情感口述:丈夫车祸残疾后劝我嫁给他弟:http://lady.shaoqun.com/m/a/79447.html
我和陌生男发生了一段爱情:http://www.30bags.com/a/251122.html
法国将禁止销毁未售出商品,这些亚马逊滞销库存处理方法了解一下:https://www.ikjzd.com/home/97794

后悔没有像邻居家那样设计个简洁美观的玄关

当我们新房装修好后,回家里一进门看到的是玄关,但如果玄关没装修设计好,家里来亲朋好友了,看到那么零乱会觉得很丢面子!很多人是不是都感同身受?

而我后悔自家装修玄关时没考虑太多,就做了个柜子,就是没有早点学邻居这样在打制玄关柜的时候,中间留空一块,里面直接装内墙镜子,这样玄关起码看起来要宽敞大2倍了!这样装修都有哪些亮点呢?和誉巢小编一起来看看吧!

优势一:放大玄关

玄关小又窄,再加上打上玄关柜,进门就让人感觉到压抑和不自在,但像邻居这样将玄关柜中间掏空,内嵌一块玻璃,柜子有立体层次感了,小玄关的视觉空间得到了延伸,看起来变大了!

优势二:内嵌设计很安全

对比装在镜面柜门,或者单独墙面装镜子,家有调皮捣蛋的小孩,这样内嵌在柜子里的镜子,就不用担心磕碰问题了,安全上就放心很多。

关键装在柜子里,避免了触碰镜子,也不会留下手印,打理上不也省心很多么?

优势三:多个换鞋凳、挂衣区

留空一块内嵌镜子,下面就可以做卡座换鞋凳,平时进出门换鞋,也不用扶墙换鞋穿鞋了,坐着换鞋多方便省心?

在上面的吊柜下还可以加根杆子,直接做开放式挂衣区,回家后挂放包包外套不是很省心?里面内嵌的镜子直接当穿衣镜,不要太实用方便!

当然,最重要的一点就是增加灯光设计,可以在内嵌的玄关柜内安装灯带或者内嵌筒灯,这样无论是换鞋、找衣服都不用摸黑了,还提升了整个玄关的档次!

原文转载:http://home.shaoqun.com/a/145196.html

跨境电商:https://www.ikjzd.com/

易麦:https://www.ikjzd.com/w/2048

mein:https://www.ikjzd.com/w/1601


当我们新房装修好后,回家里一进门看到的是玄关,但如果玄关没装修设计好,家里来亲朋好友了,看到那么零乱会觉得很丢面子!很多人是不是都感同身受?而我后悔自家装修玄关时没考虑太多,就做了个柜子,就是没有早点学邻居这样在打制玄关柜的时候,中间留空一块,里面直接装内墙镜子,这样玄关起码看起来要宽敞大2倍了!这样装修都有哪些亮点呢?和誉巢小编一起来看看吧!优势一:放大玄关玄关小又窄,再加上打上玄关柜,进门就让
airwallex:https://www.ikjzd.com/w/1011
贸发局:https://www.ikjzd.com/w/1621
barclays:https://www.ikjzd.com/w/2775
亚马逊旺季来临,这波操作决定了你年底吃肉还是喝汤:https://www.ikjzd.com/home/108427
晚上动静大 我被婆婆骂成狐狸精:http://www.30bags.com/m/a/252283.html
每日资讯:亚马逊放宽对第三方卖家的送货速度要求!eBay正推进出售韩国业务!:https://www.ikjzd.com/home/139647

春季黄褐斑突然增多,这些黄褐斑出现的原因你必须知道

核心提示:到了春天一不留神,很多女性发现脸上的斑点就突然增多了,也不知道是怎麽回事?尝试了很多的护肤品都没有太大的作用。那么,到底该怎么办呢?对于女性来讲,黄褐斑像挥之不去的梦魇,只要一小坨黄褐斑,就会把颜值拉低好大一截,要是再多点,那就不忍直视了。

到了春天一不留神,很多女性发现脸上的斑点就突然增多了,也不知道是怎麽回事?尝试了很多的护肤品都没有太大的作用。那么,到底该怎么办呢?对于女性来讲,黄褐斑像挥之不去的梦魇,只要一小坨黄褐斑,就会把颜值拉低好大一截,要是再多点,那就不忍直视了。


为什么春季容易长黄褐斑?

严重的作息紊乱:

作息时间紊乱不仅影响内分泌还伤肝,黄褐斑也渐渐形成。很多人作息不规律,肌肤得不到充分的休息,就会导致脸上的斑越变严重。

不注重防晒:


春季是最容易忽视防晒的季节,春季阳光看似温和,可紫外线杀伤力却不弱,紫外线无时无刻不在伤害着肌肤,脸上的黄褐斑就会越来越多。

新陈代谢变慢:

冬季转春季期间,我们身体的新陈代谢由快变慢,肌肤色素代谢缓慢,也就提高了脸上长黄褐斑的几率。


原文转载:http://lady.shaoqun.com/a/277310.html

跨境电商:https://www.ikjzd.com/

prime day:https://www.ikjzd.com/w/131.html

垂直电商:https://www.ikjzd.com/w/1450


核心提示:到了春天一不留神,很多女性发现脸上的斑点就突然增多了,也不知道是怎麽回事?尝试了很多的护肤品都没有太大的作用。那么,到底该怎么办呢?对于女性来讲,黄褐斑像挥之不去的梦魇,只要一小坨黄褐斑,就会把颜值拉低好大一截,要是再多点,那就不忍直视了。 到了春天一不留神,很多女性发现脸上的斑点就突然增多了,也不知道是怎麽回事?尝试了很多的护肤品都没有太大的作用。那么,到底该怎么办呢?对于女性来讲,黄
telegram:https://www.ikjzd.com/w/1734
ad公司:https://www.ikjzd.com/w/1332
西集网:https://www.ikjzd.com/w/1353
eBay调整SpeedPAK中国大陆至西班牙收寄服务:https://www.ikjzd.com/home/132124
口述:精心炮制的女友竟跟了别人:http://lady.shaoqun.com/m/a/273454.html
背着女友偷腥 那夜我与她姐缠绵:http://lady.shaoqun.com/m/a/271885.html

Java 线程池详解


本文部分摘自《Java 并发编程的艺术》


概述

Java 中的线程池是运行场景最多的并发框架,合理使用线程池能够带来三个好处:

  • 降低资源消耗。通过重复利用已有的线程降低线程创建和销毁造成的消耗
  • 提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行
  • 提高线程可管理性。线程是稀缺资源,使用线程池进行统一分配、调优和监控,可以降低资源消耗,提高系统稳定性

线程池的实现原理

从图中可以看到,当提交一个新任务到线程池时,线程池的处理流程如下:

  1. 线程池判断核心线程池里的线程是否都在执行任务,如果不是,创建一个新的工作线程执行任务,否则进入下一流程
  2. 线程池判断工作队列是否已满,如果工作队列没有满,将新提交的任务存储在工作队列中,否则进入下一流程
  3. 线程池判断线程池里的线程是否都处于工作状态,如果没有,创建一个新的工作线程执行任务,否则交给饱和策略来处理这个任务

使用线程池

1. 创建线程池

我们可以通过 ThreadPoolExecutor 来创建一个线程池

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);

创建一个线程需要输入几个参数,如下:

  • corePoolSize(线程池的基本大小)

    当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即时其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建

  • maximumPoolSize(线程池最大数量)

    线程池允许创建的最大线程数,如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是,如果使用无界阻塞队列做任务队列,则这个参数没有什么效果

  • keepAliveTime(线程活动保持时间)

    线程池的工作线程空闲后,保持存活的时间。如果任务很多,并且每个任务的执行时间都比较短,可以调大时间,提高线程利用率

  • unit(线程保持活动时间的单位)

    可选的单位有天(DAYS)、小时(HOURS)、分钟(MINUTES)、毫秒(MILLISECONDS)、微妙(MICROSECONDS)和纳秒(NANOSECONDS)

  • workQueue(任务队列)

    用于保存等到执行的任务的阻塞队列,可以选择以下几个阻塞队列:

    • ArrayBlockingQueue

      是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序

    • LinkedBlockingQueue

      一个基于链表结构的阻塞队列,此队列按 FIFO 排序元素,吞吐量通常高于 ArrayBlockingQueue

    • SynchronousQueue

      一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一致处于阻塞状态,吞吐量通常要高于 LinkedBlockingQueue

    • PriorityBlockingQueue

      一个具有优先级的无界阻塞队列

  • threadFactory

    用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字

  • handler(饱和策略)

    当任务和线程池都满了,说明线程池处于饱和状态,必须采取一种策略处理提交的新任务。在 JDK5 中线程池框架提供了以下四种策略:

    • AbortPolicy:直接抛出异常,默认采取这种策略
    • CallerRunsPolicy:使用调用者所在线程来运行任务
    • DiscardOldestPolicy:丢弃队列最近的一个任务,并执行当前任务
    • DiscardPolicy:不处理,丢弃掉

    也可以根据需要实现 RejectedExecutionHandler 接口自定义策略

2. 向线程池提交任务

可以使用 execute() 和 submit() 方法向线程池提交任务

  • execute() 方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功

    threadsPool.execute(new Runnable() { @Override public void run() {  //... }})
  • submit() 方法用于提交需要返回值的任务,线程池会返回一个 future 对象,通过这个对象可以判断任务是否执行成功

    Future<Object> future = executor.submit(hasReturnValueTask);try { Object s = future.get();} catch(InterruptedException e) { // 处理中断异常} catch(ExecutionException e) { // 处理无法执行任务异常} finally { // 关闭线程池 executor.shutdown();}

3. 关闭线程池

可以通过调用线程池的 shutdown 或 shutdownNow 方法来关闭线程池,它们的原理是遍历线程池中的工作线程,逐个调用线程的 interrupt 方法来中断线程,所以无法响应中断的任务可能永远无法终止

shutdown 方法和 shutdownNow 方法存在一定的区别:

  • shutdownNow 方法首先将线程池状态设置成 STOP,然后尝试停止所有正在执行或暂停任务的线程,并返回等待执行任务的列表
  • shutdown 方法只是将线程池状态设置成 SHUTDOWN 状态,然后中断所有没有正在执行任务的线程

只要调用了这两个关闭方法中的任意一个,isShutdown 方法就会返回 true,当所有任务都已关闭,才表示线程池关闭成功,这时调用 isTerminaed 方法会返回 true。至于应该采用哪种方法关闭线程池,应该由提交到线程池的任务特性决定,通常调用 shutdown 方法关闭线程池,如果任务不一定要执行完成,可以调用 shutdownNow 方法


基于线程池技术的简单 Web 服务器

目前的浏览器都支持多线程访问,比如请求一个页面的时候,页面包含的图片等静态资源会被浏览器并发的获取。如果 Web 服务器是单线程的,按顺序处理发送过来的请求,无疑会影响用户体验,因此大部分 Web 服务器都支持并发访问

下面使用线程池来构造一个简单的 Web 服务器,这个 Web 服务器用来处理 HTTP 请求,目前只能处理简单的文本和图片内容。该 Web 服务器使用 main 线程不断接受客户端的 Socket 连接,将连接以及请求提交给线程池处理,这样使得 Web 服务器能同时处理多个客户端的请求

public class SimpleHttpServer { static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(   5, 10, 60L,   TimeUnit.SECONDS, new LinkedBlockingQueue<>(),   Executors.defaultThreadFactory(),   new ThreadPoolExecutor.AbortPolicy()); static ServerSocket serverSocket; static int port = 8080; public static void setPort(int port) {  if (port > 0) {   SimpleHttpServer.port = port;  } } /**  * 启动 SimpleHttpServer  */ public static void start() throws Exception {  serverSocket = new ServerSocket(port);  Socket socket = null;  while ((socket = serverSocket.accept()) != null) {   // 接收一个客户端Socket,生成一个HttpRequestHandler,放入线程池执行   threadPool.execute(new HttpRequestHandler(socket));  }  serverSocket.close(); } static class HttpRequestHandler implements Runnable {  private Socket socket;  public HttpRequestHandler(Socket socket) {   this.socket = socket;  }  @Override  public void run() {   String line;   BufferedReader br = null;   BufferedReader reader = null;   PrintWriter out = null;   InputStream in = null;   try {    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));    String header = reader.readLine();    // 计算绝对路径    String filePath = SimpleHttpServer.class.getResource(header.split(" ")[1]).getPath();    out = new PrintWriter(socket.getOutputStream());    // 如果请求资源的后缀为 jpg 或 ico,则读取资源并输出    if (filePath.endsWith("jpg") || filePath.endsWith("ico")) {     in = new FileInputStream(filePath);     ByteArrayOutputStream baos = new ByteArrayOutputStream();     int i;     while ((i = in.read()) != -1) {      baos.write(i);     }     byte[] array = baos.toByteArray();     out.println("HTTP/1.1 200 OK");     out.println("Server: YeeQ");     out.println("Content-Type: image/jpeg");     out.println("Content-Length: " + array.length);     out.println("");     socket.getOutputStream().write(array, 0, array.length);    } else {     br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));     out = new PrintWriter(socket.getOutputStream());     out.println("HTTP/1.1 200 OK");     out.println("Server: YeeQ");     out.println("Content-Type: text/html; charset=UTF-8");     out.println("");     while ((line = br.readLine()) != null) {      out.println(line);     }    }    out.flush();   } catch (Exception e) {    if (out != null) {     out.println("HTTP/1.1 500");     out.println("");     out.flush();    }   } finally {    close(br, in, reader, out, socket);   }  } } /**  * 关闭流或者socket  */ private static void close(Closeable... closeables) {  if (closeables != null) {   for (Closeable closeable : closeables) {    if (closeable != null) {     try {      closeable.close();     } catch (Exception e) {      e.printStackTrace();     }    }   }  } } public static void main(String[] args) throws Exception {  SimpleHttpServer.start(); }}









原文转载:http://www.shaoqun.com/a/656724.html

跨境电商:https://www.ikjzd.com/

haofang:https://www.ikjzd.com/w/1046

友家快递:https://www.ikjzd.com/w/1341


本文部分摘自《Java并发编程的艺术》概述Java中的线程池是运行场景最多的并发框架,合理使用线程池能够带来三个好处:降低资源消耗。通过重复利用已有的线程降低线程创建和销毁造成的消耗提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行提高线程可管理性。线程是稀缺资源,使用线程池进行统一分配、调优和监控,可以降低资源消耗,提高系统稳定性线程池的实现原理从图中可以看到,当提交一个新任务到
houzz:https://www.ikjzd.com/w/236
mymall:https://www.ikjzd.com/w/1050
韩蓬:https://www.ikjzd.com/w/1635
如何使用YouTube Card获取流量?:https://www.ikjzd.com/home/107427
2018年美联储或将加息4次,美联储加息对跨境卖家有什么影响?:https://www.ikjzd.com/home/2085
跨境卖家下一个利基爆发点:市场规模近五百亿美元!:https://www.ikjzd.com/home/109096

JDBC实现对数据库的增删改查

  工具类JdbuUtils

  用于获取连接已经关闭相关资源

   

package JDBCutils;import java.io.InputStream;import java.sql.DriverManager;import java.util.Properties;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * @author ztr * @version 创建时间:2021年3月29日 上午10:20:16 类说明 *//* * 获取连接 * @return Connection * */public class JdbcUtils {  public JdbcUtils() {  super();  // TODO Auto-generated constructor stub } public static Connection getConnection() throws Exception {  // 读取配置文件的基本信息  // 获取连接  InputStream is = ClassLoader.getSystemClassLoader()    .getResourceAsStream("jdbc.properties");  Properties properties = new Properties();  properties.load(is);  String user = properties.getProperty("user");  String password = properties.getProperty("password");  String url = properties.getProperty("url");  String driverClass = properties.getProperty("driverClass");  // 加载驱动  Class.forName(driverClass);  Connection connection = DriverManager    .getConnection(url, user, password);  return connection; }
  /*
     * 关闭资源
     * */
    public static void closeResource(Connection connection,PreparedStatement ps){
        try {
            if (ps != null)
                ps.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            if (connection != null)
                connection.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }    /* * 关闭资源 * */ public static void closeResource1(Connection connection,PreparedStatement ps,ResultSet rs){ try { if (ps != null) ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if (connection != null) connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if (rs != null) rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

配置文件jdbc.properties

user=root
password=xxx//换成所连接数据库的密码
url=jdbc:mysql://localhost:3306/school//school是所连接的database
driverClass=com.mysql.cj.jdbc.Driver

向数据库中添加数据

@Test public void testinsertinfo() {  // 读取配置文件的基本信息  // 获取连接  Connection connection = null;  PreparedStatement prepareStatement = null;  try {   // 读取配置文件的基本信息   // 获取连接   InputStream is = ClassLoader.getSystemClassLoader()     .getResourceAsStream("jdbc.properties");   Properties properties = new Properties();   properties.load(is);   String user = properties.getProperty("user");   String password = properties.getProperty("password");   String url = properties.getProperty("url");   String driverClass = properties.getProperty("driverClass");   // 加载驱动   Class.forName(driverClass);   connection = DriverManager.getConnection(url, user, password);   // 预编译sql语句,返回prepareStatement实例   // ?占位符   String sql = "insert into student(sname,gender,class_id)values(?,?,?)";   prepareStatement = connection.prepareStatement(sql);   // 填充占位符
      //需要注意的是setString()方法的下标是从1开始
prepareStatement.setString(1, "哪炸"); prepareStatement.setString(2, "男"); prepareStatement.setInt(3, 3); // 执行sql prepareStatement.execute(); // 资源的关闭 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (prepareStatement != null) prepareStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if (connection != null) connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

修改数据库数据

@Test public void updatedate() {  // 获取连接  Connection connection = null;  PreparedStatement prepareStatement = null;  try {   connection = JdbcUtils.getConnection();   // 预编译sql语句,返回preparesStatement   String sql = "update student set sname = ? where sid = ? ";   prepareStatement = connection.prepareStatement(sql);   // 填充占位符   prepareStatement.setString(1, "宋江");   prepareStatement.setInt(2, 1);   // 执行   prepareStatement.execute();  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  } finally {   // 资源的关闭   JdbcUtils.closeResource(connection, prepareStatement);  }  // 资源的关闭  JdbcUtils.closeResource(connection, prepareStatement); }

删除数据库数据

// 删除数据库数据 @Test public void droptest() {  // 获取连接  Connection connection = null;  PreparedStatement prepareStatement = null;  try {   connection = JdbcUtils.getConnection();   // 预编译sql语句,返回preparesStatement   String sql = "delete from student where sid = ? ";   prepareStatement = connection.prepareStatement(sql);   // 填充占位符   prepareStatement.setObject(1, 4);   // 执行   prepareStatement.execute();  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  } finally {   // 资源的关闭   JdbcUtils.closeResource(connection, prepareStatement);  }  // 资源的关闭  JdbcUtils.closeResource(connection, prepareStatement); }

  至此我们发现增删改操大部分都相同这时我们可以写一个对增删改操作都通用的方法,是代码更具有有复合性。

  我们可以发现增删改操作其实差异就在sql语句中,我们不但要考虑sql还要考虑sql语句中需要我们去填充多少个占位符,这时我们可以通过传入可变参数来解决这个问题。

增删改的通用操作

// 通用的增删改操作 public void update(String sql, Object... args) {  // 获取数据连接  Connection connection = null;  // 预编译sql语句返回preparedStatement  PreparedStatement prepareStatement = null;  try {   connection = JdbcUtils.getConnection();   prepareStatement = connection.prepareStatement(sql);   // 填充占位符   // prepareStatement.setObject的下标从1开始   for (int i = 0; i < args.length; i++) {    prepareStatement.setObject(i + 1, args[i]);   }   // 执行   prepareStatement.execute();  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  } finally {   // 资源的关闭   JdbcUtils.closeResource(connection, prepareStatement);  } }
@Test
    public void testcommonupdate() {
        String sql = "delete from student where sid = ?";
        update(sql, 1);
    }

  查询操作和增删改操作不同的是,查询需要返回查询的结果,对所查询到的数据进行处理并且显示出来

 

@Test public void QueryTest() {  Connection connection = null;  PreparedStatement prepareStatement = null;  // 执行返回结果集  ResultSet resultSet = null;  try {   connection = JdbcUtils.getConnection();   String sql = "select * from student where sid = 2";   prepareStatement = connection.prepareStatement(sql);   resultSet = prepareStatement.executeQuery();   // 处理结果集   if (resultSet.next()) {// 判断结果集下一条是否有数据,若有则指针下移,若返回为false则指针不下移    int id = resultSet.getInt(1);    String sname = resultSet.getString(2);    String gender = resultSet.getString(3);    int class_id = resultSet.getInt(4);    // //方式一    // System.out.println("id "+id+"sname="+sname+"gender="+gender+"calss_id"+class_id);    // //方式二    // Object[] objects = new Object[]{id,sname,gender,class_id};    // //方式三,将数据封装成一个对象    Student student = new Student(id, sname, gender, class_id);    System.out.println(student);   }  } catch (SQLException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  } finally {   // 关闭资源   JdbcUtils.closeResource1(connection, prepareStatement, resultSet);  } }

  这个方发大家可以很容易的发现它的局限性,只能实现对一个表的固定查询操作,如果我们需要的字段不同时,则此方法就失去了意义。

  迭代--我们可以通过反射动态的获取sql语句的查询的列数以及对应的列名。

查询的迭代代码

public static Student quaryStudent(String sql, Object... args) {
        Connection connection = null;
        PreparedStatement prepareStatement = null;
        ResultSet resultSet = null;
        try {
            connection = JdbcUtils.getConnection();
            prepareStatement = connection.prepareStatement(sql);
            // 填充占位符
            for (int i = 0; i < args.length; i++) {
                prepareStatement.setObject(i + 1, args[i]);
            }
            resultSet = prepareStatement.executeQuery();
            // 获取结果即的元数据metaData
            ResultSetMetaData metaData = resultSet.getMetaData();
            // 通过metaData获取结果集中的列数
            int count = metaData.getColumnCount();

            if (resultSet.next()) {
                Student student = new Student();
                // 处理一行数据中的每一个列
                for (int i = 0; i < count; i++) {
                    Object colunmValue = resultSet.getObject(i + 1);
                    // 获取每个列的列名
                    // String columnName = metaData.getColumnName(i + 1);
                    /*
                     * 使用getClumnlabel代替getColumnName
                     * 因为可能锁对应的类的属性和数据表的列名不一致
                     * 需要注意的是此时sql需要为列名取别名
                     * eg:select sid 类对应的属性名 from where sid =?
                     * getClumnLabel当为列名取别名时其返回的是别名,没有别名时返回的是列名
                     * */
                    String columnName = metaData.getColumnLabel(i + 1);
                    // 给student对象指定的columName属性,赋值为columValue,通过反射
                    Field field = Student.class.getDeclaredField(columnName);
                    // 考虑其属性为私有属性
                    field.setAccessible(true);
                    field.set(student, colunmValue);
                }
                return student;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 进行资源的关闭
            JdbcUtils.closeResource1(connection, prepareStatement, resultSet);
        }
        return null;
    }

    @Test
    public void qurytest2() {
        String sql = "select * from student";
        Student student = PreparedStamentTest.quaryStudent(sql);
        System.out.println(student);
    }

  可能大家会对元数据有疑惑,元数据就是修饰数据的数据。

接受数据类-Student

package bean;/** * @author ztr * @version 创建时间:2021年3月30日 下午3:22:09 * 类说明 */public class Student { private int sid; private String sname; private String gender; private int class_id; public Student() {  super();  // TODO Auto-generated constructor stub } public Student(int sid, String sname, String gender, int class_id) {  super();  this.sid = sid;  this.sname = sname;  this.gender = gender;  this.class_id = class_id; } public int getSid() {  return sid; } public void setSid(int sid) {  this.sid = sid; } public String getSname() {  return sname; } public void setSname(String sname) {  this.sname = sname; } public String getGender() {  return gender; } public void setGender(String gender) {  this.gender = gender; } public int getClass_id() {  return class_id; } public void setClass_id(int class_id) {  this.class_id = class_id; } @Override public String toString() {  return "Student [sid=" + sid + ", sname=" + sname + ", gender="    + gender + ", class_id=" + class_id + "]"; }   }

图解查询流程

 

 

 迭代2:实现对全部表格的通用查询

package preparedStament;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import org.junit.Test;import JDBCutils.JdbcUtils;import bean.Student;/** * @author ztr * @version 创建时间:2021年3月31日 下午5:10:19 * 类说明:针对不同表的通用查询操作 */public class QueryCommon { public <T> T GetInstance(Class<T> clazz,String sql,Object ...args){  Connection connection = null;  PreparedStatement prepareStatement = null;  // 获取结果集  ResultSet resultSet = null;  try {   connection = JdbcUtils.getConnection();   prepareStatement = connection.prepareStatement(sql);   for (int i = 0; i < args.length; i++) {    prepareStatement.setObject(i + 1, args[i]);   }   resultSet = prepareStatement.executeQuery();   // 获取元数据   ResultSetMetaData metaData = resultSet.getMetaData();   // 通过metaData获取结果集中的列数   int columnCount = metaData.getColumnCount();   if (resultSet.next()) {    T newInstance = clazz.newInstance();    for (int i = 0; i < columnCount; i++) {     //获取列值     Object columnValue = resultSet.getObject(i + 1);     // 获取每列的列名     String columnName = metaData.getColumnName(i + 1);     // 利用反射     Field field = clazz.getDeclaredField(columnName);     // 考虑该属性是否为私有     field.setAccessible(true);     field.set(newInstance, columnValue);    }    return newInstance;   }  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  } finally {   // 关闭资源   JdbcUtils.closeResource1(connection, prepareStatement, resultSet);  }    return null;   } @Test public void test(){  String sql = "select sid,sname from student where sid=?";  Student getInstance = GetInstance(Student.class, sql, 9);  System.out.println(getInstance); }}

以上的查询方法都只适用与查询一条数据

迭代2:查询多条数据

 /**  *  * @param clazz  * @param sql  * @param args  * @return List<T>  */ public <T> List<T> getList(Class<T> clazz, String sql, Object... args) {  Connection connection = null;  PreparedStatement prepareStatement = null;  // 获取结果集  ResultSet resultSet = null;  try {   connection = JdbcUtils.getConnection();   prepareStatement = connection.prepareStatement(sql);   for (int i = 0; i < args.length; i++) {    prepareStatement.setObject(i + 1, args[i]);   }   resultSet = prepareStatement.executeQuery();   // 获取元数据   ResultSetMetaData metaData = resultSet.getMetaData();   // 通过metaData获取结果集中的列数   int columnCount = metaData.getColumnCount();   // 创建集合对象   ArrayList<T> list = new ArrayList<T>();   while (resultSet.next()) {    T newInstance = clazz.newInstance();    for (int i = 0; i < columnCount; i++) {     // 获取列值     Object columnValue = resultSet.getObject(i + 1);     // 获取每列的列名     String columnName = metaData.getColumnName(i + 1);     // 利用反射     Field field = clazz.getDeclaredField(columnName);     // 考虑该属性是否为私有     field.setAccessible(true);     field.set(newInstance, columnValue);    }    list.add(newInstance);   }   return list;  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  } finally {   // 关闭资源   JdbcUtils.closeResource1(connection, prepareStatement, resultSet);  }  return null; } @Test public void test1(){  String sql = "select sid,sname from student where sid < ?";  List<Student> list = getList(Student.class, sql, 10);  list.forEach(System.out::println); }

运行截图

 

 

至此,JDBC对数据库的CURD就全部完成。此博文只是对自己学习得到阶段性总结,若有错误之处,请谅解!

 









原文转载:http://www.shaoqun.com/a/656721.html

跨境电商:https://www.ikjzd.com/

转口贸易:https://www.ikjzd.com/w/1427

telegram:https://www.ikjzd.com/w/1734


工具类JdbuUtils  用于获取连接已经关闭相关资源   packageJDBCutils;importjava.io.InputStream;importjava.sql.DriverManager;importjava.util.Properties;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.
首信易支付:https://www.ikjzd.com/w/1841
dhl:https://www.ikjzd.com/w/516
transfer:https://www.ikjzd.com/w/1735
新相亲时代到来,相亲靠谱吗?:http://www.30bags.com/m/a/250023.html
大势颠峰,赢占市场 —— 跨境电商Amazon高峰论坛:https://www.kjyunke.com/courses/63
成人奶妈口述为男主色情服务 触犯法律为所作所为买单:http://www.30bags.com/a/254050.html

2021年3月30日星期二

换季皮肤变差怎么办?这样拯救你疲惫的肌肤

核心提示:每到季节交替的时候,我们的肌肤总容易出现干燥、脱皮、粗糙等现象。

每到季节交替的时候,我们的肌肤总容易出现干燥、脱皮、粗糙等现象。


导致这一现象产生的原因是因为随着年龄的增长以及外界气候的变化,皮脂腺和汗腺分泌异常时,肌肤的抵抗力会逐渐减弱,而皮肤油脂分泌减少时,肌肤储存水分的功能也会随之下降……

因此,季节交替时肌肤有可能出现的问题:

1、皮肤吸收力变差,日常用的产品感觉不吸收。

2、脸色黯淡无光,有菜色的感觉,没有活力,无论睡多久还是好累。

3、皮肤变粗糙,有干燥紧绷干,还有可能泛红起疹子。

皮肤出现这些问题,应该怎么补救?

适度清洁

洗脸次数过多,会破坏肌肤的皮脂膜,而皮肤上的神经酰胺在42度以上的水中就会失去原本的机能,在日常中,我们一天最多洗2次脸,选择适合自己肤质的氨基酸洗面奶,能有效防止水分流失。

使用温和型卸妆产品

洁面膏长时间接触皮肤反而会加速皮肤干燥,因为正常的皮脂是具有保护肌肤的作用,过度清洁会造成皮脂腺的分泌更加旺盛,而市场上的很多卸妆产品,为了加强卸妆效果,加入了强效的溶油成分,在卸妆过程中,反而会将本不该流失的皮肤油分一同洗去,所以要选择温和型的洗卸产品,这样能有效改善皮肤干燥的问题。

勤敷保湿面膜


在日常中,感觉到肌肤开始干燥时,敷一片保湿面膜可以起到很好的保湿效果,但切记不能边敷面膜边睡觉,以免时间太久,被水分已经蒸发掉的面膜反吸收走肌肤的水分。

注意身心健康

换季的时候心情可能受到影响,有起伏,有肯能会影响生活品质,造成浅眠多梦,精神不佳,这个时候肤况会更加的不好,所以要及时调节心情,可以通过闻香或者精油按摩等方式,安定神经,让人舒缓放松,提高睡眠质量,这样皮肤状况也会有所好转。


原文转载:http://health.shaoqun.com/a/213110.html

跨境电商:https://www.ikjzd.com/

tm商标:https://www.ikjzd.com/w/1069

全球速卖通:https://www.ikjzd.com/w/81


核心提示:每到季节交替的时候,我们的肌肤总容易出现干燥、脱皮、粗糙等现象。 每到季节交替的时候,我们的肌肤总容易出现干燥、脱皮、粗糙等现象。导致这一现象产生的原因是因为随着年龄的增长以及外界气候的变化,皮脂腺和汗腺分泌异常时,肌肤的抵抗力会逐渐减弱,而皮肤油脂分泌减少时,肌肤储存水分的功能也会随之下降……因此,季节交替时肌肤有可能出现的问题:1、皮肤吸收力变差,日常用的产品感觉不吸收。2、脸色黯淡
stylenanda官网:https://www.ikjzd.com/w/1675.html
淘粉吧怎么返利:https://www.ikjzd.com/w/1725
usps国际快递查询:https://www.ikjzd.com/w/513
2020年选品工具:速卖通运营必看!:https://www.ikjzd.com/home/111401
增加黑五和网一销量的7个实战技巧!:https://www.ikjzd.com/home/110874
那一夜他把我做到喷水 火车上爱爱好爽好刺激:http://www.30bags.com/m/a/249943.html

不是养生,而是找病!这5条“养生建议”都是假的,别再跟风了

核心提示:很多人对"日行万步"都有误解,还有很多"养生建议"都被曲解了,如果不理性看待,最终只会适得其反。

近年来,人们的健康意识越来越强,很多人都加入了养生的行列。养生是好,但济南的老张却养出了毛病,这是怎么一回事?

原来,自从换了智能手机,老张就忙了起来,忙什么呢?忙着每天走路,争当第一名。

走路对老年人来说是强身健体的最佳方式之一,不过老张的好胜心太强,从刚开始的一万步,到后来的两三万步,几乎天天占据步数排行榜榜首。2个月后,老张的关节突然疼得厉害,去医院检查,没想到医生告诉他:你的半月板坏了!

急于求成害了老张,可他还是想不通:网上不是说"日行万步"吗?难道自己的方法真的错了?

其实不光是老张,很多人对"日行万步"都有误解,还有很多"养生建议"都被曲解了,如果不理性看待,最终只会适得其反。

一、这些坑人的建议,越做越伤身

1.日行万步,活过百岁

真相:日行万步要分人、分年龄、分情况,一般来说,如果慢步行走,每天10000步的问题不是很大。但如果快步行走,每天6000步左右就差不多了。尤其是50岁以上的中老年人,骨骼关节不适合高强度走路,每天达到锻炼效果就好,没必要追求日行万步,甚至更多,否则只会损害身体。

建议:不要一次性走10000步,可以分成早晚2次走,让关节休息一段时间。对于老年人来说,每天走30~40分钟,保持在6000步左右即可。同时,走路要循序渐进,从少到多,不能急于求成,走路之后可以泡脚、按摩,缓解疲劳。

2.坚持素食能长寿

真相:长期吃素容易导致营养失衡,造成铁、维生素B等营养元素缺乏。同时,吃素无法补充足够的热量,会导致营养不良,引起抵抗力降低、记忆力下降、贫血、消瘦等。对高血压患者来说,吃素不利于血压稳定,反而可能使血压居高不下。

此外,吃素还会增加胆结石的风险,年轻女性长期吃素,会影响内分泌,导致月经不调,严重甚至不孕。

建议:科学"吃素"才能让身体更加健康,①均衡比例,谷物类、蔬菜、水果、豆类和豆制品都要占一定的比例;②摄入一定量的鸡蛋和鱼肉、鸡肉等白肉,补充动物蛋白,保持"八分素"即可;③减少盐分的摄入,口味清淡,建议选择低钠盐或者低盐酱油作为调味品。

3.适量饮酒,有益健康

真相:酒精是一级致癌物,致癌证据充分。研究表明,饮酒会增加多种癌症的风险,而且没有"适量"的范围,只要饮酒,癌症发生的几率就会相应提高,饮酒越多,癌症风险越高。

建议:尽量不饮酒,如果不得不喝,可以选择度数较低的酒。在饮酒时小口小口地饮,不要"一口闷",喝之前还要吃点菜,增加饱腹感,减少饮酒量。

4.女性私处,洗洗更健康

真相:阴道本身就是弱酸性环境,具有自洁功能,可以抵御病菌入侵。如果频繁使用阴道洗液清洗,会破坏酸碱环境和菌落平衡,更容易感染细菌和病毒。

建议:洗澡时用清水冲洗即可,也无需用湿纸巾擦,以免携带病菌,破坏酸碱环境,影响健康。

5.老来瘦是福气

真相:老年人太瘦,说明脾胃不好,缺乏肌肉,更容易骨质疏松,增加关节炎、糖尿病和心脏病的风险,患上肌少症。此外,老年人太瘦,可能导致免疫力低,很多慢性病就会找上门,有过早死亡的风险。

建议:摄入充足的优质蛋白,经常喝牛奶、吃鸡蛋、吃豆类和豆制品等,多出去走走,晒晒太阳,补充维生素D,每天运动20-30分钟,每周运动3次以上,才能保持身体素质。

二、年过40,体重多少才算正常?

很多人年过四十就会发福,有一个大大的啤酒肚,体重也增长不少。虽然这已经成为一种常见的现象,但不得不说:中年发福会增加高血压、糖尿病、冠心病等疾病的风险

瑞典一项研究表明,随着年龄的增长,脂质周转率会呈现下降趋势。也就是说,年龄是中年发福的主要因素,即使运动量没减少,但到了一定的年龄,还是不可避免会发福。

那么,怎样才能知道自己的体重是否正常呢?可以通过BMI来计算。BMI即身体质量指数,是国际公认的衡量人体肥胖程度和是否健康的重要标准。

根据我国的标准,BMI的正常值为18.5-23.9,BMI≥24为超重,BMI≥28为肥胖。举个例子,身高170的男性,正常体重为53.5kg~69kg;身高185的男性,正常体重为63.3kg~81.7kg。

计算出BMI后,还要结合腰围来再次判断,通常男性腰围≥85cm,女性腰围≥80cm,就属于腹部肥胖

那么,中老年人如何判断自己是否需要减肥呢?

第一,如果是轻度肥胖,而且没有心血管疾病,就不一定需要减肥。

第二,如果已经达到肥胖的标准,而且患有慢性疾病,就需要适当减重,但要在保证基本营养的前提下进行,通过调节饮食、适度运动等健康的方式,达到减重目的。

如今,不光是老年人,越来越多的年轻人也加入了养生的行列。面对五花八门的养生建议,我们应该理性看待,不要盲目跟风,科学养生才能让身体更健康。


参考资料:


[1]为什么人到中年易「发福」? 瑞典研究人员13年调查揭示真相.生命时报. 2021-02-18

[2]"老来瘦"="老来寿"吗?正确的增肌方式了解一下!.医学界内分泌频道. 2020-12-24

未经作者允许授权,禁止转载


原文转载:http://health.shaoqun.com/a/213107.html

跨境电商:https://www.ikjzd.com/

easel:https://www.ikjzd.com/w/1721

google趋势:https://www.ikjzd.com/w/397


核心提示:很多人对"日行万步"都有误解,还有很多"养生建议"都被曲解了,如果不理性看待,最终只会适得其反。 近年来,人们的健康意识越来越强,很多人都加入了养生的行列。养生是好,但济南的老张却养出了毛病,这是怎么一回事?原来,自从换了智能手机,老张就忙了起来,忙什么呢?忙着每天走路,争当第一名。走路对老年人来说是强身健体的最佳方式之一,不过老张的好胜心太强,从刚开始的一万步,到后来的两三万步,几乎天
askme:https://www.ikjzd.com/w/2459
杨帆:https://www.ikjzd.com/w/1648
e邮宝:https://www.ikjzd.com/w/594.html?source=tagwish
美国返校季即将来临,亚马逊Prime Day却推迟了,跨境卖家们太难了!:https://www.ikjzd.com/home/126245
亚马逊CPC广告的一些技术要点:https://www.ikjzd.com/tl/107449
老婆的闺蜜在我家洗澡不关门:http://www.30bags.com/a/252083.html

吃叶酸是女性的事?新研究显示,男性备孕也要补叶酸!

核心提示:在很多人的印象中,补叶酸是女方的事,男性不需要补叶酸。不过,最近有研究显示,男性在备孕时也需要补充叶酸。

叶酸也叫维生素B9,是一种水溶性维生素。叶酸对胎儿的神经发育非常重要,研究发现,常规补充叶酸可以降低70%的新生儿神经管畸形发生几率,而且还能预防流产、早产。


在很多人的印象中,补叶酸是女方的事,男性不需要补叶酸。不过,最近有研究显示,男性在备孕时也需要补充叶酸。

由加拿大麦吉尔大学的研究人员发表在《DevelopmentalCell》期刊上的文章显示,缺乏叶酸会影响精子中组蛋白H3第4位赖氨酸上的三甲基化(H3K4me3),而且这种变化可以叠加并被传递至胚胎,导致子代发育缺陷。

研究者在雄性小鼠上进行了分组实验,一组小鼠的喂养方式缺乏叶酸,另一种小鼠的喂养方式富含叶酸。在经过两个生精周期(9~11周)后对比发现,与富含叶酸小组相比,缺乏叶酸小组的后代出生缺陷程度要高。经过进一步的实验室分析发现,精子中的染色质对叶酸缺乏很敏感。

实际上,此前就有研究显示,男性缺乏叶酸,会使精液中携带的染色体数量出现异常,与卵子结合可增加女性流产的几率,并引起新生儿缺陷,增加婴儿长大后患病风险。因此,在备孕时,男性也要适当补充叶酸。


那么,什么时候吃叶酸比较好呢?

有研究表明,女性在服用叶酸后,要经过4周左右的时间才能改善体内叶酸缺乏的状态,因此为了使体内的叶酸维持在一定的水平,以保证胎儿早期有一个较好的叶酸营养状态,未准妈妈备孕前就得补叶酸。《中国居民营养膳食指南》建议,补叶酸最迟应该从孕前3个月开始,怀孕后前3个月也要坚持吃叶酸,最好整个孕期都要补。

健康备孕女性和孕早期女性每天应补充0.4毫克叶酸,但最多应不超过1毫克。因为有研究发现,长时间大剂量服用叶酸,会干扰人体内锌的代谢,导致缺锌,而准妈妈缺锌不仅会影响自身健康,出现免疫力下降、加重妊娠反应、食欲减退等症状,还会影响宝宝的生长发育。


原文转载:http://health.shaoqun.com/a/212130.html

跨境电商:https://www.ikjzd.com/

灯塔计划:https://www.ikjzd.com/w/1281

亚马逊礼品卡:https://www.ikjzd.com/w/1090.html


核心提示:在很多人的印象中,补叶酸是女方的事,男性不需要补叶酸。不过,最近有研究显示,男性在备孕时也需要补充叶酸。 叶酸也叫维生素B9,是一种水溶性维生素。叶酸对胎儿的神经发育非常重要,研究发现,常规补充叶酸可以降低70%的新生儿神经管畸形发生几率,而且还能预防流产、早产。在很多人的印象中,补叶酸是女方的事,男性不需要补叶酸。不过,最近有研究显示,男性在备孕时也需要补充叶酸。由加拿大麦吉尔大学的研
新单:https://www.ikjzd.com/w/79
cima是什么:https://www.ikjzd.com/w/1372
lithium:https://www.ikjzd.com/w/2505
怎么入驻速卖通中国好卖家?速卖通金银牌资源对接详解!:https://www.ikjzd.com/home/97138
闺蜜色诱老公 再次满足身心需要:http://www.30bags.com/m/a/253035.html
跨境电商独立站适合什么企业?——谷歌白湧:https://www.ikjzd.com/home/99623

为什么乳晕会变黑

核心提示:每位女性的乳晕有可能是不一样的,我们发现有部分女性的乳晕出现了发黑的颜色,这个颜色是所有女性都不喜欢的,但并不是所有的女性都会出现乳晕变黑的情况,之所以会变黑,也是有一定原因的,那么为什么乳晕会变黑呢?

其实每个人的心都是非常细致的,尤其是对于女性来讲,细致的心可以发现很多的小细节,虽然说有的时候细心会发现一些自己不该发现的,但是大多数的时候细心是好的,尤其是观察自身的变化方面,我们发现有些女性的乳晕部位,在颜色方面发生了很大的变化,如从粉红色变成了黑色,这种情况越来越常见了,那么为什么乳晕会变黑呢?

为什么乳晕会变黑

引起乳晕变黑情况发生的原因有很多,有可能是因为过度刺激而引起的乳晕变黑,过度的性生活或者是婴儿吸吮母乳,还有用海绵刷拭自己的身体,不当去角质等,都会引起黑色素沉淀现象,因为人们的身体在成年之后,生理机能的变化人们身体的黑色素细胞受到了黄体激素的刺激,促进了身体里面黑色素的大量分泌,因此乳晕就会从原先的粉红色慢慢的变暗褐色,再由暗褐色变黑,这样慢慢的加深。


也有可能是因为晒太阳的原因引起的,穿着了没有防晒效果的比基尼,并且在下水后之后,布料会更加的透明,使阳光更加有机会入侵胸部,或者是比较喜欢穿着一些薄透的小可家,不防晒、不穿内衣等,都会使乳晕变黑。

还有可能是因为怀孕导致的,荷尔蒙的变化会使乳晕变黑同时变大,即便是在生产之后,荷尔蒙慢慢的恢复正常,乳晕的大小以及颜色也不可能会恢复到怀孕之前的样子,在怀孕期间的时候,还有生产之后,因为经过怀胎,肝脏不断的排解胎毒,使肝脏的机能衰弱,再加上荷尔蒙的影响,使黑色素剧增,并且慢慢的沉淀而引起乳晕发黑。

为什么乳晕会变黑呢?越来越多的女性发现自己的乳晕颜色和之前发生了很大的变化,很有可能会从粉红色变成了黑色,其实这种情况在生活中并不少见,引起这种情况发生的原因也有很多,如怀孕、晒太阳等,关于为什么乳晕会变黑的相关内容,在以上有详细的介绍,希望可以帮助到大家。


原文转载:http://health.shaoqun.com/a/212108.html

跨境电商:https://www.ikjzd.com/

tracker:https://www.ikjzd.com/w/2720

bap:https://www.ikjzd.com/w/1492


核心提示:每位女性的乳晕有可能是不一样的,我们发现有部分女性的乳晕出现了发黑的颜色,这个颜色是所有女性都不喜欢的,但并不是所有的女性都会出现乳晕变黑的情况,之所以会变黑,也是有一定原因的,那么为什么乳晕会变黑呢? 其实每个人的心都是非常细致的,尤其是对于女性来讲,细致的心可以发现很多的小细节,虽然说有的时候细心会发现一些自己不该发现的,但是大多数的时候细心是好的,尤其是观察自身的变化方面,我们发现
打折网:https://www.ikjzd.com/w/74
topia:https://www.ikjzd.com/w/2741
邮乐网购:https://www.ikjzd.com/w/1776
气愤:我和老公裸婚 婆婆说我贱:http://lady.shaoqun.com/a/272213.html
我为前男友和小三开房!:http://lady.shaoqun.com/m/a/272430.html
口述:为了事业当小三值得么:http://www.30bags.com/a/252866.html

2021年3月29日星期一

牙疼、肚子疼?有可能是心梗的先兆!这些不起眼的征兆必须警惕|心肌梗死

  来源:科普中国

  本文专家:陈思娇,中国医科大学附属第一医院主任医师

  平时大家生个病,有点头疼脑热是难免的。然而有一种病,它突发性强、来势凶猛、死亡率高,能数分钟能夺得人的生命。它就是"急性心肌梗死"。

  随手搜索,就能看到相关的新闻。而且似乎不是中老年的"专利"。


  而且心梗的症状似乎跟我们想象的不一样,牙疼、肚子疼等症状竟可能也是心梗的征兆。


  事实上,心梗还是会有前兆的,只不过经常不被重视。今天我们就仔细说说心梗那些事。

  什么是急性心肌梗死?

  急性心肌梗死是冠状动脉急性、持续性缺血缺氧所引起的心肌坏死。临床上多有剧烈而持久的胸骨后疼痛,休息及硝酸酯类药物不能完全缓解,伴有血清心肌酶活性增高及进行性心电图变化,可并发心律失常、休克或心力衰竭,常可危及生命。

  根据2020中国心血管病报告数据,急性心肌梗死的发病率不断增高,死亡率亦呈整体上升趋势。此病在欧美也很常见。


  由于全球心肌梗死的发病率和致死率不断攀升,引起了世界范围内医学界的重视,2018年欧洲心脏病学会(ESC)发布了第四版心肌梗死全球统一定义,依据发病原因不同,心肌梗死分为6类5型。


  哪些因素可诱发心梗?

  在冠状动脉病变基础上,下图这9种因素容易诱发心梗。


  哪些人更容易患心梗?

  有下图中这些特点的人都属于心梗的易患人群,你"中枪"了吗?


  易患人群图谱

  心梗有哪些征兆?

  大家都知道心脏不好会胸痛,但征兆远远不止于此。还有罕见的症状如鼻尖痛、大腿根痛及尿频尿急等。





  那么为啥心梗了,还会有这么多看似风马牛不相及的症状呢?事实上人体心脏本身不会直接感到疼痛,但是,分布在心脏上丰富植物神经可将心脏的异常信号传递到延脑中心脏神经中枢。

  心脏神经可植入在胸部、咽部、下颌、牙的位置,于是心肌缺血时感觉到的是咽痛、下颌痛、牙痛。同样道理,可能表现为上腹痛,肩背部疼痛。

  这三种"报警信号"可助你极速识别心梗,千万别不当回事!


  如何防治心源性猝死?

  临床数据显示:心源性猝死中90%以上是急性心肌梗死并发症导致的,心梗并发症包括严重的心律失常、心源性休克和心脏破裂均可导致心源性猝死。


  经典的动脉硬化进程是递进的过程,从脂质条纹到纤维斑块,再到复合病变三个阶段。

  常有患者冠状动脉CTA接近正常,但还是需要打他汀药物。这是因为CTA接近正常是动脉硬化早期(脂质条纹期),是可逆的无症状亚临床阶段,这阶段干预可以完全恢复到正常血管。一旦进入纤维斑块期,则是不可逆的阶段!

  医生要依据患者的动脉硬化进程,精准制定各阶段防治策略。


  心跳骤停该如何急救?

  心肌细胞同脑细胞一样为永久性细胞,一旦坏死,不可再生!尽快恢复心肌灌注,挽救濒死的心肌,防治心梗面积进一步扩大。开通罪犯血管时间越早越好。


  因此,防止心肌细胞死亡,开通罪犯血管不能超过2小时,心跳骤停后防止脑死亡,心肺复苏(CPR)时间不能超过4分钟。


  发现心脏骤停后,除了呼救120,第一目击者现场紧急心肺复苏尤为重要。


  综上所述

  无论是胸痛

  还是肚子疼、牙疼、鼻尖疼

  都有可能是心梗征兆

  不要轻易忽视

  如果出现心脏骤停

  现场紧急心肺复苏非常关键!

原文转载:http://tech.shaoqun.com/a/392788.html

跨境电商:https://www.ikjzd.com/

asinseed:https://www.ikjzd.com/w/533

dojo:https://www.ikjzd.com/w/2052


来源:科普中国  本文专家:陈思娇,中国医科大学附属第一医院主任医师  平时大家生个病,有点头疼脑热是难免的。然而有一种病,它突发性强、来势凶猛、死亡率高,能数分钟能夺得人的生命。它就是"急性心肌梗死"。  随手搜索,就能看到相关的新闻。而且似乎不是中老年的"专利"。  而且心梗的症状似乎跟我们想象的不一样,牙疼、肚子疼等症状竟可能也是心梗的征兆。  事实上,心梗还是会有前兆的,只不过经常不被重视
敏思达:https://www.ikjzd.com/w/2304
斑马物联:https://www.ikjzd.com/w/1316
barclays:https://www.ikjzd.com/w/2775
亚马逊A9排名算法:listing可见度最大化指南:https://www.ikjzd.com/home/130340
国人抢购潮背后的真相:"日本贵族产品"竟成国货?:https://www.ikjzd.com/home/22047
一文看懂亚马逊站内自动广告,解开你心中所有的疑惑!:https://www.ikjzd.com/home/18316

2021年3月28日星期日

安全套是不是越薄越好?如何选安全套

核心提示: 市面上我们所看到的安全套按薄厚程度分三种:薄型、超薄型、普通型。但是很多男性戴套是为了防"意外",但是又不想失去性爱的快感,所以都会选择超薄的安全套。但是,专家解释安全套并非越薄越好,最重要的是合适。

目前,市场上具有抗炎、增强性敏感度、杀精、帮助延迟射精等附加功能的安全套相当常见,其实,不同的安全套有不用的作用,在使用前应先了解它的功能。

避孕 避孕套 牛仔裤_10293984_xxl


市面上最常见的就是涂有硅油润滑的安全套,它能省去使用者过性生活时自行涂抹润滑剂的麻烦,也避免了女性阴道干涩的问题。

胶圈较厚的安全套对早泄、勃起不坚的中老年人有治疗作用。因为胶圈有止血作用,可阻止已勃起的阴茎内血液回流,有助于维持阴茎勃起状态。

还有一种套带有各种糖果味道,这是专门为口交设计的,既能保证安全,又增加了情趣。

原文转载:http://health.shaoqun.com/a/210141.html

跨境电商:https://www.ikjzd.com/

c2c模式:https://www.ikjzd.com/w/1576

友家快递:https://www.ikjzd.com/w/1341


核心提示: 市面上我们所看到的安全套按薄厚程度分三种:薄型、超薄型、普通型。但是很多男性戴套是为了防"意外",但是又不想失去性爱的快感,所以都会选择超薄的安全套。但是,专家解释安全套并非越薄越好,最重要的是合适。 目前,市场上具有抗炎、增强性敏感度、杀精、帮助延迟射精等附加功能的安全套相当常见,其实,不同的安全套有不用的作用,在使用前应先了解它的功能。市面上最常见的就是涂有硅油润滑的安全套,它能省
rfq:https://www.ikjzd.com/w/251
hemingway:https://www.ikjzd.com/w/2344
笨鸟转运:https://www.ikjzd.com/w/1550
《飞哥大英雄》刘敏惊艳出场 变身歌女诱雷佳音:http://yl.shaoqun.com/m/a/72681.html
国际商标注册常见几种注册方式:https://www.ikjzd.com/home/129568
"吉祥三宝"现在做还得及吗? :https://www.ikjzd.com/home/123605

2021年3月27日星期六

壹方中心245㎡·一站式整装

本项目壹方中心,是深圳宝安中心区的高端住宅小区,毛坯交房,面积245㎡,现代轻奢风

项目地点:深圳宝安

交楼标准:毛坯

项目面积:245㎡

风格定位:现代轻奢风格

整装团队:德派装饰&君尚软装&摩洛卡家居

平面布置图

客厅实拍

以白色为主调的客厅,整体干净、明亮,没有多余的细节,设计师将每一角落都细致的设计利用,使得空间呈现的是舒适与华丽并存

白色的大理石为电视背景墙,配以两侧的水晶灯,下方一张黑色储物柜,完美契合,凸显大气风范

白棕色与宝蓝色的布艺沙发,在这里面既有沉稳又不失单调,恰到好处的色彩为空间增添明亮的作用

餐厅实拍

餐厅延续客厅的风格,宝蓝色的餐椅围绕活动圆盘的餐桌,上方一盏玫瑰形状的水晶吊灯,在照亮空间的同时也彰显空间的优雅、炫丽

书房实拍

书房的设计是个敞开式空间,采用金属镂空屏风将客厅与餐厅间隔开来,这样的设计给人于视觉开阔的体验感

一张板材结构+木饰面的书桌,结合一张不锈钢的椅子,后背白色储物柜放着主人的书籍与收藏品,共同构成简约而大方的空间

主卧实拍

主卧采用皮质床头、白色床头柜、灰色的背景墙、米色地毯,用浅色系列勾勒出优雅、宁静的睡眠空间

布置左右两边对称的床头柜,摆上照片,营造居家的惬意感,床头上方两个金属饰品,给与强烈的轻奢视觉感受。

女孩房实拍

女孩房是公主般的体验感,粉粉嫩嫩的床铺搭配小清新的淡青色背景墙,给人予温柔、舒适的感受

加与精美的抱枕和摆上童趣的玩偶,彰显小主人对美丽的追求以及可爱孩童的童趣感

次卧

次卧有木饰面的加特,显得温润有余,营造出舒适的睡眠氛围,高级灰的床头与窗帘布给空间增加不少的时尚感

每一件做工精细的软装饰品,将空间烘托的更高级,同时也彰显主人对品质、时尚的追求

原文转载:http://home.shaoqun.com/a/139197.html

跨境电商:https://www.ikjzd.com/

new old stock:https://www.ikjzd.com/w/2341

usps:https://www.ikjzd.com/w/513


本项目壹方中心,是深圳宝安中心区的高端住宅小区,毛坯交房,面积245㎡,现代轻奢风项目地点:深圳宝安交楼标准:毛坯项目面积:245㎡风格定位:现代轻奢风格整装团队:德派装饰&君尚软装&摩洛卡家居平面布置图客厅实拍以白色为主调的客厅,整体干净、明亮,没有多余的细节,设计师将每一角落都细致的设计利用,使得空间呈现的是舒适与华丽并存白色的大理石为电视背景墙,配以两侧的水晶灯,下方一张黑色
outfit:https://www.ikjzd.com/w/938
欧麦:https://www.ikjzd.com/w/2085
周宁:https://www.ikjzd.com/w/1647
亚马逊FBA退件换标移仓处理步骤:https://www.ikjzd.com/home/17763
提升亚马逊转化率的5种方法,爆款是这样打造的!:https://www.ikjzd.com/home/106815
昨天刷爆跨境圈的IEN是什么鬼?如何应对?:https://www.ikjzd.com/home/20798