From 0ccf6ab760de62bf2f39f897d604f2d54aba38ca Mon Sep 17 00:00:00 2001 From: XiaoJia849 <18870241505@163.com> Date: Sun, 15 Nov 2020 22:54:29 +0800 Subject: [PATCH 1/9] =?UTF-8?q?20201115-Java=E8=BF=9E=E6=8E=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93-XiaoJia849?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\346\225\260\346\215\256\345\272\223.md" | 240 ++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 "docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" diff --git "a/docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" "b/docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 00000000..fb100986 --- /dev/null +++ "b/docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,240 @@ +--- +layout: post +title: Java连接数据库 +date: 2020-11-01 +author: XiaoJia849 +categories: + - 开发部 +tags: + - 后端 + - 数据库 + - Java +--- + +# 下载 + +mysql-installer-community-8.0.20.0下载: + +[https://pan.baidu.com/s/1JowAkm1O5O7iLn1H-072Zw](https://pan.baidu.com/s/1JowAkm1O5O7iLn1H-072Zw) + +提取码:yf69 + +navicat 下载 + +[https://pan.baidu.com/s/17_z76E9DgIlCBwY81maSVQ](https://pan.baidu.com/s/17_z76E9DgIlCBwY81maSVQ) + +提取码:1hdt + +ecplise + +自行在官网下载,安装 + +mysql-connector-java-5.1.46-bin 用于数据库的连接 + +[https://pan.baidu.com/s/19UtMM4TzlicRkEPuv7hyzw](https://pan.baidu.com/s/19UtMM4TzlicRkEPuv7hyzw) + +提取码:ovhx + +下载包链接如上,具体安装请查询CSDN + +# 数据库的准备 + +## 建立连接 + +打开Navicat——点击连接——MySQL + +![新建连接](https://upload-images.jianshu.io/upload_images/25040907-c0a45523baf1ba76.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +连接名——自拟 + +用户名,密码——与MySQL下载时保持一致 + +先连接测试确认成功后再按确定 + +## 建立数据库 + +双击 连接名 得到: + +![数据库的初始内容](https://upload-images.jianshu.io/upload_images/25040907-275a702e6c66c9b0.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +以上4个数据库请不要随意使用 + +右键 连接名 新建数据库 + +![新建数据库](https://upload-images.jianshu.io/upload_images/25040907-df6a7bdd3c5a23b5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +数据库名——自拟 + +如果使用的数据库内包含中文字符,最好 + +字符集使用gb2312或者utf8 + +对应的排序规则(我不清楚有什么特别的规定,我的习惯是:) + +对应的是gb2312_chinese_ci  utf8_unicode_ci + +## 例子: + +双击数据库得到如下: + +![数据库内容](https://upload-images.jianshu.io/upload_images/25040907-8dc80b1585ceb53e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +右键 表 新建表 + +开始设置字段的 名 类型 长度 小数点 ,,,, + +设置结束后 点击保存 + +得到弹窗 输入表名即可 + +## 转储数据库 + +右键 数据库名 转储SQL文件结构和数据 + +选择地址 + +即得到这个数据库的SQL文件 + +## 运行SQL文件 + +右键连接名 运行SQL文件 + +![运行SQL文件](https://upload-images.jianshu.io/upload_images/25040907-bbe45d569f2032f1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +找到文件的地址 + +编码与文件编码对应即可,例如:建立此数据库时采用gb2312,那么打开时也这么使用 + +## 可能遇到的问题 + +1.无法通过 右键 连接名 运行SQL文件 的方式打开此文件 + +解决方案:自己创立一个数据库后,点击 表 右键 运行SQL文件 + +2.运行SQL文件失败 + +Debug方法,只需观察报错信息的第一行,查询错误代码对应的意义,针对性的de + +如果爆语法错误,可能是因为MySQL的版本不太统一造成的。 + +# ecplise上web项目的创建和连接数据库 + +## 创建项目 + +File-new-Dynamic Fragment-Project + +![创建项目](https://upload-images.jianshu.io/upload_images/25040907-edf57b628bf6508f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +Project name 项目名 自拟 + +服务器 我使用的是tomcat9 + +版本 注意!!!! 请使用2.5 + +原因:2.5的会自动在创建servlet时更行web.xml,非常方便!!! + +## 补充没有的jar + +右键 项目名Build Path + +![添加jar包](https://upload-images.jianshu.io/upload_images/25040907-ed0f8ca3ada4a519.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +点击Add External JARS 连接mysql-connector-java-5.1.46-bin这个jar包 + +点击Apply and Close结束 + +所有的添加tomcat和jre没有的jar包的方式都是这样 + +## 文件书写的结构(仅用来记录个人习惯) + +![文件书写结构](https://upload-images.jianshu.io/upload_images/25040907-0c7795dab9fc4eb0.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +Java Resources内的src中 + +创建Ja包内写入JAVA文件 + +创建Se包内写入SERVLET文件 + +在WebContent内写入jsp和html文件 + +## 详细介绍JAVA 连接数据库和运用数据库的步骤 + +### 在Se包内创建servlet文件,DB.java + +```java +package Se; + +import java.sql.*; + +public class DB  { + +public static Connection dbCon(){ + +        Connection  con = null; + +        try { + +            Class.forName("com.mysql.jdbc.Driver"); + +            con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?useSSL=false", "MySQL用户名", "MySQL密码"); + +        } catch (Exception e) { + +        e.printStackTrace();//用于打印错误 + +        } + +        return con; + +    } + +} +``` +?useSSL=false是为了防止因为MySQL版本过高报错 + +### 查询数据库 + +```java +        try { + +    PreparedStatement ps =DB.dbCon().prepareStatement("select user_age from user_info where user_name=? and user_password=?"); + +    ps.setString(1, name); + +    ps.setString(2, pass); + +    ResultSet rs = ps.executeQuery(); + +            if(rs.next()){ + +            userInfo.setAge(rs.getInt(1)); + +            }else{ + +            } + +        }catch (Exception e) { + +} +``` +### 插入数据库 + +```java +try { + +        PreparedStatement ps =DB.dbCon().prepareStatement("insert into user_info (user_name,user_password,user_age) values(?,?,?)"); + +    ps.setString(1,user_name); + +    ps.setString(2, lpassword); + +    ps.setInt(3, age); + +    ps.executeUpdate(); + +}catch (Exception e) { + +        e.printStackTrace(); + +} +``` \ No newline at end of file From a83e7ee96f1728d29da52f5a21022b75e3ee0092 Mon Sep 17 00:00:00 2001 From: XiaoJia849 <18870241505@163.com> Date: Sun, 15 Nov 2020 22:59:39 +0800 Subject: [PATCH 2/9] =?UTF-8?q?20201115-Linux=E5=B0=B1=E8=AF=A5=E8=BF=99?= =?UTF-8?q?=E4=B9=88=E5=AD=A61-XiaoJia849?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\350\277\231\344\271\210\345\255\2461.md" | 261 ++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 "docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" diff --git "a/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" new file mode 100644 index 00000000..2a406ef7 --- /dev/null +++ "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" @@ -0,0 +1,261 @@ +--- +layout: post +title: Linux就该这么学1 +date: 2020-11-14 +author: XiaoJia849 +categories: + - 开发部 +tags: + - 后端 + - Linux +--- + + +## 系统工作命令: + + **1. echo 字符串|$变量名** + + **2. date:** + +查看时间,并设置形式: + +Date ”+%Y-%m-%d %H:%M:%S” + +设定电脑此刻的时间: + +Date -s “20201001 2:30:45” + +%j用来查看今天是本年的第几天 + +**3. reboot重启,只有管理员才可使用** + +**4. poweroff关闭系统,只有管理员才可使用** + +**5. wget下载网络文件** + + wget -r -p http://www.linuxprobe.com用来下载此网站下所有内容,保存到www.linuxprobe.com的文件下 + +**6. ps查看系统中的进程状态** + +记住3个,-a显示所有,-u显示用户以及其他所有详细信息,-x显示没有控制终端的进程 + +![ps查看进程](https://upload-images.jianshu.io/upload_images/25040907-ac7e9f91f28ac166.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +观察上图: + +- R运行中的进程。 + +- S中断/休眠。 + +- D不可中断,使用kill也无法使他中止的进程,此进程不影响系统异步信号。 + +- Z僵死,进程已经终止,等待父进程将其释放。 + +- T停止,进程收到停止信号后停止 + +Ps aux即ps -a -u -x的三者合并。 + +**7. top动态监控进程活动与系统负载** +![top动态监控进程和系统负载](https://upload-images.jianshu.io/upload_images/25040907-e58341f64159ae0c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +观察前5行获取信息: + +- top:当前时间,运行时间,几个用户,5 10 15分钟内的平均负载。 + +- Tasks:总任务数目,正在运行的任务数目,睡眠的任务数目,等等 + +- CPU:关注一下99.3id就行,表示还有99.3%的cpu是空闲的。 + +- KIB Mem:物理内存,总数,空闲数,被使用数目 + +- KiB Swap:虚拟内存,总数,空闲数,被使用数目 + +**8. pidof查询指定服务的pid值** + +pidof sshd + +得到2156 + +**9. kill 进程号** + +kill 2156 + +**10. killall用于中止某个指定名称的服务所对应的所有进程** + +kill sshd + + +## 系统状态检测命令 + +**1. ifconfig获取,IP地址,网卡名称,网卡物理地址,RX/TX的收发流量数据大小** + +**2. uname查看系统内核和系统版本** + +![查看系统版本](https://upload-images.jianshu.io/upload_images/25040907-cc5249ed3373a657.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![查看系统内核](https://upload-images.jianshu.io/upload_images/25040907-489f2e589c6a6787.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +**3. uptime查看系统负载信息** + +内容相当于top的第一行,而且不会实时更新。 + +**4. free显示当前系统中内存的使用量** + +内容相当于top的第4 5行 + +**5. who 查看登入主机的用户的终端信息** + +**6. last查看登录记录** + +**7. history查看最近使用过的命令,最多1000条** + +cat ~/.bash_history可以查看history + +**8. sosreport用来生成一个文档,记录着所有系统配置和框架信息** + +![sosreport](https://upload-images.jianshu.io/upload_images/25040907-00da5a2de747b584.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +存放在上面提示的地址中,将这个文件发送给某个工作人员,让其协助解决问题。 + +## 工作目录切换命令 + +**1. pwd显示用户当前所处的工作目录** + +![工作目录](https://upload-images.jianshu.io/upload_images/25040907-31580bfd20f0331f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +**2. cd跳转目录** + +**3. ls显示目录下的文件-a显示所有文件,包括隐藏文件,-l查看文件的属性,大小等信息** + + +## 文本文件编辑命令: + +**1. cat查看文件 -n同时显示行号** + +**2. more 查看长纯文本文件** + +**3. head 查看纯文本文件的前N行** + +head -n 20 某文件 + +**4. tail纯文本文件 ,与head相对应,如果想看最新文件,请添加-f** + +**5. tr批量替换文本文件中的字符** + +cat 某文件|tr [a-z] [A-Z] + +将某文件所有的小写转换为大写 + +**6. wc 统计指定文件的行数-l,字数-w,字节数-c** + +**7. stat查看文件的具体存储信息等** + +![查看文件具体存储信息](https://upload-images.jianshu.io/upload_images/25040907-36d3d345ec26c060.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +主要的有用信息是access,modify,change + +**8. cut 按列提取文本字符** + +效果如下: + +![原文本内容](https://upload-images.jianshu.io/upload_images/25040907-d5dbdb9ac009bc92.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![按列提取文本字符](https://upload-images.jianshu.io/upload_images/25040907-2f81b500535553ce.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +提取的正好是每行的第一个单词,也就是第一列的内容 + +**9. diff比较多个文件是否相同** + +diff –brief 文件1 文件2 + + +## 文件目录管理命令。 + +**1.touch** + +创建文件同时可以设置文件内容的修改时间mtime,文件权限ctime文件读取时间atime,用-a读取,-m修改 ,-d读取和修改 + +``` +touch -d “2017-05-04 15:44” 某文件 +``` +**2.mkdir创建空白目录在a/b/c/s下** + +``` +mkdir -p a/b/c/s +``` +**3.cp复制文件或者目录** + +cp 源文件 目标文件 +-p保留原文件属性,-d若为链接同p,-r复制目录时使用,-i覆盖目标文件,-a以上全部 + +**4.mv剪切文件或者将文件重命名** + +**5.rm删除文件或者目录** + +**6.dd按照指定大小和个数的数据块复制和转换文件** + +这个命令有4个参数。 +- if输入文件的名称 +- of输出文件的名称 +- bs设置每个块的大小 +- count设置复制块的个数 +``` +dd if=/dev/zero of=文件名 count=1 bs=560M +从/dv/zero中取出一个560M的数据块保存在文件名的下面 +``` +其中bs和count具体多少不重要,乘积才重要。 +dd命令可以用来转换文件保存的类型。只要确定好of的类型,就有了转换后的类型 + +**7.file查看文件类型** + +## 打包压缩与搜索命令 + +**1.tar用于压缩** + +-c创建压缩文件 +-x解压缩 +-t查看压缩包内的内容 +-z用Gzip压缩哟或者解压缩 +-j用bzip2压缩或者解压缩 +-f目标文件名 +-p保留原始文件的属性和权限 +-C指定解压到的目录 +-v用来显示压缩和解压的过程 +注意!!!-f必须放在最后位 + +**2.grep 在文本中执行关键字搜索** + +-b将执行文件当作txt来搜索 +-c只显示目标所在行号 +-i忽略大小写 +-n显示目标所在行号 +-v反向选择 + +**3.find 按照指定条件查询文件** + +-name按名字 +-perm按权限 +-user按所有者 +-group按所有组 +-mtime +n 修改内容时间在n天以前的 +-mtime -n修改时间在n天以内的 +-atime访问文件时间 +-ctime 修改文件权限时间 +-nouser没有所有者的 +-nogroup没有所有组的 +-newerf1!f2比f1新但是比f2旧的 +–type按文件类型匹配 +-size按大小 +-exec搜索到的结果给后面的执行 + +``` +find / -user xiao -exec cp -a () /root/sss/\ +``` + +找到属于xiao用户的所有文件复制到/root/sss/\下面 + + +## 参考 + +- [1] [刘遄.Linux就该4这么学[M].北京:人民邮电出版社,2016:405-456] From 74864c6d6e15bb187f3e74f834b99a06a66baa27 Mon Sep 17 00:00:00 2001 From: XiaoJia849 <18870241505@163.com> Date: Sun, 15 Nov 2020 22:59:52 +0800 Subject: [PATCH 3/9] =?UTF-8?q?20201115-Linux=E5=B0=B1=E8=AF=A5=E8=BF=99?= =?UTF-8?q?=E4=B9=88=E5=AD=A62-XiaoJia849?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\350\277\231\344\271\210\345\255\2462.md" | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 "docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" diff --git "a/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" new file mode 100644 index 00000000..7acdead3 --- /dev/null +++ "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" @@ -0,0 +1,171 @@ +--- +layout: post +title: Linux就该这么学2 +date: 2020-11-14 +author: XiaoJia849 +categories: + - 开发部 +tags: + - 后端 + - Linux +--- + +输入重定向——把文件导入到命令中 +输出重定向——把原本要输出到屏幕的数据信息写到指定文件中 + +输入重定向:标准输入重定向。STDIN,可从键盘,其他文件或命令中输入。 + +输出重定向最常使用,分为:标准输出重定向,错误输出重定向 + +## 输出重定向: + +Man bash > readme.txt 把屏幕中的内容输出到readme.txt文件内。 + +覆盖写入:echo “WELcome” > readme.txt——把双引号内内容覆盖readme.txt的原本内容 + +追加写入:echo “WELcome” >>readme.txt——把双引号内内容追加到readme.txt + +把命令的所有报错信息写入文件,使用SHELL脚本。 + +Ls -l xxxxx 2>/root/stdeer.txt + +把ls -l xxxxx 2的所有提示信息输入到/root/stdeer.txt + +/root/stdeer.txt是一个只读文件。 + +## 输入重定向: + +Wc -l < readme.txt 这个是统计文本行数 + +输出readme.txt这个文件内容的行数 + +## 管道命令符 + +| 管道符 + +A | B 把A命令原本要输入到屏幕的数据当作是后一个命令的标准输入。 +``` +grep “/sbin/nologin” /etc/password | wc -1 +``` +这个是找到在 /etc/password 里“/sbin/nologin”出现的次数 + +重置用户root的密码: +``` +echo “linuxprobe” | password –stdin root +``` +发送邮件 +``` +echo “Content” | mail -s “Subject” 用户名 +``` + +![发送邮件](https://upload-images.jianshu.io/upload_images/25040907-527f060c19df283b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +![更改内容](https://upload-images.jianshu.io/upload_images/25040907-15449bb2606d6d76.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +## 关于发送邮件的详细过程如下: + +### 1.安装 + +- sendmail:yum install -y sendmail +- mail:yum install -y mailx +- 安装mutt:yum install -y mutt + +### 2.修改配置文件 + +``` +vim /etc/mail.rc +``` +在此文件下补充以下内容 + +``` +set ssl-verify=ignore 无需ssl确认 +set nss-config-dir=/etc/pki/nssdb +set from=邮箱 +set smtp=smtps://smtp.qq.com:465 如果是qq邮箱就这么写 +set smtp-auth-user=邮箱,同上 +set smtp-auth-password=IMAP/SMTP服务密码 +set smtp-auth=login +``` + +启动sendmail : systemctl restart sendmail + +[详细配置mail.rc的参考网址](https://blog.csdn.net/thinkthewill/article/details/80868442?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare) + +``` +echo "邮件内容" | mail -s "邮件名" 目标邮箱 +``` +用这一条命令是表示,我从我的本地账户(mail.rc配置的邮箱)发送邮件到目标邮箱 + +## 命令行的通配符 + +*匹配0个或者多个 + +?匹配单个字符 + +[0-9]匹配0-9之间的单个数字的字符 + +[abc]匹配abc中的任意一个字符 + +ls -l /dev/sda* 展示所有sda开头的文件的信息。 + +## 常用转义字符\ ‘’ “” + +$$是显示当前进程号,第一个 \$ 表示显示内容 + +\\$$ 的第一个 \$ 没有特殊含义 + +![\$的使用](https://upload-images.jianshu.io/upload_images/25040907-0db59bd878755a62.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +当要执行某命令也可以这么写 + +![执行某命令](https://upload-images.jianshu.io/upload_images/25040907-d05a824c70ec72b2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +## 重要的环境变量 + +命令在linux内执行的步骤: + +第一步:判断用户是否以绝对路径或者相对路径的方式输入命令 + +第二步:检查输入命令是否为别名命令 + +可以用alias命令创建属于自己的命令别名 + +- alias 别名 =命令 运用此别名 + +- unalias 别名 释放此别名 + +第三步:Bash解释器判断用户输入的是内部命令还是外部命令 + +内部命令:解释器内部的指令,直接执行 + +外部命令:由下一步执行,用 type 命令名称    判断用户输入的是内部命令还是外部命令 +![判断命令属于内部或者外部](https://upload-images.jianshu.io/upload_images/25040907-535352b1a14d2241.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +cat是bin里的,说明是内部命令 + +第四步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫PATH + +![查看path](https://upload-images.jianshu.io/upload_images/25040907-5c6789bd7266e9e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +不能将当前目录(.)添加到PATH,因为:如果黑客在共用目录/tmp中存放了和ls或者cd命令同名的木马文件,用户如果在公共目录下执行了这些命令,就有可能中招。 + +设定解释器搜索所执行的命令的路径——PATH变量 + +注意:不同用户下的同一变量代表的意义不同 + +![root用户下](https://upload-images.jianshu.io/upload_images/25040907-9b2a55e9f7a4c7c5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![xiao用户下](https://upload-images.jianshu.io/upload_images/25040907-c4c7c5f110a9d0c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +随便使用一个命令就可以创建这样的变量,例如WI=/home/workdir cd $WI就可以跳转到这个目录。 + +但是这种变量的作用范围有限,不可以被其他用户使用。但是可以使用export WI 把WI这个命令转换为全局变量。 + +## 参考 + +- [1] [刘遄.Linux就该4这么学[M].北京:人民邮电出版社,2016:100-371] +- [2] [详细配置mail.rc的参考网址](https://blog.csdn.net/thinkthewill/article/details/80868442?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare) \ No newline at end of file From 124f83a9a7b385577dcce144ead0c2f42394b05d Mon Sep 17 00:00:00 2001 From: XiaoJia849 <18870241505@163.com> Date: Tue, 17 Nov 2020 11:51:32 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\346\225\260\346\215\256\345\272\223.md" | 240 ---------------- ...5\350\277\231\344\271\210\345\255\2461.md" | 261 ------------------ ...5\350\277\231\344\271\210\345\255\2462.md" | 171 ------------ 3 files changed, 672 deletions(-) delete mode 100644 "docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" delete mode 100644 "docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" delete mode 100644 "docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" diff --git "a/docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" "b/docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" deleted file mode 100644 index fb100986..00000000 --- "a/docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" +++ /dev/null @@ -1,240 +0,0 @@ ---- -layout: post -title: Java连接数据库 -date: 2020-11-01 -author: XiaoJia849 -categories: - - 开发部 -tags: - - 后端 - - 数据库 - - Java ---- - -# 下载 - -mysql-installer-community-8.0.20.0下载: - -[https://pan.baidu.com/s/1JowAkm1O5O7iLn1H-072Zw](https://pan.baidu.com/s/1JowAkm1O5O7iLn1H-072Zw) - -提取码:yf69 - -navicat 下载 - -[https://pan.baidu.com/s/17_z76E9DgIlCBwY81maSVQ](https://pan.baidu.com/s/17_z76E9DgIlCBwY81maSVQ) - -提取码:1hdt - -ecplise - -自行在官网下载,安装 - -mysql-connector-java-5.1.46-bin 用于数据库的连接 - -[https://pan.baidu.com/s/19UtMM4TzlicRkEPuv7hyzw](https://pan.baidu.com/s/19UtMM4TzlicRkEPuv7hyzw) - -提取码:ovhx - -下载包链接如上,具体安装请查询CSDN - -# 数据库的准备 - -## 建立连接 - -打开Navicat——点击连接——MySQL - -![新建连接](https://upload-images.jianshu.io/upload_images/25040907-c0a45523baf1ba76.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -连接名——自拟 - -用户名,密码——与MySQL下载时保持一致 - -先连接测试确认成功后再按确定 - -## 建立数据库 - -双击 连接名 得到: - -![数据库的初始内容](https://upload-images.jianshu.io/upload_images/25040907-275a702e6c66c9b0.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -以上4个数据库请不要随意使用 - -右键 连接名 新建数据库 - -![新建数据库](https://upload-images.jianshu.io/upload_images/25040907-df6a7bdd3c5a23b5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -数据库名——自拟 - -如果使用的数据库内包含中文字符,最好 - -字符集使用gb2312或者utf8 - -对应的排序规则(我不清楚有什么特别的规定,我的习惯是:) - -对应的是gb2312_chinese_ci  utf8_unicode_ci - -## 例子: - -双击数据库得到如下: - -![数据库内容](https://upload-images.jianshu.io/upload_images/25040907-8dc80b1585ceb53e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -右键 表 新建表 - -开始设置字段的 名 类型 长度 小数点 ,,,, - -设置结束后 点击保存 - -得到弹窗 输入表名即可 - -## 转储数据库 - -右键 数据库名 转储SQL文件结构和数据 - -选择地址 - -即得到这个数据库的SQL文件 - -## 运行SQL文件 - -右键连接名 运行SQL文件 - -![运行SQL文件](https://upload-images.jianshu.io/upload_images/25040907-bbe45d569f2032f1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -找到文件的地址 - -编码与文件编码对应即可,例如:建立此数据库时采用gb2312,那么打开时也这么使用 - -## 可能遇到的问题 - -1.无法通过 右键 连接名 运行SQL文件 的方式打开此文件 - -解决方案:自己创立一个数据库后,点击 表 右键 运行SQL文件 - -2.运行SQL文件失败 - -Debug方法,只需观察报错信息的第一行,查询错误代码对应的意义,针对性的de - -如果爆语法错误,可能是因为MySQL的版本不太统一造成的。 - -# ecplise上web项目的创建和连接数据库 - -## 创建项目 - -File-new-Dynamic Fragment-Project - -![创建项目](https://upload-images.jianshu.io/upload_images/25040907-edf57b628bf6508f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -Project name 项目名 自拟 - -服务器 我使用的是tomcat9 - -版本 注意!!!! 请使用2.5 - -原因:2.5的会自动在创建servlet时更行web.xml,非常方便!!! - -## 补充没有的jar - -右键 项目名Build Path - -![添加jar包](https://upload-images.jianshu.io/upload_images/25040907-ed0f8ca3ada4a519.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -点击Add External JARS 连接mysql-connector-java-5.1.46-bin这个jar包 - -点击Apply and Close结束 - -所有的添加tomcat和jre没有的jar包的方式都是这样 - -## 文件书写的结构(仅用来记录个人习惯) - -![文件书写结构](https://upload-images.jianshu.io/upload_images/25040907-0c7795dab9fc4eb0.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -Java Resources内的src中 - -创建Ja包内写入JAVA文件 - -创建Se包内写入SERVLET文件 - -在WebContent内写入jsp和html文件 - -## 详细介绍JAVA 连接数据库和运用数据库的步骤 - -### 在Se包内创建servlet文件,DB.java - -```java -package Se; - -import java.sql.*; - -public class DB  { - -public static Connection dbCon(){ - -        Connection  con = null; - -        try { - -            Class.forName("com.mysql.jdbc.Driver"); - -            con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?useSSL=false", "MySQL用户名", "MySQL密码"); - -        } catch (Exception e) { - -        e.printStackTrace();//用于打印错误 - -        } - -        return con; - -    } - -} -``` -?useSSL=false是为了防止因为MySQL版本过高报错 - -### 查询数据库 - -```java -        try { - -    PreparedStatement ps =DB.dbCon().prepareStatement("select user_age from user_info where user_name=? and user_password=?"); - -    ps.setString(1, name); - -    ps.setString(2, pass); - -    ResultSet rs = ps.executeQuery(); - -            if(rs.next()){ - -            userInfo.setAge(rs.getInt(1)); - -            }else{ - -            } - -        }catch (Exception e) { - -} -``` -### 插入数据库 - -```java -try { - -        PreparedStatement ps =DB.dbCon().prepareStatement("insert into user_info (user_name,user_password,user_age) values(?,?,?)"); - -    ps.setString(1,user_name); - -    ps.setString(2, lpassword); - -    ps.setInt(3, age); - -    ps.executeUpdate(); - -}catch (Exception e) { - -        e.printStackTrace(); - -} -``` \ No newline at end of file diff --git "a/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" deleted file mode 100644 index 2a406ef7..00000000 --- "a/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" +++ /dev/null @@ -1,261 +0,0 @@ ---- -layout: post -title: Linux就该这么学1 -date: 2020-11-14 -author: XiaoJia849 -categories: - - 开发部 -tags: - - 后端 - - Linux ---- - - -## 系统工作命令: - - **1. echo 字符串|$变量名** - - **2. date:** - -查看时间,并设置形式: - -Date ”+%Y-%m-%d %H:%M:%S” - -设定电脑此刻的时间: - -Date -s “20201001 2:30:45” - -%j用来查看今天是本年的第几天 - -**3. reboot重启,只有管理员才可使用** - -**4. poweroff关闭系统,只有管理员才可使用** - -**5. wget下载网络文件** - - wget -r -p http://www.linuxprobe.com用来下载此网站下所有内容,保存到www.linuxprobe.com的文件下 - -**6. ps查看系统中的进程状态** - -记住3个,-a显示所有,-u显示用户以及其他所有详细信息,-x显示没有控制终端的进程 - -![ps查看进程](https://upload-images.jianshu.io/upload_images/25040907-ac7e9f91f28ac166.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -观察上图: - -- R运行中的进程。 - -- S中断/休眠。 - -- D不可中断,使用kill也无法使他中止的进程,此进程不影响系统异步信号。 - -- Z僵死,进程已经终止,等待父进程将其释放。 - -- T停止,进程收到停止信号后停止 - -Ps aux即ps -a -u -x的三者合并。 - -**7. top动态监控进程活动与系统负载** -![top动态监控进程和系统负载](https://upload-images.jianshu.io/upload_images/25040907-e58341f64159ae0c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -观察前5行获取信息: - -- top:当前时间,运行时间,几个用户,5 10 15分钟内的平均负载。 - -- Tasks:总任务数目,正在运行的任务数目,睡眠的任务数目,等等 - -- CPU:关注一下99.3id就行,表示还有99.3%的cpu是空闲的。 - -- KIB Mem:物理内存,总数,空闲数,被使用数目 - -- KiB Swap:虚拟内存,总数,空闲数,被使用数目 - -**8. pidof查询指定服务的pid值** - -pidof sshd - -得到2156 - -**9. kill 进程号** - -kill 2156 - -**10. killall用于中止某个指定名称的服务所对应的所有进程** - -kill sshd - - -## 系统状态检测命令 - -**1. ifconfig获取,IP地址,网卡名称,网卡物理地址,RX/TX的收发流量数据大小** - -**2. uname查看系统内核和系统版本** - -![查看系统版本](https://upload-images.jianshu.io/upload_images/25040907-cc5249ed3373a657.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -![查看系统内核](https://upload-images.jianshu.io/upload_images/25040907-489f2e589c6a6787.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - - -**3. uptime查看系统负载信息** - -内容相当于top的第一行,而且不会实时更新。 - -**4. free显示当前系统中内存的使用量** - -内容相当于top的第4 5行 - -**5. who 查看登入主机的用户的终端信息** - -**6. last查看登录记录** - -**7. history查看最近使用过的命令,最多1000条** - -cat ~/.bash_history可以查看history - -**8. sosreport用来生成一个文档,记录着所有系统配置和框架信息** - -![sosreport](https://upload-images.jianshu.io/upload_images/25040907-00da5a2de747b584.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -存放在上面提示的地址中,将这个文件发送给某个工作人员,让其协助解决问题。 - -## 工作目录切换命令 - -**1. pwd显示用户当前所处的工作目录** - -![工作目录](https://upload-images.jianshu.io/upload_images/25040907-31580bfd20f0331f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -**2. cd跳转目录** - -**3. ls显示目录下的文件-a显示所有文件,包括隐藏文件,-l查看文件的属性,大小等信息** - - -## 文本文件编辑命令: - -**1. cat查看文件 -n同时显示行号** - -**2. more 查看长纯文本文件** - -**3. head 查看纯文本文件的前N行** - -head -n 20 某文件 - -**4. tail纯文本文件 ,与head相对应,如果想看最新文件,请添加-f** - -**5. tr批量替换文本文件中的字符** - -cat 某文件|tr [a-z] [A-Z] - -将某文件所有的小写转换为大写 - -**6. wc 统计指定文件的行数-l,字数-w,字节数-c** - -**7. stat查看文件的具体存储信息等** - -![查看文件具体存储信息](https://upload-images.jianshu.io/upload_images/25040907-36d3d345ec26c060.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -主要的有用信息是access,modify,change - -**8. cut 按列提取文本字符** - -效果如下: - -![原文本内容](https://upload-images.jianshu.io/upload_images/25040907-d5dbdb9ac009bc92.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -![按列提取文本字符](https://upload-images.jianshu.io/upload_images/25040907-2f81b500535553ce.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -提取的正好是每行的第一个单词,也就是第一列的内容 - -**9. diff比较多个文件是否相同** - -diff –brief 文件1 文件2 - - -## 文件目录管理命令。 - -**1.touch** - -创建文件同时可以设置文件内容的修改时间mtime,文件权限ctime文件读取时间atime,用-a读取,-m修改 ,-d读取和修改 - -``` -touch -d “2017-05-04 15:44” 某文件 -``` -**2.mkdir创建空白目录在a/b/c/s下** - -``` -mkdir -p a/b/c/s -``` -**3.cp复制文件或者目录** - -cp 源文件 目标文件 --p保留原文件属性,-d若为链接同p,-r复制目录时使用,-i覆盖目标文件,-a以上全部 - -**4.mv剪切文件或者将文件重命名** - -**5.rm删除文件或者目录** - -**6.dd按照指定大小和个数的数据块复制和转换文件** - -这个命令有4个参数。 -- if输入文件的名称 -- of输出文件的名称 -- bs设置每个块的大小 -- count设置复制块的个数 -``` -dd if=/dev/zero of=文件名 count=1 bs=560M -从/dv/zero中取出一个560M的数据块保存在文件名的下面 -``` -其中bs和count具体多少不重要,乘积才重要。 -dd命令可以用来转换文件保存的类型。只要确定好of的类型,就有了转换后的类型 - -**7.file查看文件类型** - -## 打包压缩与搜索命令 - -**1.tar用于压缩** - --c创建压缩文件 --x解压缩 --t查看压缩包内的内容 --z用Gzip压缩哟或者解压缩 --j用bzip2压缩或者解压缩 --f目标文件名 --p保留原始文件的属性和权限 --C指定解压到的目录 --v用来显示压缩和解压的过程 -注意!!!-f必须放在最后位 - -**2.grep 在文本中执行关键字搜索** - --b将执行文件当作txt来搜索 --c只显示目标所在行号 --i忽略大小写 --n显示目标所在行号 --v反向选择 - -**3.find 按照指定条件查询文件** - --name按名字 --perm按权限 --user按所有者 --group按所有组 --mtime +n 修改内容时间在n天以前的 --mtime -n修改时间在n天以内的 --atime访问文件时间 --ctime 修改文件权限时间 --nouser没有所有者的 --nogroup没有所有组的 --newerf1!f2比f1新但是比f2旧的 -–type按文件类型匹配 --size按大小 --exec搜索到的结果给后面的执行 - -``` -find / -user xiao -exec cp -a () /root/sss/\ -``` - -找到属于xiao用户的所有文件复制到/root/sss/\下面 - - -## 参考 - -- [1] [刘遄.Linux就该4这么学[M].北京:人民邮电出版社,2016:405-456] diff --git "a/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" deleted file mode 100644 index 7acdead3..00000000 --- "a/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" +++ /dev/null @@ -1,171 +0,0 @@ ---- -layout: post -title: Linux就该这么学2 -date: 2020-11-14 -author: XiaoJia849 -categories: - - 开发部 -tags: - - 后端 - - Linux ---- - -输入重定向——把文件导入到命令中 -输出重定向——把原本要输出到屏幕的数据信息写到指定文件中 - -输入重定向:标准输入重定向。STDIN,可从键盘,其他文件或命令中输入。 - -输出重定向最常使用,分为:标准输出重定向,错误输出重定向 - -## 输出重定向: - -Man bash > readme.txt 把屏幕中的内容输出到readme.txt文件内。 - -覆盖写入:echo “WELcome” > readme.txt——把双引号内内容覆盖readme.txt的原本内容 - -追加写入:echo “WELcome” >>readme.txt——把双引号内内容追加到readme.txt - -把命令的所有报错信息写入文件,使用SHELL脚本。 - -Ls -l xxxxx 2>/root/stdeer.txt - -把ls -l xxxxx 2的所有提示信息输入到/root/stdeer.txt - -/root/stdeer.txt是一个只读文件。 - -## 输入重定向: - -Wc -l < readme.txt 这个是统计文本行数 - -输出readme.txt这个文件内容的行数 - -## 管道命令符 - -| 管道符 - -A | B 把A命令原本要输入到屏幕的数据当作是后一个命令的标准输入。 -``` -grep “/sbin/nologin” /etc/password | wc -1 -``` -这个是找到在 /etc/password 里“/sbin/nologin”出现的次数 - -重置用户root的密码: -``` -echo “linuxprobe” | password –stdin root -``` -发送邮件 -``` -echo “Content” | mail -s “Subject” 用户名 -``` - -![发送邮件](https://upload-images.jianshu.io/upload_images/25040907-527f060c19df283b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - - -![更改内容](https://upload-images.jianshu.io/upload_images/25040907-15449bb2606d6d76.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -## 关于发送邮件的详细过程如下: - -### 1.安装 - -- sendmail:yum install -y sendmail -- mail:yum install -y mailx -- 安装mutt:yum install -y mutt - -### 2.修改配置文件 - -``` -vim /etc/mail.rc -``` -在此文件下补充以下内容 - -``` -set ssl-verify=ignore 无需ssl确认 -set nss-config-dir=/etc/pki/nssdb -set from=邮箱 -set smtp=smtps://smtp.qq.com:465 如果是qq邮箱就这么写 -set smtp-auth-user=邮箱,同上 -set smtp-auth-password=IMAP/SMTP服务密码 -set smtp-auth=login -``` - -启动sendmail : systemctl restart sendmail - -[详细配置mail.rc的参考网址](https://blog.csdn.net/thinkthewill/article/details/80868442?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare) - -``` -echo "邮件内容" | mail -s "邮件名" 目标邮箱 -``` -用这一条命令是表示,我从我的本地账户(mail.rc配置的邮箱)发送邮件到目标邮箱 - -## 命令行的通配符 - -*匹配0个或者多个 - -?匹配单个字符 - -[0-9]匹配0-9之间的单个数字的字符 - -[abc]匹配abc中的任意一个字符 - -ls -l /dev/sda* 展示所有sda开头的文件的信息。 - -## 常用转义字符\ ‘’ “” - -$$是显示当前进程号,第一个 \$ 表示显示内容 - -\\$$ 的第一个 \$ 没有特殊含义 - -![\$的使用](https://upload-images.jianshu.io/upload_images/25040907-0db59bd878755a62.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -当要执行某命令也可以这么写 - -![执行某命令](https://upload-images.jianshu.io/upload_images/25040907-d05a824c70ec72b2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - - -## 重要的环境变量 - -命令在linux内执行的步骤: - -第一步:判断用户是否以绝对路径或者相对路径的方式输入命令 - -第二步:检查输入命令是否为别名命令 - -可以用alias命令创建属于自己的命令别名 - -- alias 别名 =命令 运用此别名 - -- unalias 别名 释放此别名 - -第三步:Bash解释器判断用户输入的是内部命令还是外部命令 - -内部命令:解释器内部的指令,直接执行 - -外部命令:由下一步执行,用 type 命令名称    判断用户输入的是内部命令还是外部命令 -![判断命令属于内部或者外部](https://upload-images.jianshu.io/upload_images/25040907-535352b1a14d2241.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -cat是bin里的,说明是内部命令 - -第四步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫PATH - -![查看path](https://upload-images.jianshu.io/upload_images/25040907-5c6789bd7266e9e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - - -不能将当前目录(.)添加到PATH,因为:如果黑客在共用目录/tmp中存放了和ls或者cd命令同名的木马文件,用户如果在公共目录下执行了这些命令,就有可能中招。 - -设定解释器搜索所执行的命令的路径——PATH变量 - -注意:不同用户下的同一变量代表的意义不同 - -![root用户下](https://upload-images.jianshu.io/upload_images/25040907-9b2a55e9f7a4c7c5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -![xiao用户下](https://upload-images.jianshu.io/upload_images/25040907-c4c7c5f110a9d0c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - - -随便使用一个命令就可以创建这样的变量,例如WI=/home/workdir cd $WI就可以跳转到这个目录。 - -但是这种变量的作用范围有限,不可以被其他用户使用。但是可以使用export WI 把WI这个命令转换为全局变量。 - -## 参考 - -- [1] [刘遄.Linux就该4这么学[M].北京:人民邮电出版社,2016:100-371] -- [2] [详细配置mail.rc的参考网址](https://blog.csdn.net/thinkthewill/article/details/80868442?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare) \ No newline at end of file From bb3561f3f2d6af94ff0c27ff3e789c1e66c2e4ed Mon Sep 17 00:00:00 2001 From: XiaoJia849 <18870241505@163.com> Date: Tue, 17 Nov 2020 11:52:41 +0800 Subject: [PATCH 5/9] =?UTF-8?q?201101-Java=E8=BF=9E=E6=8E=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93-XiaoJia849?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\346\225\260\346\215\256\345\272\223.md" | 240 ++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 "docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" diff --git "a/docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" "b/docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 00000000..fb100986 --- /dev/null +++ "b/docs/views/dev/2020-11-15-Java\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,240 @@ +--- +layout: post +title: Java连接数据库 +date: 2020-11-01 +author: XiaoJia849 +categories: + - 开发部 +tags: + - 后端 + - 数据库 + - Java +--- + +# 下载 + +mysql-installer-community-8.0.20.0下载: + +[https://pan.baidu.com/s/1JowAkm1O5O7iLn1H-072Zw](https://pan.baidu.com/s/1JowAkm1O5O7iLn1H-072Zw) + +提取码:yf69 + +navicat 下载 + +[https://pan.baidu.com/s/17_z76E9DgIlCBwY81maSVQ](https://pan.baidu.com/s/17_z76E9DgIlCBwY81maSVQ) + +提取码:1hdt + +ecplise + +自行在官网下载,安装 + +mysql-connector-java-5.1.46-bin 用于数据库的连接 + +[https://pan.baidu.com/s/19UtMM4TzlicRkEPuv7hyzw](https://pan.baidu.com/s/19UtMM4TzlicRkEPuv7hyzw) + +提取码:ovhx + +下载包链接如上,具体安装请查询CSDN + +# 数据库的准备 + +## 建立连接 + +打开Navicat——点击连接——MySQL + +![新建连接](https://upload-images.jianshu.io/upload_images/25040907-c0a45523baf1ba76.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +连接名——自拟 + +用户名,密码——与MySQL下载时保持一致 + +先连接测试确认成功后再按确定 + +## 建立数据库 + +双击 连接名 得到: + +![数据库的初始内容](https://upload-images.jianshu.io/upload_images/25040907-275a702e6c66c9b0.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +以上4个数据库请不要随意使用 + +右键 连接名 新建数据库 + +![新建数据库](https://upload-images.jianshu.io/upload_images/25040907-df6a7bdd3c5a23b5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +数据库名——自拟 + +如果使用的数据库内包含中文字符,最好 + +字符集使用gb2312或者utf8 + +对应的排序规则(我不清楚有什么特别的规定,我的习惯是:) + +对应的是gb2312_chinese_ci  utf8_unicode_ci + +## 例子: + +双击数据库得到如下: + +![数据库内容](https://upload-images.jianshu.io/upload_images/25040907-8dc80b1585ceb53e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +右键 表 新建表 + +开始设置字段的 名 类型 长度 小数点 ,,,, + +设置结束后 点击保存 + +得到弹窗 输入表名即可 + +## 转储数据库 + +右键 数据库名 转储SQL文件结构和数据 + +选择地址 + +即得到这个数据库的SQL文件 + +## 运行SQL文件 + +右键连接名 运行SQL文件 + +![运行SQL文件](https://upload-images.jianshu.io/upload_images/25040907-bbe45d569f2032f1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +找到文件的地址 + +编码与文件编码对应即可,例如:建立此数据库时采用gb2312,那么打开时也这么使用 + +## 可能遇到的问题 + +1.无法通过 右键 连接名 运行SQL文件 的方式打开此文件 + +解决方案:自己创立一个数据库后,点击 表 右键 运行SQL文件 + +2.运行SQL文件失败 + +Debug方法,只需观察报错信息的第一行,查询错误代码对应的意义,针对性的de + +如果爆语法错误,可能是因为MySQL的版本不太统一造成的。 + +# ecplise上web项目的创建和连接数据库 + +## 创建项目 + +File-new-Dynamic Fragment-Project + +![创建项目](https://upload-images.jianshu.io/upload_images/25040907-edf57b628bf6508f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +Project name 项目名 自拟 + +服务器 我使用的是tomcat9 + +版本 注意!!!! 请使用2.5 + +原因:2.5的会自动在创建servlet时更行web.xml,非常方便!!! + +## 补充没有的jar + +右键 项目名Build Path + +![添加jar包](https://upload-images.jianshu.io/upload_images/25040907-ed0f8ca3ada4a519.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +点击Add External JARS 连接mysql-connector-java-5.1.46-bin这个jar包 + +点击Apply and Close结束 + +所有的添加tomcat和jre没有的jar包的方式都是这样 + +## 文件书写的结构(仅用来记录个人习惯) + +![文件书写结构](https://upload-images.jianshu.io/upload_images/25040907-0c7795dab9fc4eb0.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +Java Resources内的src中 + +创建Ja包内写入JAVA文件 + +创建Se包内写入SERVLET文件 + +在WebContent内写入jsp和html文件 + +## 详细介绍JAVA 连接数据库和运用数据库的步骤 + +### 在Se包内创建servlet文件,DB.java + +```java +package Se; + +import java.sql.*; + +public class DB  { + +public static Connection dbCon(){ + +        Connection  con = null; + +        try { + +            Class.forName("com.mysql.jdbc.Driver"); + +            con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?useSSL=false", "MySQL用户名", "MySQL密码"); + +        } catch (Exception e) { + +        e.printStackTrace();//用于打印错误 + +        } + +        return con; + +    } + +} +``` +?useSSL=false是为了防止因为MySQL版本过高报错 + +### 查询数据库 + +```java +        try { + +    PreparedStatement ps =DB.dbCon().prepareStatement("select user_age from user_info where user_name=? and user_password=?"); + +    ps.setString(1, name); + +    ps.setString(2, pass); + +    ResultSet rs = ps.executeQuery(); + +            if(rs.next()){ + +            userInfo.setAge(rs.getInt(1)); + +            }else{ + +            } + +        }catch (Exception e) { + +} +``` +### 插入数据库 + +```java +try { + +        PreparedStatement ps =DB.dbCon().prepareStatement("insert into user_info (user_name,user_password,user_age) values(?,?,?)"); + +    ps.setString(1,user_name); + +    ps.setString(2, lpassword); + +    ps.setInt(3, age); + +    ps.executeUpdate(); + +}catch (Exception e) { + +        e.printStackTrace(); + +} +``` \ No newline at end of file From 0f1e9b59846ba196b4a9511d0c2408a7b3f68e32 Mon Sep 17 00:00:00 2001 From: XiaoJia849 <18870241505@163.com> Date: Tue, 17 Nov 2020 11:53:26 +0800 Subject: [PATCH 6/9] =?UTF-8?q?201102-Linux=E5=B0=B1=E8=AF=A5=E8=BF=99?= =?UTF-8?q?=E4=B9=88=E5=AD=A61-XiaoJia849?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\350\277\231\344\271\210\345\255\2461.md" | 261 ++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 "docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" diff --git "a/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" new file mode 100644 index 00000000..2a406ef7 --- /dev/null +++ "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2461.md" @@ -0,0 +1,261 @@ +--- +layout: post +title: Linux就该这么学1 +date: 2020-11-14 +author: XiaoJia849 +categories: + - 开发部 +tags: + - 后端 + - Linux +--- + + +## 系统工作命令: + + **1. echo 字符串|$变量名** + + **2. date:** + +查看时间,并设置形式: + +Date ”+%Y-%m-%d %H:%M:%S” + +设定电脑此刻的时间: + +Date -s “20201001 2:30:45” + +%j用来查看今天是本年的第几天 + +**3. reboot重启,只有管理员才可使用** + +**4. poweroff关闭系统,只有管理员才可使用** + +**5. wget下载网络文件** + + wget -r -p http://www.linuxprobe.com用来下载此网站下所有内容,保存到www.linuxprobe.com的文件下 + +**6. ps查看系统中的进程状态** + +记住3个,-a显示所有,-u显示用户以及其他所有详细信息,-x显示没有控制终端的进程 + +![ps查看进程](https://upload-images.jianshu.io/upload_images/25040907-ac7e9f91f28ac166.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +观察上图: + +- R运行中的进程。 + +- S中断/休眠。 + +- D不可中断,使用kill也无法使他中止的进程,此进程不影响系统异步信号。 + +- Z僵死,进程已经终止,等待父进程将其释放。 + +- T停止,进程收到停止信号后停止 + +Ps aux即ps -a -u -x的三者合并。 + +**7. top动态监控进程活动与系统负载** +![top动态监控进程和系统负载](https://upload-images.jianshu.io/upload_images/25040907-e58341f64159ae0c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +观察前5行获取信息: + +- top:当前时间,运行时间,几个用户,5 10 15分钟内的平均负载。 + +- Tasks:总任务数目,正在运行的任务数目,睡眠的任务数目,等等 + +- CPU:关注一下99.3id就行,表示还有99.3%的cpu是空闲的。 + +- KIB Mem:物理内存,总数,空闲数,被使用数目 + +- KiB Swap:虚拟内存,总数,空闲数,被使用数目 + +**8. pidof查询指定服务的pid值** + +pidof sshd + +得到2156 + +**9. kill 进程号** + +kill 2156 + +**10. killall用于中止某个指定名称的服务所对应的所有进程** + +kill sshd + + +## 系统状态检测命令 + +**1. ifconfig获取,IP地址,网卡名称,网卡物理地址,RX/TX的收发流量数据大小** + +**2. uname查看系统内核和系统版本** + +![查看系统版本](https://upload-images.jianshu.io/upload_images/25040907-cc5249ed3373a657.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![查看系统内核](https://upload-images.jianshu.io/upload_images/25040907-489f2e589c6a6787.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +**3. uptime查看系统负载信息** + +内容相当于top的第一行,而且不会实时更新。 + +**4. free显示当前系统中内存的使用量** + +内容相当于top的第4 5行 + +**5. who 查看登入主机的用户的终端信息** + +**6. last查看登录记录** + +**7. history查看最近使用过的命令,最多1000条** + +cat ~/.bash_history可以查看history + +**8. sosreport用来生成一个文档,记录着所有系统配置和框架信息** + +![sosreport](https://upload-images.jianshu.io/upload_images/25040907-00da5a2de747b584.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +存放在上面提示的地址中,将这个文件发送给某个工作人员,让其协助解决问题。 + +## 工作目录切换命令 + +**1. pwd显示用户当前所处的工作目录** + +![工作目录](https://upload-images.jianshu.io/upload_images/25040907-31580bfd20f0331f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +**2. cd跳转目录** + +**3. ls显示目录下的文件-a显示所有文件,包括隐藏文件,-l查看文件的属性,大小等信息** + + +## 文本文件编辑命令: + +**1. cat查看文件 -n同时显示行号** + +**2. more 查看长纯文本文件** + +**3. head 查看纯文本文件的前N行** + +head -n 20 某文件 + +**4. tail纯文本文件 ,与head相对应,如果想看最新文件,请添加-f** + +**5. tr批量替换文本文件中的字符** + +cat 某文件|tr [a-z] [A-Z] + +将某文件所有的小写转换为大写 + +**6. wc 统计指定文件的行数-l,字数-w,字节数-c** + +**7. stat查看文件的具体存储信息等** + +![查看文件具体存储信息](https://upload-images.jianshu.io/upload_images/25040907-36d3d345ec26c060.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +主要的有用信息是access,modify,change + +**8. cut 按列提取文本字符** + +效果如下: + +![原文本内容](https://upload-images.jianshu.io/upload_images/25040907-d5dbdb9ac009bc92.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![按列提取文本字符](https://upload-images.jianshu.io/upload_images/25040907-2f81b500535553ce.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +提取的正好是每行的第一个单词,也就是第一列的内容 + +**9. diff比较多个文件是否相同** + +diff –brief 文件1 文件2 + + +## 文件目录管理命令。 + +**1.touch** + +创建文件同时可以设置文件内容的修改时间mtime,文件权限ctime文件读取时间atime,用-a读取,-m修改 ,-d读取和修改 + +``` +touch -d “2017-05-04 15:44” 某文件 +``` +**2.mkdir创建空白目录在a/b/c/s下** + +``` +mkdir -p a/b/c/s +``` +**3.cp复制文件或者目录** + +cp 源文件 目标文件 +-p保留原文件属性,-d若为链接同p,-r复制目录时使用,-i覆盖目标文件,-a以上全部 + +**4.mv剪切文件或者将文件重命名** + +**5.rm删除文件或者目录** + +**6.dd按照指定大小和个数的数据块复制和转换文件** + +这个命令有4个参数。 +- if输入文件的名称 +- of输出文件的名称 +- bs设置每个块的大小 +- count设置复制块的个数 +``` +dd if=/dev/zero of=文件名 count=1 bs=560M +从/dv/zero中取出一个560M的数据块保存在文件名的下面 +``` +其中bs和count具体多少不重要,乘积才重要。 +dd命令可以用来转换文件保存的类型。只要确定好of的类型,就有了转换后的类型 + +**7.file查看文件类型** + +## 打包压缩与搜索命令 + +**1.tar用于压缩** + +-c创建压缩文件 +-x解压缩 +-t查看压缩包内的内容 +-z用Gzip压缩哟或者解压缩 +-j用bzip2压缩或者解压缩 +-f目标文件名 +-p保留原始文件的属性和权限 +-C指定解压到的目录 +-v用来显示压缩和解压的过程 +注意!!!-f必须放在最后位 + +**2.grep 在文本中执行关键字搜索** + +-b将执行文件当作txt来搜索 +-c只显示目标所在行号 +-i忽略大小写 +-n显示目标所在行号 +-v反向选择 + +**3.find 按照指定条件查询文件** + +-name按名字 +-perm按权限 +-user按所有者 +-group按所有组 +-mtime +n 修改内容时间在n天以前的 +-mtime -n修改时间在n天以内的 +-atime访问文件时间 +-ctime 修改文件权限时间 +-nouser没有所有者的 +-nogroup没有所有组的 +-newerf1!f2比f1新但是比f2旧的 +–type按文件类型匹配 +-size按大小 +-exec搜索到的结果给后面的执行 + +``` +find / -user xiao -exec cp -a () /root/sss/\ +``` + +找到属于xiao用户的所有文件复制到/root/sss/\下面 + + +## 参考 + +- [1] [刘遄.Linux就该4这么学[M].北京:人民邮电出版社,2016:405-456] From 014aaf829daf86c39c5c50b13d262ac007f0c833 Mon Sep 17 00:00:00 2001 From: XiaoJia849 <18870241505@163.com> Date: Tue, 17 Nov 2020 11:53:45 +0800 Subject: [PATCH 7/9] =?UTF-8?q?201103-Linux=E5=B0=B1=E8=AF=A5=E8=BF=99?= =?UTF-8?q?=E4=B9=88=E5=AD=A62-XiaoJia849?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\350\277\231\344\271\210\345\255\2462.md" | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 "docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" diff --git "a/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" new file mode 100644 index 00000000..7acdead3 --- /dev/null +++ "b/docs/views/dev/2020-11-15-Linux\345\260\261\350\257\245\350\277\231\344\271\210\345\255\2462.md" @@ -0,0 +1,171 @@ +--- +layout: post +title: Linux就该这么学2 +date: 2020-11-14 +author: XiaoJia849 +categories: + - 开发部 +tags: + - 后端 + - Linux +--- + +输入重定向——把文件导入到命令中 +输出重定向——把原本要输出到屏幕的数据信息写到指定文件中 + +输入重定向:标准输入重定向。STDIN,可从键盘,其他文件或命令中输入。 + +输出重定向最常使用,分为:标准输出重定向,错误输出重定向 + +## 输出重定向: + +Man bash > readme.txt 把屏幕中的内容输出到readme.txt文件内。 + +覆盖写入:echo “WELcome” > readme.txt——把双引号内内容覆盖readme.txt的原本内容 + +追加写入:echo “WELcome” >>readme.txt——把双引号内内容追加到readme.txt + +把命令的所有报错信息写入文件,使用SHELL脚本。 + +Ls -l xxxxx 2>/root/stdeer.txt + +把ls -l xxxxx 2的所有提示信息输入到/root/stdeer.txt + +/root/stdeer.txt是一个只读文件。 + +## 输入重定向: + +Wc -l < readme.txt 这个是统计文本行数 + +输出readme.txt这个文件内容的行数 + +## 管道命令符 + +| 管道符 + +A | B 把A命令原本要输入到屏幕的数据当作是后一个命令的标准输入。 +``` +grep “/sbin/nologin” /etc/password | wc -1 +``` +这个是找到在 /etc/password 里“/sbin/nologin”出现的次数 + +重置用户root的密码: +``` +echo “linuxprobe” | password –stdin root +``` +发送邮件 +``` +echo “Content” | mail -s “Subject” 用户名 +``` + +![发送邮件](https://upload-images.jianshu.io/upload_images/25040907-527f060c19df283b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +![更改内容](https://upload-images.jianshu.io/upload_images/25040907-15449bb2606d6d76.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +## 关于发送邮件的详细过程如下: + +### 1.安装 + +- sendmail:yum install -y sendmail +- mail:yum install -y mailx +- 安装mutt:yum install -y mutt + +### 2.修改配置文件 + +``` +vim /etc/mail.rc +``` +在此文件下补充以下内容 + +``` +set ssl-verify=ignore 无需ssl确认 +set nss-config-dir=/etc/pki/nssdb +set from=邮箱 +set smtp=smtps://smtp.qq.com:465 如果是qq邮箱就这么写 +set smtp-auth-user=邮箱,同上 +set smtp-auth-password=IMAP/SMTP服务密码 +set smtp-auth=login +``` + +启动sendmail : systemctl restart sendmail + +[详细配置mail.rc的参考网址](https://blog.csdn.net/thinkthewill/article/details/80868442?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare) + +``` +echo "邮件内容" | mail -s "邮件名" 目标邮箱 +``` +用这一条命令是表示,我从我的本地账户(mail.rc配置的邮箱)发送邮件到目标邮箱 + +## 命令行的通配符 + +*匹配0个或者多个 + +?匹配单个字符 + +[0-9]匹配0-9之间的单个数字的字符 + +[abc]匹配abc中的任意一个字符 + +ls -l /dev/sda* 展示所有sda开头的文件的信息。 + +## 常用转义字符\ ‘’ “” + +$$是显示当前进程号,第一个 \$ 表示显示内容 + +\\$$ 的第一个 \$ 没有特殊含义 + +![\$的使用](https://upload-images.jianshu.io/upload_images/25040907-0db59bd878755a62.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +当要执行某命令也可以这么写 + +![执行某命令](https://upload-images.jianshu.io/upload_images/25040907-d05a824c70ec72b2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +## 重要的环境变量 + +命令在linux内执行的步骤: + +第一步:判断用户是否以绝对路径或者相对路径的方式输入命令 + +第二步:检查输入命令是否为别名命令 + +可以用alias命令创建属于自己的命令别名 + +- alias 别名 =命令 运用此别名 + +- unalias 别名 释放此别名 + +第三步:Bash解释器判断用户输入的是内部命令还是外部命令 + +内部命令:解释器内部的指令,直接执行 + +外部命令:由下一步执行,用 type 命令名称    判断用户输入的是内部命令还是外部命令 +![判断命令属于内部或者外部](https://upload-images.jianshu.io/upload_images/25040907-535352b1a14d2241.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +cat是bin里的,说明是内部命令 + +第四步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫PATH + +![查看path](https://upload-images.jianshu.io/upload_images/25040907-5c6789bd7266e9e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +不能将当前目录(.)添加到PATH,因为:如果黑客在共用目录/tmp中存放了和ls或者cd命令同名的木马文件,用户如果在公共目录下执行了这些命令,就有可能中招。 + +设定解释器搜索所执行的命令的路径——PATH变量 + +注意:不同用户下的同一变量代表的意义不同 + +![root用户下](https://upload-images.jianshu.io/upload_images/25040907-9b2a55e9f7a4c7c5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![xiao用户下](https://upload-images.jianshu.io/upload_images/25040907-c4c7c5f110a9d0c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +随便使用一个命令就可以创建这样的变量,例如WI=/home/workdir cd $WI就可以跳转到这个目录。 + +但是这种变量的作用范围有限,不可以被其他用户使用。但是可以使用export WI 把WI这个命令转换为全局变量。 + +## 参考 + +- [1] [刘遄.Linux就该4这么学[M].北京:人民邮电出版社,2016:100-371] +- [2] [详细配置mail.rc的参考网址](https://blog.csdn.net/thinkthewill/article/details/80868442?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare) \ No newline at end of file From 9355c695aa7e2def2f0229dde5f5b91c0b7ef92f Mon Sep 17 00:00:00 2001 From: XiaoJia849 <62590724+XiaoJia849@users.noreply.github.com> Date: Sun, 27 Dec 2020 16:29:33 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6:=20doc?= =?UTF-8?q?s/views/dev/2020-12-06-=E5=AE=9E=E8=AE=AD=E9=A1=B9=E7=9B=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\350\256\255\351\241\271\347\233\256.md" | 454 ++++++++++++++++++ 1 file changed, 454 insertions(+) create mode 100644 "docs/views/dev/2020-12-06-\345\256\236\350\256\255\351\241\271\347\233\256.md" diff --git "a/docs/views/dev/2020-12-06-\345\256\236\350\256\255\351\241\271\347\233\256.md" "b/docs/views/dev/2020-12-06-\345\256\236\350\256\255\351\241\271\347\233\256.md" new file mode 100644 index 00000000..779e9f1a --- /dev/null +++ "b/docs/views/dev/2020-12-06-\345\256\236\350\256\255\351\241\271\347\233\256.md" @@ -0,0 +1,454 @@ +--- +layout: post +title: 2020-12-06-实训项目 +date: 2020-12-6 +author: XiaoJia849 +categories: + - 开发部 +tags: 后端,springboot,文件处理 + - 后端 + - springboot + - 文件处理 +--- + + + +项目实训已经度过3周,三周内被迫学会了springboot 和mybatis的基本使用,以下是我的一点总结。以及对文件的操作记录。 + +* Maven +* Mybatis +* Springboot +* 上传excel与解析 +* 上传任意类型文件且保存 +* 浏览器下载文件 +* java处理word模板 + +### Maven + +Maven是个好东西,如果在配置pom.xml时不经常爆红的话。 +Maven在我的理解中是一个jar包管理库,使用Maven让我无需导入jar包,如果需要使用这个jar包时,只需要在pom.xml内写入依赖即可,非常方便。 + +### Mybatis + +Mybatis内写sql语句调用数据库的资源,把所有涉及与数据库交互的过程全部封装在mapper内的xml文件中,但是对于初次接触MyBatis的我而言不是很友好。~~当我需要写嵌套查询时,发现此时仅仅是更改sql语句只会引发一串报错,这也就意味着,当sql语句跳出了简简单单的一层插入,更新,查询时,难度大幅度上升了。~~其实只是我太菜了,要写嵌套查询还是很方便的。 + +#### 例子 +```java + + insert into pro (Pid,Pname,Pcontent,Pnum) + values (#{Pid},#{Pname},#{Pcontent},#{Pnum}) + + + + + update stu_team_pro + set Pid=#{pid} + where GroupId=#{groupId}; + +``` +和sql里面写嵌套查询没啥区别,我也不知道为什么我在网上搜到的那么复杂ㄟ( ▔, ▔ )ㄏ +总而言之,感谢队友 (*^_^*) +```java + + Update tea_ans + set Grade=#{Grade} + where Tid=#{Tid} and ReplyId in( + select ReplyId + from scen + where GroupId=#{GroupId} + ); + +``` +### Springboot + +Springboot的亮点在于5层框架,把每层的功能分的十分细致。 + +- model层描述对象的属性。 +- dao层与Mybatis打交道,里面写满各种与数据库相关的方法。 +- service层则可以将dao层的方法组合起来使用,当要处理的问题简单时,其实并不需要service层。 +- control层用于和前端进行交互,接收数据,调用dao层或者service层的方法进行处理,处理后将结果返回前端。 +- config层我只知道可以作为拦截器限制control层与前端的交互。 + +此外,springboot的优点还在于可以清晰的让每个函数只做一件事,比如说: +函数A要更改数据库,函数B要实现把数据库中的数据拿到前端展示的作用 +可是我们要实现的功能是界面上更改数据库传出请求后马上返回到这个页面,要将AB两个函数的功能按顺序使用,那么可以在A函数结束后 return "redirect:/B" ,这样就OK了 + +之前采用MVC框架写过前后端的代码,那个时候并不知道springboot这么香的存在,哎 + + +### 上传excel与解析 + +#### 功能 + +前端上传excel文件,后端实现获取excel内容,并将对应的内容存入数据库内 + +#### 要点 + + 1. 上传文件的 jsp要进行以下修改 + +```java + +``` +```java +
+ + +
+``` +在jsp的head内和form内都明确上传的数据类型是multipartFile,且限制上传的文件类型为excel + + 2. Maven导包使支持POI且2007之后的excel文件处理 + + 在pom.xml内写入以下内容 + ```java + + org.apache.poi + poi-ooxml + 3.15 + + + org.apache.poi + poi-scratchpad + 3.8 + + ``` + 写入以上之后才能使用XSSF + + 3. control层内代码实现 + +```java + @PostMapping("AdminEXC") + public String export(@RequestParam("exc") MultipartFile file, + HttpServletRequest request, HttpServletResponse response) { + try { + // @RequestParam("file") MultipartFile file 是用来接收前端传递过来的文件 + // 1.读取文档file并且把数据流形式存放在inputStream内 + InputStream inputStream = file.getInputStream(); + //定义工作簿,把数据流以excel文件的形式组织起来,形成工作簿 + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream); + //定义工作表,工作簿第0页也就是第一张sheet + XSSFSheet xssfSheet; + xssfSheet = xssfWorkbook.getSheetAt(0); + //已知excel第0列内容是专业 + //要获取不重复的专业列我采用放入map的方式 + Map map= new HashMap(); + //定义标题行,第0行为标题行,index = 0 + XSSFRow titleRow = xssfSheet.getRow(0); + //xssfSheet无法直接获得一列的元素,所以只能用行的for循环 + //获取专业列也即map的key 列 + for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) { + XSSFRow xssfRow = xssfSheet.getRow(rowIndex); + if (xssfRow.getCell(3) == null) { + continue; + }else{ + map.put(xssfRow.getCell(3).getStringCellValue(),1); + } + } + //xssfSheet.getPhysicalNumberOfRows()代表这个工作表的行数,并不一定就等于有文字的部分的行数,所以在进行for循环时,判断对应的值是否为null时十分有必要的 + + + //根据key的排列对value进行从上到下的标号 + //标号后存入数据库内 + int i=0; + //将专业相关信息插入dept表内 + for (Map.Entry entry : map.entrySet()) { + i=i+1; + entry.setValue(i); + //一个数据库插入函数 + //把key作为sdept i作为Sdid 插入 + proDao.Insdid(i,entry.getKey()); + } + + + //循环取每行的数据,完善学生相关信息 + for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) { + XSSFRow xssfRow = xssfSheet.getRow(rowIndex); + if (xssfRow.getCell(3) == null) { + continue; + }else{ + String sid=xssfRow.getCell(0).getStringCellValue(); + String sname=xssfRow.getCell(1).getStringCellValue(); + String spwd=sid.substring(0,3)+sid.substring(5,8); + Integer sdid=map.get(xssfRow.getCell(3).getStringCellValue()); + proDao.Instu(sid,sname,spwd,sdid); + } + //以上部分为基操,不做描述 + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return "Adminfunc"; + } + +``` +### 上传任意类型文件且保存 + + +上传文件的 jsp要进行以下修改 + +```java + +``` +```java +
+ + + +
+``` +在jsp的head内和form内都明确上传的数据类型是multipartFile + + +```java + @PostMapping("Proupload") + public String Upload(HttpServletRequest request,@RequestParam("xfile") MultipartFile file){ + try{ + //获取题目id + int pid=Integer.valueOf(request.getParameter("pid")); + //得到文件名 + String filename = file.getOriginalFilename(); + //得到文件类型 + String extFileName = filename.substring(filename.lastIndexOf("." ) +1,filename.length()); + //例如上传文件xx.txt + //filename="xx.txt" + //extFileName="txt" + + //获取当前所在文件夹的绝对路径realPath + String realpath=request.getSession().getServletContext().getRealPath("/"); + //略微修改一下,得到我将把上传的文件夹存入的路径 ——filePath + String filePath=realpath.substring(0,realpath.length()-7)+"resources\\file\\"; + String path = filePath + filename; + //以上两者拼接得到一个完整的文件存入的路径 + //在这个路径上创建文件 + File dest = new File(path); + if (!dest.getParentFile().exists()){ + //若此路径不存在则创建目录 + dest.getParentFile().mkdir(); + } + //将file文件完全复制存入到dest这个文件内 + file.transferTo(dest); + //把对应的数据库信息存入 + proDao.Inurl(pid,path); + }catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return "Teafunc"; + } +``` + + + +### 浏览器下载文件 + + 1. jsp内 + +```java +
+ +
+``` + + 2. pom.xml内补充依赖 + +```java + + org.junit.platform + junit-platform-engine + +``` + + 3. control层 + +```java + @PostMapping("download") + public static void downFile(HttpServletRequest request, HttpServletResponse response) throws IOException { + //等待被下载的文件的绝对路径 + String url="F:\\ne\\AC自动机&TireTree.docx"; + //该文件的名字 + String filename="AC自动机&TireTree.docx"; + //找到该文件 + File file=new File(url); + // 文件存在才下载 + if (file.exists()) { + OutputStream out = null; + FileInputStream in = null; + try { + // 把文件转化为数据流存储在in内 + in = new FileInputStream(file); + // 告诉浏览器下载的方式以及一些设置 + // 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码 + //获取浏览器信息 + String agent = request.getHeader("user-agent"); + if (agent.contains("FireFox")) { + //如果是火狐浏览器,则需要转编码 + filename = new String(filename.getBytes("UTF-8"), "iso-8859-1"); + } else { + //其他的全部设置为UTF-8形式 + filename = URLEncoder.encode(filename, "UTF-8"); + } + // 设置下载文件的mineType,告诉浏览器下载文件类型 + String mineType = request.getServletContext().getMimeType(filename); + //设置相应类型与文件类型一致(因为要下载这个文件) + response.setContentType(mineType); + // 设置一个响应头,无论是否被浏览器解析,都下载 + response.setHeader("Content-disposition", "attachment; filename=" + filename); + // 将要下载的文件内容通过输出流写到浏览器 + out = response.getOutputStream(); + //把输入流的内容全部复制到输出流 + int len = 0; + byte[] buffer = new byte[1024]; + while ((len = in.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + //复制结束后实现了输出一个一模一样的文件 + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } + } + } + +``` + + +#### 例子 + +### java处理word模板 + + 1. jsp内 + +```java + +
+ +
+``` + + 2. pom.xml内 + +```java + + org.apache.poi + ooxml-schemas + 1.4 + +``` + + 3. control层 + +已知我的模板文件在resources/file/下 stugrade.docx +要在同目录下创建文件xx4.docx +![stugrade.docx](https://upload-images.jianshu.io/upload_images/25040907-e7b98b0663207370.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +```java + @PostMapping("getGrade") + public static String getGrade(HttpServletRequest request, HttpServletResponse response) throws IOException { + // 获取当前项目的绝对地址 + String realpath=request.getSession().getServletContext().getRealPath("/"); + String filePath=realpath.substring(0,realpath.length()-7)+"resources\\file\\"; + //模板文件地址,下面过程不会更改模板文件 + String inputUrl = filePath + "stugrade.docx"; + //新生产的文件 + String outputUrl=filePath+"xx4.docx"; + //在map内按照模板对应位置的英文key补充填写内容value + Map map=new HashMap<>(); + map.put("Pname","hhh"); + map.put("Tname","hhh"); + map.put("student","hhh"); + map.put("tea1","hhh"); + map.put("grade1","hhh"); + map.put("tea2","hhh"); + map.put("grade2","hhh"); + map.put("time","hhh"); + map.put("place","hhh"); + map.put("grade","hhh"); + try { + //获取word文档解析对象 + XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl)); + //获取文章 + Iterator itPara = document.getParagraphsIterator(); + while (itPara.hasNext()) { + //获取段落 + XWPFParagraph paragraph = (XWPFParagraph) itPara.next(); + //获取段落内的最小结构run + List runs = paragraph.getRuns(); + for (XWPFRun run : runs) { + //获取文字 + String text = run.getText(0); + if (text != null) { + boolean isSetText = false; + //遍历map寻找key + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + if (text.indexOf(key) != -1) {// 在配置文件中有这个关键字对应的键 + isSetText = true; + Object value = entry.getValue(); + if (value instanceof String) { + // 文本替换 + if (text.contains(key)) { + text = text.replace(key, value.toString()); + } + } + } + } + if (isSetText) { + run.setText(text, 0); + } + } + } + } + //创建输出文件 + File file = new File(outputUrl); + FileOutputStream stream = new FileOutputStream(file); + //把document的内容写入到stream对应的文件file内 + document.write(stream); + stream.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return "Adminfunc"; + } +``` + +### 备注 + +[request.getHeader("useradgent")解释](https://blog.csdn.net/w410589502/article/details/73163383) +[mimetype解释](https://developer.mozilla.org/zh-CN/docs/Glossary/MIME_type) + +### 参考 + +[解析excel](https://blog.csdn.net/zxs281/article/details/80856251) +[文件上传](https://blog.csdn.net/Seven71111/article/details/105512814?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160708002519724813250458%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160708002519724813250458&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-8-105512814.first_rank_v2_pc_rank_v29&utm_term=%E5%89%8D%E7%AB%AF%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E6%98%AF%E4%B8%8A%E4%BC%A0%E5%88%B0%E5%93%AA%E4%BA%86&spm=1018.2118.3001.4449) +[解决springMVC文件上传报错: The current request is not a multipart request ](https://www.cnblogs.com/sharpest/p/10177226.html) +[从后端下载文件到浏览器](https://www.cnblogs.com/mark-luo/p/11577979.html) +[获取本地文件的几种方式](https://blog.csdn.net/weixin_43078114/article/details/100161923?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160712934519724827690627%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160712934519724827690627&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-100161923.first_rank_v2_pc_rank_v29&utm_term=java%20%E8%8E%B7%E5%8F%96%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6&spm=1018.2118.3001.4449) +[获取项目根目录](https://blog.csdn.net/mydreamongo/article/details/8220577) +[试图打开word报错](https://www.cnblogs.com/peng-zhang/p/9875136.html#:~:text=%E5%88%86%E6%9E%90.,%E4%B8%80%E8%88%AC%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E9%81%87%E5%88%B0%E8%AF%A5%E9%97%AE%E9%A2%98%E9%83%BD%E6%98%AF%E6%89%93%E5%BC%80%E7%BD%91%E4%B8%8A%E4%B8%8B%E8%BD%BD%E7%9A%84word%E6%96%87%E6%A1%A3%E6%97%B6%EF%BC%8C%E9%81%87%E5%88%B0%E5%87%BA%E9%94%99%E6%8F%90%E7%A4%BA%EF%BC%8C%E5%8E%9F%E5%9B%A0%E6%98%AF%E7%94%B5%E8%84%91%E5%AF%B9%E6%9D%A5%E6%BA%90%E4%BA%8E%E4%BA%92%E8%81%94%E7%BD%91%E7%9A%84%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E4%BA%86%E6%A0%87%E8%AF%86%E5%92%8C%E5%AE%89%E5%85%A8%E4%BF%9D%E6%8A%A4%EF%BC%8C%E6%96%B9%E5%BC%8F%E6%96%87%E4%BB%B6%E4%B8%AD%E6%BD%9C%E5%85%A5%E7%9A%84vb%E7%A8%8B%E5%BA%8F%E5%B8%A6%E6%9C%89%E7%97%85%E6%AF%92%EF%BC%8C%E5%BD%B1%E5%93%8D%E7%94%B5%E8%84%91%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%EF%BC%8C%E6%89%80%E4%BB%A5%E6%89%93%E5%BC%80%E8%AF%A5%E6%96%87%E4%BB%B6%E8%BF%98%E6%98%AF%E9%9C%80%E8%A6%81%E7%A1%AE%E8%AE%A4%E5%AE%89%E5%85%A8%E6%80%A7%E4%B9%8B%E5%90%8E%E5%9C%A8%E6%93%8D%E4%BD%9C%E3%80%82.) +[word替换关键字](https://blog.csdn.net/yangbaggio/article/details/106436341?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160715037319724839569629%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160715037319724839569629&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-106436341.first_rank_v2_pc_rank_v29&utm_term=word%E6%96%87%E6%A1%A3%E5%86%85%E5%AE%B9%E6%9B%BF%E6%8D%A2java&spm=1018.2118.3001.4449) +[poi的jar包参考](https://www.cnblogs.com/xinaixia/p/6707868.html) +[XWPF文本替换](https://www.jianshu.com/p/1355fad12ead) +参考网址整理时,还有遗漏的,也有些部分是我查看后发现不适用的就没放上来 + +### 项目 + +这个是我们小组6个人的作品,如果允许的话,~~项目源码将在这个实训结束后上传github网址用于分享~~ 不了,还是算了吧 \ No newline at end of file From b70f889f5296f90eb2fd03026f1261e3e2a1eec7 Mon Sep 17 00:00:00 2001 From: XiaoJia849 <62590724+XiaoJia849@users.noreply.github.com> Date: Sun, 27 Dec 2020 16:31:44 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6:=20doc?= =?UTF-8?q?s/views/dev/2020-12-06-=E5=AE=9E=E8=AE=AD=E9=A1=B9=E7=9B=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit