文章目录
- demo实例
- 首先三层架构
- servlet层 也可以叫web层
- service层 ,用于处理业务逻辑
- dao层 用于写sql语句,与数据库进行交互
- 这三层一次调用
- 进行环境初始化
- utils的书写
- jdbcUtils
- 先写web层,需要进行参数校验
- service书写
- dao层使用jdbc进行操作就可以
demo实例
使用三层架构进行查询,当查询到数据后,那么就进行重定向掉main.jsp
如果没有查询到数据就重定向到login.jsp
首先三层架构
servlet层 也可以叫web层
主要用于接收请求与响应数据
service层 ,用于处理业务逻辑
在service层写业务逻辑,这里我们只是进行了查询逻辑
dao层 用于写sql语句,与数据库进行交互
这里只写了登录逻辑,所以只是查询逻辑
这三层一次调用
web -> service -> dao
进行环境初始化
首先要先写配置文件
jdbc.properties
#mysql8驱动
driverClass=com.mysql.cj.jdbc.Driver
#用户名
username=root
#数据库密码
password=123456
#数据库url
url=jdbc:mysql://8.130.111.157:3306/by_demo?characterEncoding=UTF-8
配置好数据库配置后,那么就可以进行jdbcutil的书写
utils的书写
使用jdbcutil 需要配置config需要进行加载properties文件
package com.by.utils;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class Config {private static String username;private static String password;private static String url;private static String driverClass;static {Properties prop = new Properties();try {InputStream in = Config.class.getClassLoader().getResourceAsStream("jdbc.properties");//读取配置文件// InputStream in = new FileInputStream("D:\\Java黑马课程\\北游\\后端\\JavaWeb阶段\\源码\\javaweb\\servlet_pro\\src\\main\\resources\\jdbc.properties");//加载配置文件内容prop.load(in);// acquire the properties from fileusername = prop.getProperty("username");password = prop.getProperty("password");url = prop.getProperty("url");driverClass = prop.getProperty("driverClass");// register the driverif (driverClass != null && url != null && username != null && password != null) {//加载驱动Class.forName(driverClass);}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}/*** @param* @description: 获取连接* @return: java.sql.Connection*/public static Connection getConnection() throws SQLException {Connection con = null;try {con = DriverManager.getConnection(url, username, password);} catch (Exception e) {e.printStackTrace();}return con;}/*** @param con* @param stat* @param res* @description: 释放资源*/public static void close(Connection con, Statement stat, ResultSet res) throws SQLException {if (con != null) {con.close();}if (stat != null) {stat.close();}if (res != null) {res.close();}}
}
这是jdbc的config配置类
可以直接使用
InputStream in = Config.class.getClassLoader().getResourceAsStream("jdbc.properties");
讲一下这个代码
这个是先使用放射获得了 Config的class字节码
因为编译后的properties文件是存在在classses的根目录中
使用了之后就可以使用getClassLoader() 获得类加载器,然后再获取getResourceAsStream(),输入properties文件后,就可以直接获取到inputStream流
然后就可以获取in文件
jdbcUtils
config书写后就可以书写jdbcUtils
package com.by.utils;import java.sql.*;/*** @Description: jdbc封装工具类* @Version: 1.0*/
public class JdbcUtils {private static Connection con = null;private static Statement st = null;private static ResultSet rs = null;private static PreparedStatement ps = null;/*** @param sql sql语句* @param params 传入多参,也可以以数组形式传入* @description: 通用更新封装* @return: java.sql.ResultSet*/public static int update(String sql, Object... params) throws SQLException {int flag = 0;try {con = Config.getConnection();ps = con.prepareStatement(sql);for (int i = 0; i < params.length; i++) {ps.setObject(i + 1, params[i]);}flag = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {Config.close(con, ps, null);}return flag;}/*** @param sql* @param params* @description: 通用查询* @return: java.sql.ResultSet*/public static ResultSet query(String sql, Object... params) throws SQLException {try {con = Config.getConnection();ps = con.prepareStatement(sql);for (int i = 0; i < params.length; i++) {ps.setObject(i + 1, params[i]);}System.out.println(ps.toString());rs = ps.executeQuery();} catch (Exception e) {e.printStackTrace();}return rs;}
}
那么就可以直接使用jdbc进行操作了
先写web层,需要进行参数校验
web层调用service
service直接引入就可以了
package com.by.servlet;import com.by.pojo.User;
import com.by.service.UserService;
import com.by.service.impl.UserServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author healer* @Description LoginServlet* @data 2024-05-31 17:00*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {UserService userService = new UserServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {req.setCharacterEncoding("UTF-8");String username = req.getParameter("username");String password = req.getParameter("password");User user = userService.login(username, password);if (user != null) {
//登陆成功进行跳转resp.sendRedirect("admin.jsp");} else {resp.sendRedirect("login.jsp");}} catch (Exception e) {e.printStackTrace();}}
}
service书写
service直接调用dao层就可以
package com.by.service.impl;import com.by.dao.UserDao;
import com.by.dao.impl.UserDaoImpl;
import com.by.pojo.User;
import com.by.service.UserService;import java.util.function.UnaryOperator;/*** @author healer* @Description UserServiceImpl* @data 2024-05-31 17:01*/
public class UserServiceImpl implements UserService {UserDao userDao = new UserDaoImpl();@Overridepublic User login(String username, String password) throws Exception {return userDao.login(username, password);}
}
dao层使用jdbc进行操作就可以
package com.by.dao.impl;import com.by.dao.UserDao;
import com.by.pojo.User;
import com.by.utils.JdbcUtils;
import com.mysql.cj.jdbc.JdbcConnection;import java.sql.ResultSet;/*** @author healer* @Description UserDaoImpl* @data 2024-05-31 17:03*/
public class UserDaoImpl implements UserDao {@Overridepublic User login(String username, String password) throws Exception {String loginSql = "select * from user where username =? and password =?";ResultSet query = JdbcUtils.query(loginSql, username, password);if (query.next()) {Long id = Long.valueOf(query.getInt("id"));String username1 = query.getString("username");String password1 = query.getString("password");User user = new User(id, username1, password1);return user;}return null;}
}
操作后如果有数据就进行封装到User对象中,
如果查询到了就封装到User ,查询不到就直接返回为空
那么在web层进行判断如果有数据,那么就直接进行重定向到main.jsp
如果没有数据,那么就还是重定向到login.jsp
至此小案例完成了