python常用模块

模块:本质上就是一个.py文件

模块分为三部分:内置模块、第三方模块、自定义模块

一、time模块

  1.时间表示形式

  在python中,通常有三种方式来表示时间:

  (1)时间戳(timestamp):时间戳表示的是从1970年1月1日00:00:00开始按秒计算的,是folat类型。

  (2)格式化的时间字符串(Format String): ‘2017-06-21

python常用模块_第1张图片

  (3)结构化时间:共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

  2.时间形式的转换

 

python常用模块_第2张图片

复制代码
import time
# time.time()    #仅仅显示当前时间的时间戳

# time.localtime()    #结构化时间对象     将时间戳转化为结构化时间

# time.gmtime()     #世界标准时间(UTC时间)

# time.mktime(time.localtime())   #将结构化时间转换成时间戳

# time.strftime('%Y-%m-%d',time.localtime())    #将结构化时间转换成字符串时间

# time.strptime('1990-03-12','%Y-%m-%d')         #将字符串时间转换为结构化时间

# time.asctime()      #将结构化时间----->字符串时间
# time.ctime()        #将时间戳----->字符串时间
复制代码

 二、random模块

复制代码
import random
print(random.random()) #(0,1)float类型

print(random.randint(1,3))     #[1,3]  int类型

print(random.randrange(1,3))      #[1,3) int类型,顾头不顾尾

print(random.choice([12,23,'hello']))       #随机取列表中的内容

print(random.sample([12,23,'hello',134],2))     #随机取列表中某两个内容

print(random.uniform(1,3))  #float 取1-3中的浮点整型

l=[11,22,33,44]
random.shuffle(l)       #打乱次序
print(l)

1. 生成一个6位数字+字母的验证码 (面试题)

import random

l = []
for i in range(6):
alpha = chr(random.randint(65,90))
alpha_lower = chr(random.randint(97,122))
num = str(random.randint(0,9))
ret = random.choice([alpha,num,alpha_lower])
l.append(ret)
print(''.join(l))

三、hashlib

  1、算法介绍

  python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

  摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为为一个长度固定的数据串(通常用16进制的字符串表示)。

  摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

  摘要算法制作一能指出数据是否被篡改过,就是因为摘要甘薯是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同

  以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

import hashlib

md5_obj=hashlib.md5()

md5_obj.update(b'hellowold')    #摘要内容

# digest返回内容hex返回形式(16进制)
print(md5_obj.hexdigest())      
#得到结果950a06c97a36396c573849ad7061ffcd

  如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的

md5 = hashlib.md5()
md5.update('how to use md5 in ')
md5.update('python hashlib?')
print md5.hexdigest()

  2.摘要算法的应用

  摘要算法应用:文件一致性校验,登录

  任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中:

name    | password
--------+----------
michael | 123456
bob     | abc999
alice   | alice2008

  如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:

username | password
---------+---------------------------------
michael  | e10adc3949ba59abbe56e057f20f883e
bob      | 878ef96e86145580c38c87f0410ad153
alice    | 99b1c2188db85afee403b1536010c2c9

  考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:

'e10adc3949ba59abbe56e057f20f883e': '123456'
'21218cca77804d2ba1922c33e0151105': '888888'
'5f4dcc3b5aa765d61d8327deb882cf99': 'password'

  这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。

  对于用户来讲,当然不要使用过于简单的口令。但是,我们能否在程序设计上对简单口令加强保护呢?

  由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:

hashlib.md5("salt".encode("utf8"))

  经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

  但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?

  如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。

  摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

四、os模块

  os模块是与操作系统交互的一个接口

  

复制代码
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()  删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')  获取文件/目录信息
os.path.abspath(path)  返回path规范化的绝对路径
os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
复制代码

 五、sys模块

复制代码
sys.argv           命令行参数List,第一个元素是程序本身路径,之后可以添加元素,python会以列表的方式返回
sys.exit(n)        退出程序,正常退出时exit(0)
sys.version        获取Python解释程序的版本信息
sys.maxint         最大的Int值
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       返回操作系统平台名称
复制代码

六、logging模块

1.函数式简单配置

复制代码
import logging  
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')  
复制代码

默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。

灵活配置日志级别,日志格式,输出位置:

 
import logging  
logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                    datefmt='%a, %d %b %Y %H:%M:%S',  
                    filename='/tmp/test.log',  
                    filemode='w')  
  
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')

配置参数 

logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

配置参数

 

2.logger对象配置

import logging

logger = logging.getLogger()
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')

# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

fh.setFormatter(formatter)        #为输出流设置格式
ch.setFormatter(formatter)

logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)

logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别。

七、序列化模块

  1.什么是序列化

  我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

  2.json模块

  如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

  JSON表示的对象就是标准的JavaScript语言的对象一个子集,JSON和Python内置的数据类型对应如下:

  python常用模块_第3张图片

import json

json.dumps()    #序列化
json.loads()    #反序列化
#=====================序列化============
dic={'name':'sam',"age":18}

f=open('json_data.txt','w')

data=json.dumps(dic)
print(data)
print(type(data))
f.write(data)
f.close()
#====================================== json.dump(dic,f) #1.data=json.dumps(dic) 2.f.write(data) #==================反序列化============= f=open('json_data.txt','r') data=f.read() dic=json.loads(data) print(dic) print(type(dic))
#========================================= json.load(f) #1.data=f.read() 2.dic=json.loads(data) #=================反序列化练习======= import json f=open("test",'r') data=f.read() dic=json.loads(data) print(dic) print(type(dic))

 八、re模块

  就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

  字符匹配(普通字符,元字符):

  1 普通字符:大多数字符和字母都会和自身匹配
              >>> re.findall('alvin','yuanaleSxalexwupeiqi')
                      ['alvin'] 

  2 元字符:. ^ $ * + ? { } [ ] | ( ) \

  一、元字符

  1.表示开头结尾的元字符
  ^---------从字符串开始位置匹配,加在元素前面
  $---------从字符串结尾位置匹配,加在元素后面
  .(点)-------通配符,匹配除换行符(/n)以外的任何字符
  如果想让点匹配换行符,可以使用re.S切换模式来实现
 
  2.表示重复的元字符
  *(星) [0,无穷]------将前面的符号匹配0到无穷次
  +     [1,无穷]------将前面的符号匹配1到无穷次
  ?    [0,1]---------将前面的符号匹配0到1次
  {}     [n,m]---------将前面的符号匹配n到m次    也可指定一个数字表示匹配n次
  {} 可以模拟上面的*+?
import re

ret1=re.findall('李.*','李杰\nalex\n李莲英\negon\nalvin\n李二棍子')
ret2=re.findall('李.+','李杰\nalex\n李莲英\negon\nalvin\n李二棍子')

ret3=re.findall('(李.{1,2})\n','李杰\nalex\n李莲英\negon\nalvin\n李二棍子') # 设定优先级的原因

# 匹配一个数字包括整型和浮点型
ret4=re.findall('\d+\.?\d*','12.45,34,0.05,109')

print(ret4)
  贪婪匹配:有多少匹配多少
  非贪婪匹配:\d+?把所有的数字当做一个数字去匹配
  3.转义符:\
  (1)反斜杠后边跟元字符去除特殊功能,比如\.
  (2)反斜杠后边跟普通字符实现特殊功能,比如\d
\d  匹配任何十进制数;      它相当于类 [0-9]。
\D  匹配任何非数字字符;    它相当于类 [^0-9]。
\s  匹配任何空白字符;      它相当于类 [ \t\n\r\f\v]。
\S  匹配任何非空白字符;    它相当于类 [^ \t\n\r\f\v]。
\w  匹配任何字母数字字符;   它相当于类 [a-zA-Z0-9_]。
\W  匹配任何非字母数字字符; 它相当于类 [^a-zA-Z0-9_]
\b  匹配一个特殊字符边界,比如空格 ,&,#等

  \b的应用:

ret=re.findall(r'I\b','I am LIST')
print(ret)#['I']
  二、分组:()
  ():可以把字符分组,匹配完成之后只显示分组内的内容
  如果想要显示全部匹配到的内容(?:)要在括号里加?:,就是取消优先级
  命名分组:(?P<分组名字>分组内容)
m = re.findall(r'(ad)+', 'add')
print(m)
 
ret=re.search('(?P\d{2})/(?P\w{3})','23/com')
print(ret.group())#23/com
print(ret.group('id'))#23
 
  三、字符集
  [ ]:字符集:用来表示或的意思,在字符集里可以有多个字符
 
  #注意:*,+.等元字符在字符集里都是普通符号,
 
  还有特殊意义的有:
  -(杠)----------可以代表范围:如[1-9]
  ^ ----------在字符集里代表取反的意思
  \  ----------转义
#--------------------------------------------字符集[]
ret=re.findall('a[bc]d','acd')
print(ret)#['acd']
 
ret=re.findall('[a-z]','acd')
print(ret)#['a', 'c', 'd']
 
ret=re.findall('[.*+]','a.cd+')
print(ret)#['.', '+']
 
#在字符集里有功能的符号: - ^ \
 
ret=re.findall('[1-9]','45dha3')
print(ret)#['4', '5', '3']
 
ret=re.findall('[^ab]','45bdha3')
print(ret)#['4', '5', 'd', 'h', '3']
 
ret=re.findall('[\d]','45bdha3')
print(ret)#['4', '5', '3']

  四、贪婪匹配

贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
string pattern1 = @"a.*c";   // greedy match 
Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abcabc"
非贪婪匹配:在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配

string pattern1 = @"a.*?c";   // non-greedy match 
Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abc"
几个常用的非贪婪匹配Pattern
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
.*?的用法:
--------------------------------

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x

就是取前面任意长度的字符,直到一个x出现
  五、re模块下的常用方法
import re

re.findall('a','alvin yuan')    #返回所有满足匹配条件的结果,放在列表里

re.search('a','alvin yuan').group()  

#函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
 


re.match('a','abc').group()     #同search,不过尽在字符串开始处进行匹配
 

ret=re.split('[ab]','abcd')     #先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割

print(ret)#['', '', 'cd']
 

ret=re.sub('\d','abc','alvin5yuan6',1)

ret=re.subn('\d','abc','alvin5yuan6')



obj=re.compile('\d{3}')
ret=obj.search('abc123eeee')
print(ret.group())#123


import re
ret=re.finditer('\d','ds3sy4784a')
print(ret)        #
 
print(next(ret).group())
print(next(ret).group())

注意:

1 findall的优先级查询:

import re
 
ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(ret)#['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
 
ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(ret)#['www.oldboy.com']

2 split的优先级查询

ret=re.split("\d+","yuan2egon56alex")
print(ret)

ret=re.split("(\d+)","yuan2egon56alex")
print(ret)



爬虫

import requests

import re
import json

def getPage(url):

    response=requests.get(url)
    return response.text

def parsePage(s):
    
    com=re.compile('
.*?
.*?(?P\d+).*?(?P.*?)</span>' '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>',re.S) ret=com.finditer(s) for i in ret: yield { "id":i.group("id"), "title":i.group("title"), "rating_num":i.group("rating_num"), "comment_num":i.group("comment_num"), } def main(num): url='https://movie.douban.com/top250?start=%s&filter='%num response_html=getPage(url) ret=parsePage(response_html) print(ret) f=open("move_info7","a",encoding="utf8") for obj in ret: print(obj) data=json.dumps(obj,ensure_ascii=False) f.write(data+"\n") if __name__ == '__main__': count=0 for i in range(10): main(count) count+=25 爬虫练习 </code></pre> </div> <p>  </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>九、configparser模块</p> <p>  该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。</p> <p>  1.创建文件</p> <div class="cnblogs_code"> <pre>[DEFAULT] ServerAliveInterval = 45 Compression = yes CompressionLevel = 9 ForwardX11 = yes [bitbucket.org] User = hg [topsecret.server.com] Port = 50022 ForwardX11 = no</pre> </div> <p>如果想用python生成一个这样的文档怎么做呢?</p> <div class="cnblogs_code"> <pre>import configparser config = configparser.ConfigParser() config["DEFAULT"] = {'ServerAliveInterval': '45', 'Compression': 'yes', 'CompressionLevel': '9', 'ForwardX11':'yes' } config['bitbucket.org'] = {'User':'hg'} config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'} with open('example.ini', 'w') as configfile: config.write(configfile)</pre> </div> <p>  2.查找文件</p> <div class="cnblogs_code"> <pre>import configparser config = configparser.ConfigParser() #---------------------------查找文件内容,基于字典的形式 print(config.sections()) # [] config.read('example.ini') print(config.sections()) # ['bitbucket.org', 'topsecret.server.com'] print('bytebong.com' in config) # False print('bitbucket.org' in config) # True print(config['bitbucket.org']["user"]) # hg print(config['DEFAULT']['Compression']) #yes print(config['topsecret.server.com']['ForwardX11']) #no print(config['bitbucket.org']) #<Section: bitbucket.org> for key in config['bitbucket.org']: # 注意,有default会默认default的键 print(key) print(config.options('bitbucket.org')) # 同for循环,找到'bitbucket.org'下所有键 print(config.items('bitbucket.org')) #找到'bitbucket.org'下所有键值对 print(config.get('bitbucket.org','compression')) # yes get方法取深层嵌套的值</pre> </div> <p>  3.增删改操作</p> <div class="cnblogs_code"> <pre>import configparser config = configparser.ConfigParser() config.read('example.ini') config.add_section('yuan') config.remove_section('bitbucket.org') config.remove_option('topsecret.server.com',"forwardx11") config.set('topsecret.server.com','k1','11111') config.set('yuan','k2','22222') config.write(open('new2.ini', "w"))</pre> </div> <p> </p> <p>十、subprocess模块</p> <p>  subprocess模块允许一个进程创建一个新的子进程,通过管道连接到子进程的stdin/stdout/stderr,获取子进程的返回值等操作。 </p> <p>  1.简单命令</p> <div class="cnblogs_code"> <div class="cnblogs_code_toolbar">   </div> <pre>import subprocess # 创建一个新的进程,与主进程不同步 if in win: s=subprocess.Popen('dir',shell=True) s=subprocess.Popen('ls') s.wait() # s是Popen的一个实例对象 print('ending...') </pre> <div class="cnblogs_code_toolbar">   </div> </div> <p>  2.命令带参数</p> <p>  linux:</p> <div class="cnblogs_code"> <pre>import subprocess subprocess.Popen('ls -l',shell=True) #subprocess.Popen(['ls','-l'])</pre> </div> <p>  3.控制子进程</p> <p>  当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。刚才我们使用到了一个wait方法</p> <p>  此外,你还可以在父进程中对子进程进行其它操作:</p> <div class="cnblogs_code"> <div class="cnblogs_code_toolbar">   </div> <pre>s.poll() # 检查子进程状态 s.kill() # 终止子进程 s.send_signal() # 向子进程发送信号 s.terminate() # 终止子进程 s.pid:子进程号</pre> <div class="cnblogs_code_toolbar">   </div> </div> <p>  4.子进程文本流控制</p> <p>  可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用    subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe):</p> <div class="cnblogs_code"> <pre>import subprocess # s1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE) # print(s1.stdout.read()) #s2.communicate() s1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE) s2 = subprocess.Popen(["grep","0:0"],stdin=s1.stdout, stdout=subprocess.PIPE) out = s2.communicate() print(out)</pre> </div> <p>  ubprocess.PIPE实际上为文本流提供一个缓存区。s1的stdout将文本输出到缓存区,随后s2的stdin从该PIPE中将文本读取走。s2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本。<br>  注意:communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成</p> </div> <p>转载于:https://www.cnblogs.com/gpd-Amos/p/7872724.html</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1520949539538796544"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(json,数据库,shell)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1833371244221788160.htm" title="联合唯一索引其中一个为Null,多条同样的数据为什么不会冲突" target="_blank">联合唯一索引其中一个为Null,多条同样的数据为什么不会冲突</a> <span class="text-muted">Amagi.</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在数据库中,联合唯一索引(CompositeUniqueIndex)是由两个或多个列组合而成的主键,用于唯一标识表中的每一行。当一个联合唯一索引的某个字段为NULL时,涉及到的关键问题在于,NULL值的唯一性是不同于其他值的。1.NULL的语义在SQL中,NULL被认为是“未知”的而非简单的空值。在大多数数据库管理系统(DBMS)中,NULL值的比较结果是“未知”,并且两个NULL被认为是不同的。</div> </li> <li><a href="/article/1833369859417796608.htm" title="MyBatis如何实现分页" target="_blank">MyBatis如何实现分页</a> <span class="text-muted">思静语</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Mybatis/1.htm">Mybatis</a><a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>文章目录MyBatis分页方式对比使用数据库厂商提供的分页查询语句通过自定义SQL实现分页逻辑1.使用RowBounds实现分页2.使用PageHelper实现分页数组分页使用MyBatis-Plus进行分页MyBatis物理分页和逻辑分页MyBatis手写一个拦截器分页在MyBatis中实现分页通常有两种方式:使用数据库厂商提供的分页查询语句(如MySQL的LIMIT)或者通过自定义SQL来实现</div> </li> <li><a href="/article/1833363051903021056.htm" title="中间件是什么" target="_blank">中间件是什么</a> <span class="text-muted">Amagi.</span> <a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a> <div>中间件是指在操作系统和应用程序之间提供服务的软件层。它充当了不同软件组件之间的桥梁,帮助它们进行通信和数据管理。中间件的主要目的是简化和加速应用程序的开发过程,提供通用的功能和服务,使开发者能够专注于业务逻辑而不是底层的技术细节。中间件的主要功能通信:中间件提供了不同应用程序或服务之间的通信机制,支持消息传递、远程过程调用(RPC)等。数据管理:中间件可以处理数据的存储、检索和管理,通常与数据库系</div> </li> <li><a href="/article/1833356500005908480.htm" title="Springboot项目中使用druid实现多数据源和动态数据源,因数据库不可用导致的项目挂起的处理方案" target="_blank">Springboot项目中使用druid实现多数据源和动态数据源,因数据库不可用导致的项目挂起的处理方案</a> <span class="text-muted">LOVE_DDZ</span> <a class="tag" taget="_blank" href="/search/Spring-Boot/1.htm">Spring-Boot</a><a class="tag" taget="_blank" href="/search/Mybatis/1.htm">Mybatis</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>Springboot项目中使用druid因数据库不可用导致的项目挂起的处理方案在SpringBoot项目中使用Druid实现多数据源和动态数据源管理是一个常见的场景。通过合理的配置和错误处理机制,您可以有效地管理数据源,避免因数据库不可用而导致整个项目挂起。1.配置多数据源在application.yml或application.properties中配置多个数据源信息:spring:dataso</div> </li> <li><a href="/article/1833354860293091328.htm" title="easyCode 插件使用" target="_blank">easyCode 插件使用</a> <span class="text-muted">天珩</span> <a class="tag" taget="_blank" href="/search/%E4%BB%8A%E6%97%A5%E6%89%80%E5%BE%97/1.htm">今日所得</a><a class="tag" taget="_blank" href="/search/%E8%BD%AE%E5%AD%90/1.htm">轮子</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/intellij/1.htm">intellij</a><a class="tag" taget="_blank" href="/search/idea/1.htm">idea</a> <div>easyCode插件介绍easyCode插件能够生成mapper.xml、mapper.java、service、serviceImpl、controller文件,避免手写;而且对比mybatisGenerator可以自动的把数据库的注释生成为字段的注释,可以方便的通过修改模板的方式控制生成的文件使用步骤一、使用idea连接上数据库连接有问题的,参考文章https://www.cnblogs.co</div> </li> <li><a href="/article/1833354355470856192.htm" title="python调用rocketmq的api_Python:Rocketmq消息队列使用" target="_blank">python调用rocketmq的api_Python:Rocketmq消息队列使用</a> <span class="text-muted">weixin_39914868</span> <div>rocketmq可以与kafka等一起使用,用于实时消息处理。安装rocketmq:pipinstallrocketmq[-ihttps://pypi.tuna.tsinghua.edu.cn/simple]生产消息producer:fromrocketmq.clientimportProducer,Messageimportjsonproducer=Producer('PID-test')pro</div> </li> <li><a href="/article/1833346539678953472.htm" title="iOS同时适配iPad横屏和iPhone竖屏" target="_blank">iOS同时适配iPad横屏和iPhone竖屏</a> <span class="text-muted">may_he</span> <a class="tag" taget="_blank" href="/search/IOS/1.htm">IOS</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91/1.htm">开发</a><a class="tag" taget="_blank" href="/search/ipad/1.htm">ipad</a><a class="tag" taget="_blank" href="/search/iphone/1.htm">iphone</a><a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/%E5%B1%8F%E5%B9%95%E6%96%B9%E5%90%91/1.htm">屏幕方向</a> <div>iPad横屏、iPhone竖屏1、启动页LaunchImage新建一个ImageSet,并且命名为LaunchImage(或者其他的名字),准备iPad横屏、iPhone竖屏的启动页,然后在Finder中打开LaunchImage.imageset找到Contents.json,然后修改内容{"images":[{"filename":"iPhone.png","idiom":"iphone","</div> </li> <li><a href="/article/1833342135999492096.htm" title="感恩单7.28" target="_blank">感恩单7.28</a> <span class="text-muted">krysdracula</span> <div>1.感谢妈妈,给我做了可口的饭菜2.感谢闹钟叫我起床3.感谢今天凉快的天气,好大的风4.感谢电脑工作5.感谢视频课学习6.感谢爸爸带的芒果,还有好吃的7.感谢今天为国争光的运动员们,辛苦啦8.感谢今天也舒服的睡了午觉9.感谢陪我睡觉的娃娃10.感谢迎晨,告诉我另一个数据库的账号今日观想:愿景这两天晚上都效率低,没怎么看论文</div> </li> <li><a href="/article/1833338471582887936.htm" title="Springboot配置文件中账号密码等敏感信息的加解密" target="_blank">Springboot配置文件中账号密码等敏感信息的加解密</a> <span class="text-muted">乌托邦的逃亡者</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/1.htm">软件开发</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>说明:使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性比较低。打开application.properties或application.yml,比如MySQL登录密码,Redis登录密码以及第三方的密钥等等一览无余。这里介绍一个加解密组件jasypt,用以提高配置文件中敏感配置数据的安全性。本文以数据库连接URL、用户名和数据库密码加密为例。一,引入Ma</div> </li> <li><a href="/article/1833332804671336448.htm" title="MySQL 高可用性架构:复制与分片" target="_blank">MySQL 高可用性架构:复制与分片</a> <span class="text-muted">墨瑾轩</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/adb/1.htm">adb</a> <div>关注墨瑾轩,带你探索编程的奥秘!超萌技术攻略,轻松晋级编程高手技术宝库已备好,就等你来挖掘订阅墨瑾轩,智趣学习不孤单即刻启航,编程之旅更有趣嗨,小伙伴们!今天我们要聊的是一个超级重要的话题——如何通过复制和分片技术来构建MySQL的高可用性架构。想象一下,你的数据库就像是一座城堡,里面藏满了宝贵的用户数据。为了保护这座城堡,我们需要建立一整套防御体系,确保数据安全无虞,而且即便遇到突发状况也能迅速</div> </li> <li><a href="/article/1833321507116380160.htm" title="随笔记录git提交出错和原生js以JSON格式请求接口导出Excel" target="_blank">随笔记录git提交出错和原生js以JSON格式请求接口导出Excel</a> <span class="text-muted">山丘lemon</span> <div>GIT提交代码出错Fileexists.原文链接https://www.cnblogs.com/sweetbullet/p/9889997.html前端js导出,参数以json格式发送post请求原文链接https://www.cnblogs.com/sweetbullet/p/9843178.html</div> </li> <li><a href="/article/1833318308825362432.htm" title="JSON parse error: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t)" target="_blank">JSON parse error: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t)</a> <span class="text-muted">Chen__Wu</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a> <div>JSONparseerror:Illegalcharacter((CTRL-CHAR,code31)):onlyregularwhitespace(\r,\n,\t)isallowedbetweentokens;nestedexceptioniscom.fasterxml.jackson.core.JsonParseException:Illegalcharacter((CTRL-CHAR,cod</div> </li> <li><a href="/article/1833313892722372608.htm" title="XSS和sql注入部分场景测试用例样例" target="_blank">XSS和sql注入部分场景测试用例样例</a> <span class="text-muted">谷隐凡二</span> <a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95/1.htm">测试</a><a class="tag" taget="_blank" href="/search/xss/1.htm">xss</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B/1.htm">测试用例</a> <div>目录1.SQL注入测试用例设计基本SQL注入复杂SQL注入盲注测试2.XSS攻击测试用例设计基本XSS攻击复杂XSS攻击DOM-basedXSS1.SQL注入测试用例设计SQL注入攻击通常通过在输入字段中插入恶意SQL代码,试图操纵数据库查询。设计这些测试用例时,需要涵盖各种常见的SQL注入技术。基本SQL注入用例1:使用单引号:输入:'OR'1'='1预期结果:应拒绝输入并返回错误消息,不应允许</div> </li> <li><a href="/article/1833313638568521728.htm" title="Navicat和SQLynx产品功能比较二(SQL查询)" target="_blank">Navicat和SQLynx产品功能比较二(SQL查询)</a> <span class="text-muted">chat2tomorrow</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/sqlynx/1.htm">sqlynx</a><a class="tag" taget="_blank" href="/search/ide/1.htm">ide</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>数据库管理工具最常用的功能就是SQL的查询,没有之一。本文针对Navicat和SQLynx做了SQL查询相关的性能测试,从测试结果来看,Navicat主要适合开发类的小型数据量需求,SQLynx可以适应大型数据量或小型数据量的需求,用户可以根据自己的实际需求做一些不同的对比测试。目录1性能比较2测试示例3总结Navicat是一款功能强大的数据库管理和开发工具,广泛用于各类数据库的管理和操作。它支持</div> </li> <li><a href="/article/1833302170250866688.htm" title="vue 项目代码架构" target="_blank">vue 项目代码架构</a> <span class="text-muted">王小工</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Vue项目的代码架构通常遵循一定的组织结构和约定,以提高项目的可维护性、可扩展性和可读性。以下是对Vue项目代码架构的详细解析:一、项目目录结构Vue项目的目录结构通常包括以下几个关键部分:根目录:package.json:npm包配置文件,定义了项目的npm脚本、依赖包等信息。README.md:项目的说明文档,markdown格式。.gitignore:git上传需要忽略的文件配置。其他配置文</div> </li> <li><a href="/article/1833297001891065856.htm" title="MYSQL:DDL数据定义语言" target="_blank">MYSQL:DDL数据定义语言</a> <span class="text-muted">公子龍.</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>数据库基本操作:DDL数据定义语言–1、DDL操作之数据库操作(不区分大小写)–查看所有数据库showdatabases;–创建数据库createdatabasemydb1;createdatabaseifnotexistsmydb1;–选择使用哪一个数据库usemydb1;–删除数据库dropdatabasemydb1;dropdatabaseifexistsmydb1;–修改数据库编码alte</div> </li> <li><a href="/article/1833294104189038592.htm" title="oracle tab 被删除,oracle数据库被注入恶意攻击程序导致tab$被删除恢复方案" target="_blank">oracle tab 被删除,oracle数据库被注入恶意攻击程序导致tab$被删除恢复方案</a> <span class="text-muted">白药葫芦</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/tab/1.htm">tab</a><a class="tag" taget="_blank" href="/search/%E8%A2%AB%E5%88%A0%E9%99%A4/1.htm">被删除</a> <div>by蔡建良2019-2-25经过长时间摸索,参考网上各类文章。今天终于让我成功恢复了oracle的sys.tab$表,并成功打开了数据库。将此过程记录下来,与大家共享。如有疑问可联系我QQ:304125648sys.tab$表的恢复要点如下:1)Tab$表删除后在行记录头部会标记0x7c,没删除前是0x6c。因此只要将找到所有tab$行记录将第一个字节改为0x6c就成功一大半的。此处建议在linu</div> </li> <li><a href="/article/1833293725678268416.htm" title="oracle 恢复tab$,[20190225]删除tab$记录的恢复5.txt" target="_blank">oracle 恢复tab$,[20190225]删除tab$记录的恢复5.txt</a> <span class="text-muted">爱的巴掌</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%81%A2%E5%A4%8Dtab%24/1.htm">恢复tab$</a> <div>[20190225]删除tab$记录的恢复5.txt--//昨天下午看了链接https://blog.csdn.net/Enmotech/article/details/87834503,大概知道对方删除tab$记录的恢复方法.--//实际上就是"狸猫换太子"的方法,利用好的数据库的对应块覆盖坏数据库的对应块,再启动数据库.然后利用删除前的tab$的备份--//数据导入tab$,然后解决数据字典不</div> </li> <li><a href="/article/1833292715392069632.htm" title="druid 连接gbase8s数据库问题记录" target="_blank">druid 连接gbase8s数据库问题记录</a> <span class="text-muted">gbase_lmax</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>在druid1.2.16以及之前版本中,可以允许dbType=null,不影响数据库连接使用在druid1.2.17以及之后版本中,已经不允许dbType=null代码差异如下1.2.16if(connectTimeout>0){if(isMySql){if(connectTimeoutStr==null){connectTimeoutStr=Integer.toString(connectTim</div> </li> <li><a href="/article/1833290194548256768.htm" title="druid连接数据库报错" target="_blank">druid连接数据库报错</a> <span class="text-muted">Aliyev</span> <a class="tag" taget="_blank" href="/search/MySQL/1.htm">MySQL</a><a class="tag" taget="_blank" href="/search/%E8%BF%9E%E6%8E%A5%E9%94%99%E8%AF%AF/1.htm">连接错误</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E5%8C%BA%E9%97%AE%E9%A2%98/1.htm">时区问题</a><a class="tag" taget="_blank" href="/search/%E7%89%88%E6%9C%AC%E5%8C%B9%E9%85%8D/1.htm">版本匹配</a><a class="tag" taget="_blank" href="/search/jar%E5%8C%85/1.htm">jar包</a> <div>信息:{dataSource-1}inited10月21,20229:26:36下午com.alibaba.druid.support.logging.JakartaCommonsLoggingImplerror严重:createconnectionSQLException,url:jdbc:mysql://localhost:3306/db1,errorCode0,state01S00java.</div> </li> <li><a href="/article/1833287293931188224.htm" title="数据库的介绍:关系型数据库和非关系型数据库究竟是什么?" target="_blank">数据库的介绍:关系型数据库和非关系型数据库究竟是什么?</a> <span class="text-muted">一名在八月份找工作的测试员</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/nosql/1.htm">nosql</a> <div>1.数据库是什么?数据库(DB)是按照一定数据结构存储数据的仓库2.数据库管理系统是什么?数据库管理系统(DBMS)是操纵和管理数据库的一套软件。市面上主流的有Mysql/oracle/sqlserver3.数据库管理系统又可以分为哪些类型?数据库管理系统可以分为:关系型与非关系型①关系型数据库管理系统(RDBMS)-----适用于二维表格常见的系统有:oracle/mysql/sqlserver</div> </li> <li><a href="/article/1833284897666592768.htm" title="mongoDB 对一个做了索引的字段,要不要给默认值?" target="_blank">mongoDB 对一个做了索引的字段,要不要给默认值?</a> <span class="text-muted">hongkid</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>引言在设计数据库模式时,如何处理字段的默认值是一个值得深入探讨的话题。对于MongoDB这样的NoSQL数据库来说,灵活性是其一大特点,但这同时也意味着开发者需要更加谨慎地考虑数据的一致性和完整性。本文将探讨在一个已创建索引的字段上,在插入文档时是否应该显式设置默认值的问题,并给出具体的建议。MongoDB中的索引与字段设置在MongoDB中,索引可以帮助提高查询性能,特别是在处理大规模数据集时。</div> </li> <li><a href="/article/1833284771459985408.htm" title="MongoDB-聚合查询操作介绍" target="_blank">MongoDB-聚合查询操作介绍</a> <span class="text-muted">侯晓阳丶</span> <a class="tag" taget="_blank" href="/search/MongoDB/1.htm">MongoDB</a><a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/dba/1.htm">dba</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>目录前言db.collection.aggregate()db.collection.aggregate()示例一db.collection.aggregate()示例二复杂的聚合操作通过mongoimport导入测试数据复杂的聚合操作示例聚合操作的偏好设置-project函数聚合操作的偏好设置-unwind函数前言MongoDB聚合操作相当于关系型数据库SQL语句的"groupby"、“orde</div> </li> <li><a href="/article/1833284518258241536.htm" title="SpringBoot操作GBase8s数据库示例" target="_blank">SpringBoot操作GBase8s数据库示例</a> <span class="text-muted">迷你世界~爱丽丝</span> <div>SpringBoot+Hibernate(Jpa)操作GBase8s数据库示例GBase8s数据库是国产事务型数据库,目前已在各领域广泛应用,本篇使用当下主流的J2EE框架Springboot集成Hibernate(Jpa),对GBasse8S数据库CRUD操作进行讲解。1.技术点JPA是JAVA标准持久化API,是SUN公司推出的一套基于ORM的规范;Hibernate是对JPA(ORM规范)的</div> </li> <li><a href="/article/1833284519180988416.htm" title="Oracle GoldenGate(OGG)-Oracle数据库迁移到MySQL数据库(全量+增量)" target="_blank">Oracle GoldenGate(OGG)-Oracle数据库迁移到MySQL数据库(全量+增量)</a> <span class="text-muted">侯晓阳丶</span> <a class="tag" taget="_blank" href="/search/Oracle/1.htm">Oracle</a><a class="tag" taget="_blank" href="/search/MySQL/1.htm">MySQL</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/dba/1.htm">dba</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%81%E7%A7%BB%E5%AD%A6%E4%B9%A0/1.htm">迁移学习</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>目录前言环境介绍环境准备Oracle环境准备Oracle环境配置方法MySQL环境配置方法表结构转换和导入备份Oracle表结构为SQL文件使用sqlines工具将表结构进行转换安装OracleGoldenGate(OGG)Oracle端安装MySQL端安装创建相关用户MySQL端Oracle端OGG配置参数配置源端oracle-OGG配置目标端MySQL-OGG配置启动进程顺序(重要)相关报错解</div> </li> <li><a href="/article/1833277585405079552.htm" title="数据库的操作:DDL数据定义语言" target="_blank">数据库的操作:DDL数据定义语言</a> <span class="text-muted">一名在八月份找工作的测试员</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>SQL语言的介绍及分类:数据库的操作:SQL语言的介绍-CSDN博客一.介绍DDL:数据定义语言(数据库对象的操作(结构))数据库对象:数据库,表,视图,索引等create(创建)/alter(修改)/drop(删除/销毁)二.语法1.数据库database:没有修改的操作创建数据库:createdatabase数据库名;销毁/删除数据库:DROPDATABASE数据库名;2.表table①创建表</div> </li> <li><a href="/article/1833275445072719872.htm" title="【微服务】springboot 整合 SA-Token 使用详解" target="_blank">【微服务】springboot 整合 SA-Token 使用详解</a> <span class="text-muted">小码农叔叔</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86%E4%B8%8E%E5%AE%9E%E6%88%98/1.htm">微服务治理与实战</a><a class="tag" taget="_blank" href="/search/SA-Token%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/1.htm">SA-Token使用详解</a><a class="tag" taget="_blank" href="/search/sa-token%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/1.htm">sa-token使用详解</a><a class="tag" taget="_blank" href="/search/sa-token/1.htm">sa-token</a><a class="tag" taget="_blank" href="/search/sa-token%E4%BD%BF%E7%94%A8/1.htm">sa-token使用</a><a class="tag" taget="_blank" href="/search/sa-token%E8%AE%A4%E8%AF%81%E6%8E%88%E6%9D%83/1.htm">sa-token认证授权</a><a class="tag" taget="_blank" href="/search/java%E4%BD%BF%E7%94%A8sa-token/1.htm">java使用sa-token</a> <div>目录一、前言二、认证与授权介绍2.1什么是认证2.1.1认证的目的2.1.2认证基本步骤2.2什么是授权2.2.1常用的授权模型三、微服务中常用的认证安全框架3.1SpringSecurity3.1.1SpringSecurity特点3.2JWT(JSONWebTokens)3.2.1JWT特点3.3其他认证安全框架四、SA-Token介绍4.1SA-Token是什么4.2SA-Token特点4.</div> </li> <li><a href="/article/1833274058028969984.htm" title="利用selenium获取cookies,实现浏览器免登陆自动化操作" target="_blank">利用selenium获取cookies,实现浏览器免登陆自动化操作</a> <span class="text-muted">crownyouyou</span> <a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a> <div>###一、设置默认源为国内的清华源(不想设置可跳过一)#查看pip安装源pipconfiglist#清华源pipconfigsetglobal.index-urlhttps://pypi.tuna.tsinghua.edu.cn/simple###二、下载json。(如果下载好json,可以跳过二)如果没下载json,可以使用pip下载pipinstalljson-i https://pypi.t</div> </li> <li><a href="/article/1833266237862408192.htm" title="fastapi(65)- 路由函数指定了 response_model,在返回自定义 JSONResponse 时, 不会限制它返回的数据结构..." target="_blank">fastapi(65)- 路由函数指定了 response_model,在返回自定义 JSONResponse 时, 不会限制它返回的数据结构...</a> <span class="text-muted">小菠萝测试笔记</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>前置知识JSONResponse:https://www.cnblogs.com/poloyy/p/15364445.htmlresponse_model:https://www.cnblogs.com/poloyy/p/15317585.html背景在写辣鸡平台,然后有统一的自定义JSONResponse,所以全部路径函数都是返回自定义JSONResponse的,比如@router.post("</div> </li> <li><a href="/article/1833261570449305600.htm" title="redis" target="_blank">redis</a> <span class="text-muted">AmazingZ-sys</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>Redis简介Redis是完全开源免费的,是一个高性能的key-value数据库。Redis与其他key-value缓存缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash(加密过,exp:JSON格式)等数据结构的存储。Redis支</div> </li> <li><a href="/article/72.htm" title="Java开发中,spring mvc 的线程怎么调用?" target="_blank">Java开发中,spring mvc 的线程怎么调用?</a> <span class="text-muted">小麦麦子</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>今天逛知乎,看到最近很多人都在问spring mvc 的线程http://www.maiziedu.com/course/java/ 的启动问题,觉得挺有意思的,那哥们儿问的也听仔细,下面的回答也很详尽,分享出来,希望遇对遇到类似问题的Java开发程序猿有所帮助。 问题:     在用spring mvc架构的网站上,设一线程在虚拟机启动时运行,线程里有一全局</div> </li> <li><a href="/article/199.htm" title="maven依赖范围" target="_blank">maven依赖范围</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>1.test 测试的时候才会依赖,编译和打包不依赖,如junit不被打包 2.compile 只有编译和打包时才会依赖 3.provided 编译和测试的时候依赖,打包不依赖,如:tomcat的一些公用jar包 4.runtime 运行时依赖,编译不依赖 5.默认compile 依赖范围compile是支持传递的,test不支持传递 1.传递的意思是项目A,引用</div> </li> <li><a href="/article/326.htm" title="Jaxb org.xml.sax.saxparseexception : premature end of file" target="_blank">Jaxb org.xml.sax.saxparseexception : premature end of file</a> <span class="text-muted">darrenzhu</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/premature/1.htm">premature</a><a class="tag" taget="_blank" href="/search/JAXB/1.htm">JAXB</a> <div>如果在使用JAXB把xml文件unmarshal成vo(XSD自动生成的vo)时碰到如下错误: org.xml.sax.saxparseexception : premature end of file 很有可能时你直接读取文件为inputstream,然后将inputstream作为构建unmarshal需要的source参数。InputSource inputSource = new In</div> </li> <li><a href="/article/453.htm" title="CSS Specificity" target="_blank">CSS Specificity</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E6%9D%83%E9%87%8D/1.htm">权重</a><a class="tag" taget="_blank" href="/search/Specificity/1.htm">Specificity</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>  有时候对于页面元素设置了样式,可为什么页面的显示没有匹配上呢? because specificity CSS 的选择符是有权重的,当不同的选择符的样式设置有冲突时,浏览器会采用权重高的选择符设置的样式。     规则:   HTML标签的权重是1 Class 的权重是10 Id 的权重是100 </div> </li> <li><a href="/article/580.htm" title="java与servlet" target="_blank">java与servlet</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>servlet 搞java web开发的人一定不会陌生,而且大家还会时常用到它。 下面是java官方网站上对servlet的介绍: java官网对于servlet的解释 写道 Java Servlet Technology Overview Servlets are the Java platform technology of choice for extending and enha</div> </li> <li><a href="/article/707.htm" title="eclipse中安装maven插件" target="_blank">eclipse中安装maven插件</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>1.首先去官网下载 Maven: http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-3.2.3-bin.tar.gz 下载完成之后将其解压, 我将解压后的文件夹:apache-maven-3.2.3, 并将它放在 D:\tools目录下, 即 maven 最终的路径是:D:\tools\apache-mave</div> </li> <li><a href="/article/834.htm" title="jpa@OneToOne关联关系" target="_blank">jpa@OneToOne关联关系</a> <span class="text-muted">布衣凌宇</span> <a class="tag" taget="_blank" href="/search/jpa/1.htm">jpa</a> <div>Nruser里的pruserid关联到Pruser的主键id,实现对一个表的增删改,另一个表的数据随之增删改。 Nruser实体类 //***************************************************************** @Entity @Table(name="nruser") @DynamicInsert @Dynam</div> </li> <li><a href="/article/961.htm" title="我的spring学习笔记11-Spring中关于声明式事务的配置" target="_blank">我的spring学习笔记11-Spring中关于声明式事务的配置</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1/1.htm">事务</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE/1.htm">配置</a> <div>这两天学到事务管理这一块,结合到之前的terasoluna框架,觉得书本上讲的还是简单阿。我就把我从书本上学到的再结合实际的项目以及网上看到的一些内容,对声明式事务管理做个整理吧。我看得Spring in Action第二版中只提到了用TransactionProxyFactoryBean和<tx:advice/>,定义注释驱动这三种,我承认后两种的内容很好,很强大。但是实际的项目当中</div> </li> <li><a href="/article/1088.htm" title="java 动态代理简单实现" target="_blank">java 动态代理简单实现</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/handler/1.htm">handler</a><a class="tag" taget="_blank" href="/search/proxy/1.htm">proxy</a><a class="tag" taget="_blank" href="/search/dynamic/1.htm">dynamic</a><a class="tag" taget="_blank" href="/search/service/1.htm">service</a> <div>dynamicproxy.service.HelloService package dynamicproxy.service; public interface HelloService { public void sayHello(); }   dynamicproxy.service.impl.HelloServiceImpl package dynamicp</div> </li> <li><a href="/article/1215.htm" title="JDBC连接数据库" target="_blank">JDBC连接数据库</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/JDBC%E7%BC%96%E7%A8%8B/1.htm">JDBC编程</a><a class="tag" taget="_blank" href="/search/JAVA%E6%93%8D%E4%BD%9Coracle%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">JAVA操作oracle数据库</a> <div>         如果我们要想连接oracle公司的数据库,就要首先下载oralce公司的驱动程序,将这个驱动程序的jar包导入到我们工程中;   JDBC链接数据库的代码和固定写法;     1,加载oracle数据库的驱动;     &nb</div> </li> <li><a href="/article/1342.htm" title="单例模式中的多线程分析" target="_blank">单例模式中的多线程分析</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a> <div>谈到单例模式,我们立马会想到饿汉式和懒汉式加载,所谓饿汉式就是在创建类时就创建好了实例,懒汉式在获取实例时才去创建实例,即延迟加载。 饿汉式: package com.bijian.study; public class Singleton { private Singleton() { } // 注意这是private 只供内部调用 private static</div> </li> <li><a href="/article/1469.htm" title="javascript读取和修改原型特别需要注意原型的读写不具有对等性" target="_blank">javascript读取和修改原型特别需要注意原型的读写不具有对等性</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/prototype/1.htm">prototype</a> <div>        对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象A,假设它的原型对象是B,B的原型对象是null。如果我们需要读取A对象的name属性值,那么JS会优先在A中查找,如果找到了name属性那么就返回;如果A中没有name属性,那么就到原型B中查找name,如果找到了就返回;如果原型B中也没有</div> </li> <li><a href="/article/1596.htm" title="【持久化框架MyBatis3六】MyBatis3集成第三方DataSource" target="_blank">【持久化框架MyBatis3六】MyBatis3集成第三方DataSource</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/dataSource/1.htm">dataSource</a> <div>MyBatis内置了数据源的支持,如:   <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <data</div> </li> <li><a href="/article/1723.htm" title="我程序中用到的urldecode和base64decode,MD5" target="_blank">我程序中用到的urldecode和base64decode,MD5</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/MD5/1.htm">MD5</a><a class="tag" taget="_blank" href="/search/base64decode/1.htm">base64decode</a><a class="tag" taget="_blank" href="/search/urldecode/1.htm">urldecode</a> <div>这里是base64decode和urldecode,Md5在附件中。因为我是在后台所以需要解码: string Base64Decode(const char* Data,int DataByte,int& OutByte) { //解码表 const char DecodeTable[] = { 0, 0, 0, 0, 0, 0</div> </li> <li><a href="/article/1850.htm" title="腾讯资深运维专家周小军:QQ与微信架构的惊天秘密" target="_blank">腾讯资深运维专家周小军:QQ与微信架构的惊天秘密</a> <span class="text-muted">ronin47</span> <div>社交领域一直是互联网创业的大热门,从PC到移动端,从OICQ、MSN到QQ。到了移动互联网时代,社交领域应用开始彻底爆发,直奔黄金期。腾讯在过去几年里,社交平台更是火到爆,QQ和微信坐拥几亿的粉丝,QQ空间和朋友圈各种刷屏,写心得,晒照片,秀视频,那么谁来为企鹅保驾护航呢?支撑QQ和微信海量数据背后的架构又有哪些惊天内幕呢?本期大讲堂的内容来自今年2月份ChinaUnix对腾讯社交网络运营服务中心</div> </li> <li><a href="/article/1977.htm" title="java-69-旋转数组的最小元素。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素" target="_blank">java-69-旋转数组的最小元素。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class MinOfShiftedArray { /** * Q69 旋转数组的最小元素 * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。 * 例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 */ publ</div> </li> <li><a href="/article/2104.htm" title="看博客,应该是有方向的" target="_blank">看博客,应该是有方向的</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/%E5%8F%8D%E7%9C%81/1.htm">反省</a><a class="tag" taget="_blank" href="/search/%E7%9C%8B%E5%8D%9A%E5%AE%A2/1.htm">看博客</a> <div>看博客,应该是有方向的:  我现在就复习以前的,在补补以前不会的,现在还不会的,同时完善完善项目,也看看别人的博客.  我刚突然想到的:  1.应该看计算机组成原理,数据结构,一些算法,还有关于android,java的。  2.对于我,也快大四了,看一些职业规划的,以及一些学习的经验,看看别人的工作总结的.    为什么要写</div> </li> <li><a href="/article/2231.htm" title="[开源与商业]做开源项目的人生活上一定要朴素,尽量减少对官方和商业体系的依赖" target="_blank">[开源与商业]做开源项目的人生活上一定要朴素,尽量减少对官方和商业体系的依赖</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/1.htm">开源项目</a> <div>      为什么这样说呢?  因为科学和技术的发展有时候需要一个平缓和长期的积累过程,但是行政和商业体系本身充满各种不稳定性和不确定性,如果你希望长期从事某个科研项目,但是却又必须依赖于某种行政和商业体系,那其中的过程必定充满各种风险。。。       所以,为避免这种不确定性风险,我</div> </li> <li><a href="/article/2358.htm" title="一个 sql优化 ([精华] 一个查询优化的分析调整全过程!很值得一看 )" target="_blank">一个 sql优化 ([精华] 一个查询优化的分析调整全过程!很值得一看 )</a> <span class="text-muted">cwqcwqmax9</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>见   http://www.itpub.net/forum.php?mod=viewthread&tid=239011 Web翻页优化实例 提交时间: 2004-6-18 15:37:49      回复    发消息  环境: Linux ve</div> </li> <li><a href="/article/2485.htm" title="Hibernat and Ibatis" target="_blank">Hibernat and Ibatis</a> <span class="text-muted">dashuaifu</span> <a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a> <div>Hibernate  VS  iBATIS 简介 Hibernate 是当前最流行的O/R mapping框架,当前版本是3.05。它出身于sf.net,现在已经成为Jboss的一部分了 iBATIS 是另外一种优秀的O/R mapping框架,当前版本是2.0。目前属于apache的一个子项目了。 相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mappi</div> </li> <li><a href="/article/2612.htm" title="备份MYSQL脚本" target="_blank">备份MYSQL脚本</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>#!/bin/sh # this shell to backup mysql #1413161683@qq.com (QQ:1413161683 DuChengJiu) _dbDir=/var/lib/mysql/ _today=`date +%w` _bakDir=/usr/backup/$_today [ ! -d $_bakDir ] && mkdir -p </div> </li> <li><a href="/article/2739.htm" title="iOS第三方开源库的吐槽和备忘" target="_blank">iOS第三方开源库的吐槽和备忘</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a> <div>转自 ibireme的博客   做iOS开发总会接触到一些第三方库,这里整理一下,做一些吐槽。   目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code、SourceForge等地方。由于Github社区太过主流,这里主要介绍一下Github里面流行的iOS库。   首先整理了一份 Github上排名靠</div> </li> <li><a href="/article/2866.htm" title="html wlwmanifest.xml" target="_blank">html wlwmanifest.xml</a> <span class="text-muted">eoems</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>所谓优化wp_head()就是把从wp_head中移除不需要元素,同时也可以加快速度。 步骤: 加入到function.php remove_action('wp_head', 'wp_generator'); //wp-generator移除wordpress的版本号,本身blog的版本号没什么意义,但是如果让恶意玩家看到,可能会用官网公布的漏洞攻击blog remov</div> </li> <li><a href="/article/2993.htm" title="浅谈Java定时器发展" target="_blank">浅谈Java定时器发展</a> <span class="text-muted">hacksin</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E5%8F%91/1.htm">并发</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E6%97%B6%E5%99%A8/1.htm">定时器</a> <div>java在jdk1.3中推出了定时器类Timer,而后在jdk1.5后由Dou Lea从新开发出了支持多线程的ScheduleThreadPoolExecutor,从后者的表现来看,可以考虑完全替代Timer了。 Timer与ScheduleThreadPoolExecutor对比: 1.    Timer始于jdk1.3,其原理是利用一个TimerTask数组当作队列</div> </li> <li><a href="/article/3120.htm" title="移动端页面侧边导航滑入效果" target="_blank">移动端页面侧边导航滑入效果</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascirpt/1.htm">javascirpt</a> <div>效果体验:http://hovertree.com/texiao/mobile/2.htm可以使用移动设备浏览器查看效果。效果使用到jquery-2.1.4.min.js,该版本的jQuery库是用于支持HTML5的浏览器上,不再兼容IE8以前的浏览器,现在移动端浏览器一般都支持HTML5,所以使用该jQuery没问题。HTML文件代码: <!DOCTYPE html> <h</div> </li> <li><a href="/article/3247.htm" title="AspectJ+Javasist记录日志" target="_blank">AspectJ+Javasist记录日志</a> <span class="text-muted">kane_xie</span> <a class="tag" taget="_blank" href="/search/aspectj/1.htm">aspectj</a><a class="tag" taget="_blank" href="/search/javasist/1.htm">javasist</a> <div>在项目中碰到这样一个需求,对一个服务类的每一个方法,在方法开始和结束的时候分别记录一条日志,内容包括方法名,参数名+参数值以及方法执行的时间。   @Override public String get(String key) { // long start = System.currentTimeMillis(); // System.out.println("Be</div> </li> <li><a href="/article/3374.htm" title="redis学习笔记" target="_blank">redis学习笔记</a> <span class="text-muted">MJC410621</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a> <div>1)nosql数据库主要由以下特点:非关系型的、分布式的、开源的、水平可扩展的。 1,处理超大量的数据 2,运行在便宜的PC服务器集群上, 3,击碎了性能瓶颈。 1)对数据高并发读写。 2)对海量数据的高效率存储和访问。 3)对数据的高扩展性和高可用性。 redis支持的类型: Sring 类型 set name lijie get name lijie set na</div> </li> <li><a href="/article/3501.htm" title="使用redis实现分布式锁" target="_blank">使用redis实现分布式锁</a> <span class="text-muted">qifeifei</span> <div>在多节点的系统中,如何实现分布式锁机制,其中用redis来实现是很好的方法之一,我们先来看一下jedis包中,有个类名BinaryJedis,它有个方法如下:   public Long setnx(final byte[] key, final byte[] value) { checkIsInMulti(); client.setnx(key, value); ret</div> </li> <li><a href="/article/3628.htm" title="BI并非万能,中层业务管理报表要另辟蹊径" target="_blank">BI并非万能,中层业务管理报表要另辟蹊径</a> <span class="text-muted">张老师的菜</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/BI/1.htm">BI</a><a class="tag" taget="_blank" href="/search/%E5%95%86%E4%B8%9A%E6%99%BA%E8%83%BD/1.htm">商业智能</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8C%96/1.htm">信息化</a> <div>       BI是商业智能的缩写,是可以帮助企业做出明智的业务经营决策的工具,其数据来源于各个业务系统,如ERP、CRM、SCM、进销存、HER、OA等。        BI系统不同于传统的管理信息系统,他号称是一个整体应用的解决方案,是融入管理思想的强大系统:有着系统整体的设计思想,支持对所有</div> </li> <li><a href="/article/3755.htm" title="安装rvm后出现rvm not a function 或者ruby -v后提示没安装ruby的问题" target="_blank">安装rvm后出现rvm not a function 或者ruby -v后提示没安装ruby的问题</a> <span class="text-muted">wudixiaotie</span> <a class="tag" taget="_blank" href="/search/function/1.htm">function</a> <div>1.在~/.bashrc最后加入 [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"  2.重新启动terminal输入:   rvm use ruby-2.2.1 --default  把当前安装的ruby版本设为默</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>