目录
一、建库建表



二、创建web项目并创建包结构




三、User实体类
对应user数据表,编写实体类,提供getter/setter方法,重写toString方法(生成即可)



四、JDBCUtil工具类
在com.tianshi.util包中创建JDBCutil工具类,简化JDBC开发过程

封装获取数据库连接方法如下:
java
package com.tianshi.util;
import java.sql.*;
/*
开发步骤:
* 1.私有化构造方法,防止实例化
* 2.提供公共的静态方法,可以通过类名直接调用
*
* 工具方法有两个:
* 1.获取数据库连接对象:getConnection()
* 2.释放资源:close()
*/
public class JDBCUtil {
private JDBCUtil() {}//私有化构造方法,防止实例化
//获取数据库连接对象
public static Connection getConnection() {
//外置生命Connection对象
Connection conn = null;
try{
Class.forName("com.mysql.cj.jdbc.Driver");//加载数据库驱动
//指定连接数据库的url 用户名 密码
String url = "jdbc:mysql://127.0.0.1:3306/bank3?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";//获取连接对象赋值给conn
conn = DriverManager.getConnection(url, user, password);
}catch(Exception e){
e.printStackTrace();
}
return conn;
}
//释放资源
public static void close(ResultSet rs, PreparedStatement ps, Connection conn){
try {
if (ps != null) ps.close();
if (rs != null) rs.close();
if (conn != null) conn.close();
}catch (SQLException e){
e.printStackTrace();
}finally {
rs = null;
ps = null;
conn = null;
}
}
}
五、测试
java
package com.tianshi.test;
import com.tianshi.util.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
* 测试JDBCUtil类是否正常
* 业务需求:查询id为1的用户信息
*/
public class testJDBCUtil {
public static void main(String[] args) {
//声明对象
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
//1.获取数据库连接
conn = JDBCUtil.getConnection();
//2.传输sql语句
ps = conn.prepareStatement("SELECT * from User WHERE ID = ?");
ps.setInt(1,1);//因为id是int类型,所以调用setInt方法
//3.执行sql语句
rs = ps.executeQuery();
//4.处理结果集
while(rs.next()){
//获取当前便利的数据
int id = rs.getInt("id");
String name = rs.getString("username");
String password = rs.getString("password");
System.out.println(id+","+name+","+password);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
//5.释放资源
JDBCUtil.close(rs,ps,conn);
}
}
}

++注意jar包版本与Mysql的对应关系,版本不同连接方法有区别,低版本这样写:++
Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
//指定连接数据库的url 用户名 密码
String url = "jdbc:mysql://127.0.0.1:3306/bank3?useUnicode=true&characterEncoding=utf-8&useSSL=false";
实例:基于Servlet技术实现银行管理系统
用户注册功能实现
- 在项目web目录下创建regist.jsp注册页面,编写表单,要求包含注册信息(用户名、密码、确认密码、注册按钮)
- 在src目录下创建com.tianshi.web包
- 在com.tianshi.web包下创建RegistServlet类,映射请求路径为/regist,实现注册功能
-
获取注册表单请求参数;
-
校验参数非空,如参数为空则直接响应"注册数据不能为空!"提示信息;
-
校验两次密码是否一致,如不一致则直接响应"两次密码不一致!"提示信息;
-
参数校验通过,则编写JDBC代码实现用户注册数据插入mysql数据库;
-
注册成功后,请求重定向到登录页面
撰写表单


撰写业务逻辑

trim()会移除字符串两端的空格,进行校验时使用
java
package com.tianshi.servlet;
import com.tianshi.service.UserService;
import com.tianshi.service.UserServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/regist")
public class RegistServlet extends HttpServlet {
//创建service对象
private UserService service = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// GET请求跳转到注册页面
resp.sendRedirect(req.getContextPath() + "/regist.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 0、设置请求、响应的编码-防止中文乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
// 1、获取注册表单请求参数
String username = req.getParameter("username");
String password = req.getParameter("password1");
String password2 = req.getParameter("password2");
System.out.println("请求参数:"+username+","+password+","+password2);
// 2、参数校验
if(username==null||username.trim().equals("")||password==null||password.trim().equals("")||password2==null||password2.trim().equals("")){
resp.getWriter().write("不能为空");
return;
}
if(!password.equals(password2)){
resp.getWriter().write("两次密码不一致");
return;
}
//3、
boolean flag = service.regist(username,password);
if(flag){
//4、数据保存成功,则创建成功--重定向
resp.sendRedirect(req.getContextPath()+"/login.jsp");
}else{
resp.getWriter().write("注册失败!");
}
}
}
业务逻辑校验通过第四部分撰写
++注意:搞清楚业务逻辑的主线,抓住主干对分支进行完善,而不是先写服务端自主定义的函数++
服务端
一般来说先,根据面现象对象编程的思想,先写接口,不关心具体怎么实现,但是编译器可以自动生成,所以依次建立两个文件在service包下即可,使用接口后点击让编译器自动在UserService中生成方法,本质是多态,和下面的同步创建



dao包
dao包中封装了对数据储存系统的访问操作,用于隔离数据的变化,因此数据在数据库的插入操作要在这里实现,和上面的同步创建



效果


++成功跳转到下一个逻辑,不成功如下++

用户登录功能实现
- 在项目web包下创建login.jsp页面,编写表单,包含用户信息(用户名、密码、登录按钮)
- 在com.tianshi.web包下创建LoginServlet类,映射请求路径为/login,实现登录功能
- 获取登录表单请求参数;
- 校验参数非空,如参数为空则直接响应"登录用户信息不能为空!"提示信息;
- 参数校验通过,则编写JDBC代码实现根据用户名和密码查询用户信息;
- 如步骤(3)未查询到数据,则说明用户信息不正确,通过请求转发到login.jsp登录页面;
- 如步骤(3)查询到数据,则说明用户信息正确,通过请求重定向到index.jsp系统首页。
撰写表单

撰写业务逻辑

服务端


dao包


效果

++成功跳转到下一个逻辑,不成功重定向到登录页面++
查询所有用户功能实现
在项目web目录下index.jsp首页添加超链接按钮,点击按钮后向/showUsers发起请求
在com.tianshi.service包下创建ShowUsersServlet类,实现查询所有用户信息功能,要求将所有用户信息显示到浏览器网页中。
- 编写JDBC代码实现查询所有用户信息
- 遍历结果集,获取用户信息
- 将用户信息显示到浏览器网页中
撰写表单

撰写业务逻辑


服务端


dao包



