学习笔记随记-2019-01-01--01

版权声明:本文章属原创,转载请注明出处,谢谢。 https://blog.csdn.net/nvluco/article/details/86254390

目录:

*1.学到的知识

*1.1 Mybatis中 的动态SQL模糊查询

*(1)直接拼接%%

*(2)使用concat函数

*(3)使用 bind 标签

*1.2.微服务在服务器运行自动关闭

*2.1.1.本地微服务打成JAR

*1.2.2 nohup 和 & 的区别

*1.2.3 disown

1.学到的知识

1.1 Mybatis中 的动态SQL模糊查询

模糊查询的多种写法:

(1)直接拼接%%

如 ‘%’#{name}’%’ 或 “%”#{name}"%",单引号或双引号都可以。
结合项目中,写法如下:

<where>
    u.`status`=1
    <if test="name != null And name != '%%'">
      AND u.`name` LIKE ('%${name}%')
    </if>
    <if test="roleName != null And name != '%%'">
      AND r.role_name LIKE ('%${roleName}%')
    </if>
</where>

注意:此处不能写成 “%#{name}%” ,#{name}就成了字符串的一部分,会发生这样一个异常: The error occurred while setting parameters,应该写成:
"%"#{name}"%",即#{name}是一个整体,前后加上%

(2)使用concat函数

使用concat(str1,str2)函数将两个参数连接

<where>
     u.`status`=1
     <if test="name != null" >
       AND u.`name` LIKE CONCAT('%',#{name},'%')
     </if>
     <if test="roleName != null">
       AND r.role_name LIKE CONCAT('%',#{roleName},'%')
     </if>
 </where>

(3)使用 bind 标签

对字符串进行绑定,然后对绑定后的字符串使用 like 关键字进行模糊查询

<where>
       u.`status`=1
       <if test="name != null" >
         <bind name="name" value="'%'+name+'%'"/>
         AND name LIKE #{name}
       </if>
   </where>

Mysql中查询相关知识拓展:
一般模糊语句如下:
SELECT 字段 FROM 表 WHERE 某字段 Like 条件
其中提供了四种匹配模式:

  • 1.%:表示任意0个或多个字符。可匹配任意类型和长度的字符;
  1. _: 表示任意单个字符。匹配单个任意字符,它常用来限定表达式的字符长度语句;
  • 3.[ ]:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个;
  • 4.[^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
  • 注意:
  • 查询内容包含通配符时,由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句不能正常实现,而把特殊字符用“[ ]”括起便可正常查询。

疑问1. ${} 与 #{}之间的区别

  • 1.#{} 将传入的数据当做一个字符串,会自动对穿入的数据加一个双引号。
  • 2.${} 将穿入的数据直接显示生成在SQL语句中。
  • 3.#{}是预编译处理,${}是字符串替换。
  • 4.Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

综上,#{} 能防止SQL注入,${}无法防止注入。
拓展:所谓的SQL注入,也就是通过吧SQL命令插入WEB表单提交或者属于域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力。比如:影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的。这里先不深入细说。

对于模糊查询,高效率写法:

  • 1.LOCATE
    语法:LOCATE(‘substr’,str,pos)
    说明:
    若pos不存在,返回substr在str中第一次出现的位置,如果substr在str中不存在,返回值为 0 。
    若pos存在,返回substr在str第pos个位置后第一次出现的位置,如果substr在str中不存在,返回值为0。
    模糊查询,SQL写法:
SELECT `column` FROM `table` WHERE LOCATE('keyword', `field`)>0;

demo:

SELECT
  *
FROM
  `user`
WHERE
  LOCATE( 'a', `name` ) > 0

结果如下:

  • 2.POSITION
    语法:POSITION(‘substr’ IN field)
    position可以看做是locate的别名,功能跟locate一样
    模糊查询,SQL写法:
SELECT `column` FROM `table` WHERE POSITION('keyword' IN `filed`);

demo:

SELECT
  *
FROM
  `user`
WHERE
  POSITION( 'a' IN `name` )

结果如下:

  • 3.INSTR

语法:INSTR(str,‘substr’)
说明:功能跟instr一样
模糊查询,SQL写法:

SELECT `column` FROM `table` WHERE INSTR(`field`, 'keyword' )>0;

demo:

SELECT
  -
FROM
  `user`
WHERE
  INSTR ( `name`, 'a' )> 0

结果如下:

  • 4.FIND_IN_SET
    语法:FIND_IN_SET(str1,str2)
    说明:返回str2中str1所在的位置索引,其中str2必须以","分割开。
    模糊查询,SQL写法:
SELECT `column` FROM `table` WHERE FIND_IN_SET('keyword', `filed`);

demo:

SELECT
  *
FROM
  `user`
WHERE
  FIND_IN_SET('admin', `name` )

结果如下:

1.2.微服务在服务器运行自动关闭

基于SpringSecurity + Spring OAuth2 + JWT权限认证的微服务,考虑本地内存不够,想着先将注册中心 Eurake 和 授权认证中心 UAA-server先放到服务器上运行,本地单独运行 资源中心,远程调用授权中心,缓解本地笔记本内存不够的问题。

2.1.1.本地微服务打成JAR

将 将注册中心 Eurak-server 和 授权认证中心 UAA-server 打成可运行Jar包。
在这里,在服务器上运行遇到两个问题,记录一下问题和解决办法。

  • (1)使用 java -jar uaa-service-0.0.1-SNAPSHOT.jar & 运行,会将打印信息显示在控制台。
    解决办法: 将打印的信息转移到一个文件,使用命令如下:
    java -jar uaa-service-0.0.1-SNAPSHOT.jar >uaa.txt &
  • (2)使用 java -jar uaa-service-0.0.1-SNAPSHOT.jar >uaa.txt &,会让微服务自动关闭。
    查看日志,发现关闭点信息如下:
    授权中心 uaa-server 日记记录:
    2018-12-27 23:03:50.445 [32mINFO [0;39m [34m20823[0;39m — [Thread-9 ] [36mo.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [0;39m : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@704d6e83: startup date [Thu Dec 27 22:09:24 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@3ecf72fd

2018-12-27 23:03:50.447 [32mINFO [0;39m [34m20823[0;39m — [Thread-9 ] [36mo.s.c.n.e.serviceregistry.EurekaServiceRegistry [0;39m : Unregistering application uaa-service with eureka with status DOWN

注册中心,关闭信息如下:
2018-12-27 23:03:50.465 INFO 20036 — [nio-8761-exec-6] c.n.e.registry.AbstractInstanceRegistry : Registered instance UAA-SERVICE/izwz9ivjuzijxaguw5ni8kz:uaa-service:7777 with status DOWN (replication=false)

2018-12-27 23:03:50.487 INFO 20036 — [ Thread-15] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@60c6f5b: startup date [Thu Dec 27 22:08:45 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@66048bfd

2018-12-27 23:03:50.488 INFO 20036 — [ Thread-15] o.s.c.n.e.s.EurekaServiceRegistry : Unregistering application unknown with eureka with status DOWN

找到相关资料,原因是 可运行jar启动方式的问题:
https://stackoverflow.com/questions/35882496/why-does-my-spring-boot-app-shutdown-by-itself

1.2.2 nohup 和 & 的区别

我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

所以这就是前面jar在服务器上运行,只要终端一关闭就会关掉应用程序的问题。

再对下面两个命令学习下:

  • (1)nohup是永久执行
    运行 nohup --help
    Run COMMAND, ignoring hangup signals. 可以看到是“运行命令,忽略挂起信号”,然后会发现,nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行。
  • (2)&是指在后台运行
    &是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出。
    所以这也就是 退出终端之后,服务会自动关闭的问题。
  • 综上,永久的在后台执行的命令为: nohup COMMAN
    使用命令如下:
    java -jar eureka-server-0.0.1-SNAPSHOT.jar >nohup command > eureka.txt 2>&1 &
  • 解析: 2>&1
command >out.file 2>&1 &

command>out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。
2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个&, 是让该命令在后台执行。
试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.

1.2.3 disown

场景:
我们已经知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?

解决方法:
这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。让我们来看一下 disown 的帮助信息:

disown [-ar] [-h] [jobspec …]

灵活运用 CTRL-z
在我们的日常工作中,我们可以用 CTRL-z 来将当前进程挂起到后台暂停运行,执行一些别的操作,然后再用 fg 来将挂起的进程重新放回前台(也可用 bg 来将挂起的进程放在后台)继续运行。这样我们就可以在一个终端内灵活切换运行多个任务,这一点在调试代码时尤为有用。因为将代码编辑器挂起到后台再重新放回时,光标定位仍然停留在上次挂起时的位置,避免了重新定位的麻烦。

用disown -h jobspec来使某个作业忽略HUP信号。
用disown -ah 来使所有的作业都忽略HUP信号。
用disown -rh 来使正在运行的作业忽略HUP信号。
需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。

但是还有一个问题,这种方法的操作对象是作业,如果我们在运行命令时在结尾加了"&"来使它成为一个作业并在后台运行,那么就万事大吉了,我们可以通过jobs命令来得到所有作业的列表。但是如果并没有把当前命令作为作业来运行,如何才能得到它的作业号呢?答案就是用 CTRL-z(按住Ctrl键的同时按住z键)了!

CTRL-z 的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,再用bg jobspec来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,请慎用此方法。

学习链接:
https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/index.html

猜你喜欢

转载自blog.csdn.net/nvluco/article/details/86254390
今日推荐