1.JDBC
1.1PreparedStatement
执行SQL语句的对象
- 此对象具有预编译功能的执行SQL语句的对象
- 相关代码:
package cn.tedu;
import javax.swing.plaf.nimbus.State;
import java.sql.*;
import java.util.Scanner;
public class Demo07 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine();
System.out.println("请输入密码");
String password = sc.nextLine();
//获取连接
try (Connection conn = DBUtils.getConn()){
// Statement s = conn.createStatement();
// String sql = "select count(*) from user where username='"
// +username+"' and password='"+password+"'";
// System.out.println(sql);
// ResultSet rs = s.executeQuery(sql);
//创建需要执行的SQL语句 用占位符? 表示变量
String sql = "select count(*) from user where username=? and password=?";
//创建预编译的SQL执行对象, 在执行折行代码时将SQL语句中程序员所写的业务逻辑部分的SQL
//语句编译并锁死现有逻辑
PreparedStatement ps = conn.prepareStatement(sql);
//替换SQL语句中的?内容 1和2 代表的是?的位置,
// 此时将用户输入的内容以值的形式替换到SQL语句里面, 不会更改原有SQL语句的判断逻辑
//从而避免了SQL注入的问题
ps.setString(1,username);
ps.setString(2,password);
//执行SQL语句
ResultSet rs = ps.executeQuery();
//让游标指向第一条数据
rs.next();
//从结果集对象中取出查询到的数量
int count = rs.getInt(1);
if (count>0){
System.out.println("登录成功!");
}else{
System.out.println("用户名或密码错误!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
2.SpringBoot
2.1Web服务软件做了那些事儿?
- 负责搭建底层的网络连接
- 负责根据客户端请求的静态资源路径找到对应的静态资源文件并且响应给客户端
- 负责根据客户端请求的动态资源路径找到对应的Controller里面的方法并执行
2.2SSM三大框架
- Spring框架(第四个阶段开始讲)
- SpringMVC框架(第二个阶段开始接触到第四个阶段讲完)
- Mybatis框架(第三阶段到第四阶段)
2.3SpringBoot框架
- 作用: 创建工程的时候更加便捷的引入其它各种框架,(如果不使用SpringBoot框架创建工程,从一个空工程引入各种框架的话,需要在pom.xml文件中添加大量的依赖,而且框架运行时需要用到的大量配置文件也需要程序员准备,使用了SpringBoot之后只需创建工程时打几个√ 即可引入各种框架)
2.4如何创建SpringBoot工程
- 创建Spring Initalizr工程, 修改创建工程时用到的网址
- 选择工程中引入的框架
- 创建完之后 检查Build里面是否出现的绿色的对钩
- 如果创建工程报错:
- 刷新maven
- 如果未解决, 则检查maven配置是否正确(检查.m2文件夹下是否有settings.xml文件)
- 如果未解决, 删除.m2文件夹下的repository文件夹后 再次刷新maven
- 如果未解决, 重新创建工程
- 如果还未解决 联系项目经理
2.5客户端发出请求的几种方式:
- 在浏览器地址栏中输入请求地址 回车后发出请求
- 在html页面中通过超链接发出请求
- 在html页面中通过form表单发出请求
- 通过前端框架发出异步请求
2.6服务器中获取参数的几种方式
- 通过request对象获取
- 在参数列表中直接声明的方式接收参数
- 在参数列表出直接声明自定义的对象, 把接收到的参数直接封装到对象里面,这种写法是SpringMVC框架中提供的功能, SpringMVC框架如果发现声明的是一个自定对象类型的变量会将其调用无参的构造方法进行实例化,实例化完之后调用set方法把接收到的参数封装到对象里面.
2.7工程中使用数据库需要以下步骤:
- 1.pom.xml文件中添加两个依赖 MySQL和连接池 添加完之后需要刷新maven
<!-- 连接MySQL数据库的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
- 把DBUtils.java工具类 从之前工程中复制到新工程
2.8注册功能步骤:
- 在首页index.html页面中添加两个超链接 访问/reg.html 和 /login.html
- 创建reg.html页面, 页面中添加form表单提交地址为/reg
- 创建UserController添加reg方法处理/reg请求, 创建了User实体类用来封装用户传递过来的信息, 在reg方法的参数列表处声明User对象, 在方法中输出传递过来的user对象, 如果输出的数据没有问题则在方法中通过今天上午JDBC相关注册代码把User对象里面的数据保存到user表中
2.8.1创建User对象
package cn.tedu.boot1.entity;
public class User {
private String username;
private String password;
private String nick;
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", nick='" + nick + '\'' +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
}
2.8.2创建reg.html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册页面</h1>
<form action="/reg">
<input type="text" name="username" placeholder="用户名">
<input type="text" name="password" placeholder="密码">
<input type="text" name="nick" placeholder="昵称">
<input type="submit" value="注册">
</form>
</body>
</html>
2.8.3创建JDBC连接池
package cn.tedu.boot1.utils;
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class DBUtils {
private static DruidDataSource dds;
static {
//创建连接池对象
dds = new DruidDataSource();
//设置连接数据库的信息
dds.setUsername("root");
dds.setPassword("root");
dds.setUrl("jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false");
//设置初始连接数量 和 最大连接数量
dds.setInitialSize(3);
dds.setMaxActive(5);
}
public static Connection getConn() throws SQLException {
//从连接池中获取连接 异常抛出
Connection conn = dds.getConnection();
System.out.println("连接对象:"+conn);
return conn;
}
}
2.8.4业务逻辑
package cn.tedu.boot1.controller;
import cn.tedu.boot1.entity.User;
import cn.tedu.boot1.utils.DBUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@Controller
public class UserController {
@RequestMapping("/reg")
@ResponseBody
public String reg(User user){
//soutp
System.out.println("user = " + user);
//获取数据库链接
try (Connection conn = DBUtils.getConn()){
String sql = "insert into user values(null,?,?,?)";
//创建执行SQL语句的对象
PreparedStatement ps = conn.prepareStatement(sql);
//替换掉?
ps.setString(1,user.getUsername());
ps.setString(2,user.getPassword());
ps.setString(3,user.getNick());
ps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return "注册成功!";
}
}
2.9登录功能步骤:
- 创建login.html页面, 在页面中添加form表单 提交地址为/login
- 在UserController中添加login方法处理/login请求, 方法的参数列表中声明User对象用来接收传递过来的用户名和密码, 方法中控制台输出接收到的user对象信息, 如果输出的数据没有问题 则在方法中通过今天上午Demo08中相关的JDBC代码 实现登录功能
2.9.1创建login.html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<form action="/login">
<input type="text" name="username" placeholder="用户名">
<input type="password" name="password" placeholder="密码">
<input type="submit" value="登录">
</form>
</body>
</html>
2.9.2业务逻辑
package cn.tedu.boot1.controller;
import cn.tedu.boot1.entity.User;
import cn.tedu.boot1.utils.DBUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@Controller
public class UserController {
@RequestMapping("/login")
@ResponseBody
public String login(User user){
System.out.println("user = " + user);
try (Connection conn = DBUtils.getConn()){
String sql = "select password from user where username=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,user.getUsername());
ResultSet rs = ps.executeQuery();
if (rs.next()){
//拿用户输入的密码和数据库中查询到的密码比较
if (user.getPassword().equals(rs.getString(1))){
return "登录成功!";
}
return "密码错误!";
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return "用户名不存在!";
}
}
3.常见错误列表:
- 404
- 访问静态资源文件时:
- 检查浏览器中请求的路径是否正确
- 检查文件名是否正确
- 检查文件位置是否正确
- 如果以上全部正确仍然404 需要重新编译工程(Build->ReBuild)
- 访问动态资源时:
- 检查请求的路径是否正确
- 检查Controller里面RequestMapping注解里面的处理路径是否正确
- 检查controller包的位置是否在工程自带的包里面
- 检查@Controller注解是否添加
- 如果以上全部正确仍然404 需要重新编译工程(Build->ReBuild)
- 400错误码 : 客户端给服务器传递参数时参数类型转换错误
3.1第三阶段必备技能:
- 清除浏览器缓存并刷新 Shift+f5
- 重新编译工程Build->ReBuild
- 刷新maven
- 删除.m2文件夹下的repository文件夹 并刷新maven (.m2文件夹在用户文件夹的里面)