首先,在测试queryStudent()方法的 过程中,我发现前端ajax中data的信息一直是为null值。返回数据SerciceImpl类中,排查发现,我的查询方法并没有写返回值,所以导致,我输入姓名,只返回小明,但是小明的其他信息,一直查询不到。
StudentServiceImpl类
/**
* @Description //查询学生信息
* @date 2024/4/6
* @param student
* @return List<StudentDto>
*/
@Override
public List<StudentDto> queryStudent(StudentDto student) {
List<StudentDto> lists = new ArrayList<StudentDto>();
try {
lists = studentDao.queryStudent(student);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
AJAX返回一直失败
需要一个标准的JSON字符串格式化,才能进行正常的显示,不然ajax会一直进入error
writer.write(JSONObject.toJSONString(resultSet));
StudentController方法
package com.xk.controller;
import com.alibaba.fastjson.JSONObject;
import com.xk.common.ResultSet;
import com.xk.dto.StudentDto;
import com.xk.service.IStudentSerivce;
import com.xk.service.impl.StudentServiceImpl;
import com.xk.util.InvokeUtil;
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;
import java.io.PrintWriter;
import java.util.List;
/**
* @create:2024-04-02 18:35
* @Author: IHG
* @Touser: Be happy every day!
* ---------------------------------------
* @note:
*/
@WebServlet("/student")
public class StudentController extends HttpServlet {
IStudentSerivce studentSerivce = new StudentServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InvokeUtil.getMethod(req, resp, StudentController.class);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InvokeUtil.getMethod(req, resp, StudentController.class);
}
/**
* @Description //通过此方法进行跳转页面
* @date 2024/4/6
* @param req
* @param resp
*/
public void toIndex(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/view/index.jsp").forward(req, resp);
}
/**
* @Description //查询学生信息
* @date 2024/4/6
* @param req 请求对象,包含客户端发送的请求信息
* @param resp 响应对象,用于向客户端发送响应信息
*/
public void queryStudent(HttpServletRequest req, HttpServletResponse resp){
// 从请求中获取age和name
String name = req.getParameter("name");
Integer age = null;
if (req.getParameter("age") != null && !"".equals(req.getParameter("age"))) {
age = Integer.parseInt(req.getParameter("age"));
}
// 创建学生数据传输对象,并设置姓名和年龄属性
StudentDto student = new StudentDto();
student.setName(name);
student.setAge(age);
// 调用学生服务的查询方法,获取查询结果
List<StudentDto> list = studentSerivce.queryStudent(student);
ResultSet<List<StudentDto>> resultSet = new ResultSet<List<StudentDto>>("200", "查询成功", list);
PrintWriter writer = null;
try {
// 设置响应内容的字符编码和类型
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
// 禁用缓存,确保及时更新响应内容
resp.setHeader("Cache-Control", "no-cache");
// 获取响应对象的输出流
writer = resp.getWriter();
// 将返回结果对象转换为 JSON 字符串,并写入响应体
writer.write(JSONObject.toJSONString(resultSet));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null) {
writer.flush();
writer.close(); // 关闭输出流
}
}
}
}
IStudentSerivce
package com.xk.service;
import com.xk.dto.StudentDto;import java.util.List;
/**
* @note: 学生,业务层接口
*/
public interface IStudentSerivce {
//查询学生信息
public List<StudentDto> queryStudent(StudentDto student);
}
StudentServiceImpl
package com.xk.service.impl;
import com.xk.dao.StudentDao;
import com.xk.dao.impl.StudentDaoImpl;
import com.xk.dto.StudentDto;
import com.xk.service.IStudentSerivce;
import java.util.ArrayList;
import java.util.List;
public class StudentServiceImpl implements IStudentSerivce {
StudentDao studentDao = new StudentDaoImpl();
/**
* @Description //查询学生信息
* @date 2024/4/6
* @param student
* @return List<StudentDto>
*/
@Override
public List<StudentDto> queryStudent(StudentDto student) {
List<StudentDto> lists = new ArrayList<StudentDto>();
try {
lists = studentDao.queryStudent(student);
} catch (Exception e) {
e.printStackTrace();
}
return lists;
}
}
StudentDao
public List<StudentDto> queryStudent(StudentDto student);
StudentDaoImpl
public class StudentDaoImpl implements StudentDao {
/**
* @Description //查询学生信息。 采用 Statement 静态sql语句。会导致 sql 注入风险
* @date 2024/4/2
* @param student
* @return List<StudentDto> 改造成使用 List集合方式
*/
public List<StudentDto> queryStudent(StudentDto student){
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
List<StudentDto> lists = new ArrayList<>();
try {
// 获取数据库连接
connection = JdbcUtils.getDateSource();
// 构建 SQL 查询字符串
StringBuilder sql = new StringBuilder("select * from xk_student where 1=1");
if (student.getAge() != null) {
sql.append(" and age = " + student.getAge());
}
if (student.getName() != null) {
sql.append(" and name like '%" + student.getName() + "%'");
}
statement = connection.prepareStatement(sql.toString());
// 执行查询操作
resultSet = statement.executeQuery();
// 遍历查询结果集,创建 StudentDto 对象并添加到列表中
while (resultSet.next()) {
StudentDto result = new StudentDto(
resultSet.getInt("id"), resultSet.getString("student_code"),
resultSet.getString("name"), resultSet.getInt("age"),
resultSet.getInt("sex"), resultSet.getString("address"),
resultSet.getString("phone"), resultSet.getString("email"),
resultSet.getInt("school_id"));
lists.add(result);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
JdbcUtils.closeSource(connection, statement, resultSet);
} catch (Exception e) {
e.printStackTrace();
}
}
return lists;// 返回查询到的学生信息列表
}
}
前端jsp页面
<%--
Created by IntelliJ IDEA.
User: IHG
Date: 2024/3/21
Time: 16:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<meta charset="UTF-8">
<title>学生信息</title>
</head>
<body>
<%-- 通过ajax提交 --%>
姓名:<input type="text" id="name" name="name" value="" placeholder="请输入姓名"/><br/>
年龄:<input type="number" id="age" name="age" value="" placeholder="请输入年龄"/><br/>
<button id="search">查询</button>
<table>
<tr>
<td>学号</td>
<td>姓名</td>
<td>地址</td>
<td>年龄</td>
<td>性别</td>
</tr>
</table>
</body>
<%-- 通过方法去跳转页面,src这样子写--%>
<script src="../../lib/jquery.js"></script>
<script src="../../static/js/index.js"></script>
</html>
js内容
ajax内容
// 查询按钮的点击事件处理函数
$("#search").click(function(){
// 获取输入框中的姓名和年龄信息
var name = $("#name").val();
var age = $("#age").val();
// 发起 AJAX 请求
$.ajax({
url : "/student", // 请求的 URL
type : "post", // 请求类型为 POST
data : { // 请求参数
name : name, // 学生姓名
age : age, // 学生年龄
method : "queryStudent" // 方法名,用于后端路由选择处理方法
},
dataType : "json", // 返回数据的类型为 JSON
async : false, // 是否异步,默认为 true,此处设置为 false,表示同步请求
// 请求成功的回调函数
success : function(data){
if (data.code == "200") {
alert(data.message);// 弹出返回消息
console.log(data.data);// 在控制台打印返回的数据
} else {
// 如果返回的状态码不是 200,弹出返回消息
alert(data.message);
}
},
// 请求失败的回调函数
error : function(data){
// debugger;
alert("查询失败");// 弹出查询失败的提示
}
})
})
mybatis
今天,帮别人查看mybatis项目的时候,发现一个问题。报错显示
Unknown database 'school_myabatis'
我查看jdbc里面数据库名称与密码是否与数据库相同。检查发现数据中确实存在这个名称。接下来排查出是因为他使用的是mysql8.30版本,版本过高且jdbc的url内容是5.0版本的内容。所以导致连接不上数据库