文章目录
一,作业
–1,需求: 模拟用户登录现象
1,需要你自己创建user表,并提供一些字段(id name password)
2,向表中添加记录,如1 jack 123456
3,编写JDBC程序,完成登录
4,本质上就是向发起了select语句:
select * from user where name=‘jack’ and password=‘123456’
5,当用户输入正确的用户名和密码时,提示登录成功,否则提示登录失败
–2,测试
package cn.tedu.test2;
import java.sql.*;
import java.util.Scanner;
//测试 作业
/*
总结:
1, SQL攻击:出现了特殊的符号#,改变了SQL语义,本质上是因为用Statement
2, 解决方案:利用全新的传输器PreparedStatement,
本质上 把SQL骨架和SQL的参数分开执行的,遇到了#只是当做一个普通的文本而不是注释符号了
3, 优点: 省去了拼接SQL语句的麻烦, 防止了SQL攻击, 高效
*/
public class Test1 {
public static void main(String[] args) {
// method();//用普通的传输器
method2();//用安全的传输器
}
//用安全的传输器,解决SQL攻击
private static void method2() {
try {
//调用封装的方法,获取数据库的连接
Connection c = getConnection();
//3,准备SQL
String a = new Scanner(System.in).nextLine() ;
String b = new Scanner(System.in).nextLine() ;
//SQL骨架,?叫占位符
String sql = "select * from user where name=? and password=?";
//4,获取 新的传输器
PreparedStatement s = c.prepareStatement(sql);
//给SQL设置参数
s.setString(1,a);//给第1个?的位置,设置a的值
s.setString(2,b);//给第2个?的位置,设置b的值
//执行拼接好的 SQL
ResultSet r = s.executeQuery();
//5,判断是否查到了数据,就直接登录,否则登录失败
if(r.next()){
System.out.println("恭喜您,登录成功~");
}else{
System.out.println("登录失败~");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//TODO 6,释放资源
r.close();
s.close();
c.close();
}
}
/**
* 封装了方法,用来 获取数据库的连接
*/
public static Connection getConnection() throws Exception{
//1,注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2,获取数据库的连接
String url = "jdbc:mysql://localhost:3306/cgb2107";
Connection c = DriverManager.getConnection(url,"root","root");
return c ;//返回给调用者
}
//模拟登录
//SQL攻击/注入:当SQL语句中出现了#时,会把后面的SQL语句注释,改变了SQL的语义
private static void method() {
try {
//调用封装的方法,获取数据库的连接
Connection c = getConnection();
//3,获取传输器
Statement s = c.createStatement();
//4,利用传输器执行SQL,返回结果
// String sql = "select * from user where name='jack' and password='123'";参数写死了
//动态接受用户输入的用户名和密码,并动态拼接到SQL语句里
String a = new Scanner(System.in).nextLine() ;
String b = new Scanner(System.in).nextLine() ;
//当用户输入了特殊的名字时jack'#,发生了SQL攻击现象
String sql = "select * from user where name='"+a+"' and password='"+b+"'";
ResultSet r = s.executeQuery(sql);
//5,判断是否查到了数据,就直接登录,否则登录失败
if(r.next()){
System.out.println("恭喜您,登录成功~");
}else{
System.out.println("登录失败~");
}
//6,释放资源
r.close();
s.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
–3,标准的释放资源
//用安全的传输器,解决SQL攻击
private static void method2() {
//为了能让finally使用变量
Connection c = null;
PreparedStatement s =null;
ResultSet r =null;
try {
//调用封装的方法,获取数据库的连接
c = getConnection();
//3,准备SQL
String a = new Scanner(System.in).nextLine() ;
String b = new Scanner(System.in).nextLine() ;
//SQL骨架,?叫占位符
String sql = "select * from user where name=? and password=?";
//4,获取 新的传输器
s = c.prepareStatement(sql);
//给SQL设置参数
s.setString(1,a);//给第1个?的位置,设置a的值
s.setString(2,b);//给第2个?的位置,设置b的值
//执行拼接好的 SQL
r = s.executeQuery();
//5,判断是否查到了数据,就直接登录,否则登录失败
if(r.next()){
System.out.println("恭喜您,登录成功~");
}else{
System.out.println("登录失败~");
}
}catch (Exception e) {
e.printStackTrace();
}finally{
//TODO 6,释放资源
if(c != null){//为了防止空指针异常
try {
c.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(r != null) {//为了防止空指针异常
try {
r.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(s != null) {//为了防止空指针异常
try {
s.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
–4,改造释放资源
/**
* 封装了方法,用来 关闭资源
*/
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();
}
}
}
//用安全的传输器,解决SQL攻击
private static void method2() {
//为了能让finally使用变量
Connection c = null;
PreparedStatement s =null;
ResultSet r =null;
try {
//调用封装的方法,获取数据库的连接
c = getConnection();
//3,准备SQL
String a = new Scanner(System.in).nextLine() ;
String b = new Scanner(System.in).nextLine() ;
//SQL骨架,?叫占位符
String sql = "select * from user where name=? and password=?";
//4,获取 新的传输器
s = c.prepareStatement(sql);
//给SQL设置参数
s.setString(1,a);//给第1个?的位置,设置a的值
s.setString(2,b);//给第2个?的位置,设置b的值
//执行拼接好的 SQL
r = s.executeQuery();
//5,判断是否查到了数据,就直接登录,否则登录失败
if(r.next()){
System.out.println("恭喜您,登录成功~");
}else{
System.out.println("登录失败~");
}
}catch (Exception e) {
e.printStackTrace();
}finally{
//TODO 6,释放资源
close(c,r,s); //调用封装的方法,释放资源
}
}
二,HTML
–1,概述
是超文本标记语言.用来完成一个静态网页.
结构:
由大量的标签组成的.
标签都是成对儿出现的
–2,入门案例
<!DOCTYPE html> <!-- 文档声明 -->
<html> <!-- 根元素,标记这是一个网页文件 -->
<head><!-- 头部分 -->
<meta charset="utf-8"> <!-- 设置了编码 -->
<title>1243</title> <!-- 设置了标题 -->
</head>
<body> <!-- 体部分,指定网页要展示的内容-->
hello
</body>
</html>
–3,练习
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试 常用标签</title>
</head>
<body>
<!-- 1.标题标签:加粗会自动换行 h1大~h6小 -->
<h1>残奥会,极富教育价值的“开学第一课”</h1>
<h2>残奥会,极富教育价值的“开学第一课”</h2>
<h3>残奥会,极富教育价值的“开学第一课”</h3>
<h4>残奥会,极富教育价值的“开学第一课”</h4>
<h5>残奥会,极富教育价值的“开学第一课”</h5>
<h6>残奥会,极富教育价值的“开学第一课”</h6>
<!-- 2.列表标签:有序orderlist列表ol li,无序unorderlist列表ul li -->
<ul>
<li>12345</li>
<li>12345</li>
<li>12345</li>
<li>12345</li>
<li>12345</li>
<li>12345</li>
</ul>
<ol>
<li>12345</li>
<li>12345</li>
<li>12345</li>
<li>12345</li>
<li>12345</li>
<li>12345</li>
</ol>
<!-- 3. 图片标签img
src属性指定图片的位置
height属性指定图片的高度 width指定宽度,单位是像素
-->
<img src="2.jpg" height="500px" width="300px"/>
<!-- 4. 超链接a
href属性用来指定跳转的网址
target属性用来指定打开方式,默认是当前窗口_self,_blank是用新窗口打开
-->
<a href="https://www.baidu.com" target="_blank">点我跳转</a>
<!-- 5. 锚定 a -->
<a name="top">我是顶部</a>
<h2>如何套取富婆的欢心</h2>
<h2>如何套取富婆的欢心</h2>
<h2>如何套取富婆的欢心</h2>
<h2>如何套取富婆的欢心</h2>
<h2>如何套取富婆的欢心</h2>
<h2>如何套取富婆的欢心</h2>
<h2>如何套取富婆的欢心</h2>
<a href="#top">点我,回到顶部</a>
<br /><br /><br /><br /><br /><br /><br />
</body>
</html>
三,Git
–1,概述
是一个开源的分布式的版本控制产品.
可以上传 开源项目 , 上传到Gitee服务器上. 很方便的管理代码, 还可以下载.
上传:
工作空间: 用来保存资源的一个文件夹
本地索引: 给即将上传的资源, 设置索引, 提高传输效率
本地仓库: 是指你自己电脑里 ,的一个文件夹 ,已经存好了要提交的资源
远程仓库: 是指在Gitee的服务里 ,创建一个文件夹 ,保存了 你提交的资源
下载:
只 从 远程仓库 下载 资源 到自己的电脑里
–2,常用命令
add : 从 工作空间把要上传的资源 添加到 本地索引
commit : 从本地索引 提交到 本地仓库
push : 从本地仓库把 资源 推送到 远程仓库
clone/pull : 从远程仓库 下载到 本地
–3,准备环境
1, 安装Git软件,下一步就行了
2, 注册一个Gitee的账号
!!!3, 创建了一个本地仓库(在你自己的磁盘里创建的,存放你想要上传的资源)
!!!4, 创建了一个远程仓库(在Gitee服务器上,创建的)
!!! 5, 执行一些自动生成的Git命令
在本地仓库,执行命令(在本地仓库的路径处,直接输入cmd):
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服务器
#第一次上传文件,需要输入用户名和密码的......