/*1.注册驱动
- 2.获取连接
- 3.获取传输器
- 4.传输器执行SQL,返回结果
- 5.处理结果
- 6.释放资源*/
继承–强耦合–缺了父类子类连方法都没有
接口–松耦合
高内聚–写一次处处调用,提高代码复用性
Statement和PrepareStatement的区别
其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句。
PrepareStatement跟Statement的主要区别就是把上面sql语句中的变量抽出来了。
这就是PrepareStatement第一大优点----可以提高代码的可读性。
结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象
############################################
/**因为前两步太常见,不适合次次写
这里封装一个方法(高内聚,一次封装次次调用,提高代码复用性)
用来 注册驱动 和 获取DB连接*/
public static Connection getConneection() throws Exception{
Class.forName("com.mysql.jdbc.Driver");//注册驱动
String url = "jdbc:mysql://localhost:3306/tedu2107";//DB连接
Connection c = DriverManager.getConnection(url, "root", "root");
return c;//返回给调用者一个DB连接信息
}//static-->节约内存,每次都可以直接调用
//封装了方法,用来 关闭资源
public static void close(Connection c,ResultSet r,PreparedStatement s){
if(r!=null) {//为了防止空指针异常
try {
r.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(s!=null) {//为了防止空指针异常
try {
s.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(c!=null) {//为了防止空指针异常
try {
c.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/*鼠标移到方法上,可以查看方法的文档注释*/
private static void method() throws Exception {
ResultSet r = null;
PreparedStatement s = null;
Connection c = null;
try {
//模拟登录
c = getConneection();
//传输器执行sql
String a = new Scanner(System.in).next();
String b = new Scanner(System.in).next();
String sql = "select * from user where name = ? and password= ?";
/*这里的sql命令语句称为:SQL骨架,?叫占位符
* 此处称为用户占位符发起一个sql骨架*/
//获取全新传输器
s = c.prepareStatement(sql);//这里已经获取SQL骨架,后面不需再重复获取
//给SQL设置参数,(给第N个参数设置什么值)
s.setString(1, a);
s.setString(2, b);
/*防范sql注入的解决方案
单独把骨架和输入分开,使#之类的特殊符号不再有特殊含义,视作普通字符处理
安全,简单高效
*/
r = s.executeQuery();//获取结果集
//处理结果(判断是否查到了,有直接登录,否则失败)
if (r.next()) {
System.out.println("恭喜您,登录成功");
} else {
System.out.println("登录失败");
}
}catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
close(c,r,s);
}
}
/*总结:
- SQL攻击:出现了特殊的符号#,改变了SQL语义,本质上是因为用Statement
- 解决方案:利用全新的传输器PreparedStatement
,本质上 把SQL骨架和SQL的参数分开执行的,遇到了#只是当做一个普通的文本而不是注释符号了 - 优点: 省去了拼接SQL语句的麻烦, 防止了SQL攻击, 高效*/
############################################
中文乱码
url增加参数:characterEncoding=utf8防止中文乱码
String url =“jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&serverTimezone=Asia/Shanghai”;
SQL注入
String condition = “陈强”;
String condition = “陈强’ or 1=1 or '”;
String condition = “陈强’ or true or '”;
↓
String sql = “select * from teachers where tname=’” + condition+"’";
利用sql中’单撇是字符串的结束符,or只要一个条件成立其它就不用再判断,而恶意造成sql查询失效,本应该只展示一条数据,结果全部展现。
注入后形成的SQL:
SELECT * FROM teachers WHERE tname=‘陈强’ OR 1=1 OR ‘’
############################################
DB_JDBC结束
############################################
<html前端>
<!doctype html>声明这是一个网友文档
<Git版本控制>
开发难题
在实际开发中我们会遇到一些问题,电脑蓝屏,代码丢了,懊悔不?磁盘坏了,文件没了,懊悔不?时间长了,文件找不到了,懊悔不?
手欠,之前代码运行好好的,非要去优化下,结果还不如以前,信心满满,之前代码没保存,懊悔不?怎么解决呢?版本控制就可以解决这些难题了。
版本控制(Version Control System),它功能强大,不仅能备份你的文件,还可以实现很多:
记录文件的所有历史变化
错误恢复到某个历史版本
多人协作开发编辑同一个文件
实现功能差异版本(分支),如:mysql、mariadb、percona三个分支
注意:Git支持高并发,以及一些分布式.
主流的版本控制产品:CVS,SVN,Git
组成结构:
工作空间:用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要
的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
本地索引:保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。
有时候也被称作"索引",不过一般说法还是叫暂存区域。
本地仓库,之所以说git 快,大部分提交都是对本地仓库而言的,不依赖网络,最后一次会推送的到远程仓库。
远程仓库:可以看做是github,它是一个远程仓库,它提供web服务供大家方便下载、查看、提交、存储。
简易的命令行入门教程:
Git 全局设置:
git config --global user.name “ZIBAOCIGUAI”
git config --global user.email “2986335665@qq.com”
创建 git 仓库:
mkdir online_-git_-local_-cgb
cd online_-git_-local_-cgb
git init
touch README.md
git add README.md
git commit -m “first commit”
git remote add origin https://gitee.com/zibaociguai/online_-git_-local_-cgb.git
git push -u origin master
已有仓库?
cd existing_git_repo
git remote add origin https://gitee.com/zibaociguai/online_-git_-local_-cgb.git
git push -u origin master
点击文件管理器地址栏,进入地址选中状态,输入cmd+回车–>直接在此处进入指定位置的命令行界面
cmd窗口点击右键可以直接粘贴
D:\GIT_LOCAL_CGB\cgb2107>git init 初始化文件夹为GIT本地仓库(标志为文件夹中出现.git隐藏文件)
D:\GIT_LOCAL_CGB\cgb2107>git add . 提交文件至本地索引
git config --global user.name “cgblpx” #配置在gitee上注册的账号
git config --global user.email “2250432165@qq.com” #配置在gitee上注册的邮箱
git config --list #检查配置信息
git init #初始化了git(产生了一个隐藏文件.git)
git add . # 提交本地仓库的所有资源
git commit -m “first commit” #把本地索引的文件提交到本地仓库
git remote add origin https://gitee.com/cgblpx/cgb2107.git #建立本地仓库和远程仓库的关系
git push -u origin master #把本地仓库的资源 提交给Git服务器
#第一次上传文件,需要输入用户名和密码的…
↓↓↓↓↓创建本地仓库及提交文件↓↓↓↓↓
Microsoft Windows [版本 10.0.19042.508]
© 2020 Microsoft Corporation. 保留所有权利。
D:\GIT_LOCAL_CGB>git config --global user.name “ZIBAOCIGUAI”
D:\GIT_LOCAL_CGB>git config --global user.email “2986335665@qq.com”
D:\GIT_LOCAL_CGB>git config --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean – %f
filter.lfs.smudge=git-lfs smudge – %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=E:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
user.name=ZIBAOCIGUAI
user.email=2986335665@qq.com
D:\GIT_LOCAL_CGB>mkdir cgb2107
D:\GIT_LOCAL_CGB>cd cgb2107
D:\GIT_LOCAL_CGB\cgb2107>git init
Initialized empty Git repository in D:/GIT_LOCAL_CGB/cgb2107/.git/
D:\GIT_LOCAL_CGB\cgb2107>git add .
D:\GIT_LOCAL_CGB\cgb2107>git commit -m “first commit”
[master (root-commit) df174a9] first commit
1 file changed, 1 insertion(+)
create mode 100644 1.txt
D:\GIT_LOCAL_CGB\cgb2107>
D:\GIT_LOCAL_CGB\cgb2107>
D:\GIT_LOCAL_CGB\cgb2107>
D:\GIT_LOCAL_CGB\cgb2107>git remote add origin https://gitee.com/zibaociguai/online_-git_-local_-cgb.git
D:\GIT_LOCAL_CGB\cgb2107>git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.1]
To https://gitee.com/zibaociguai/online_-git_-local_-cgb.git
- [new branch] master -> master
Branch ‘master’ set up to track remote branch ‘master’ from ‘origin’.
D:\GIT_LOCAL_CGB\cgb2107>