注意:数据的查询操作是通过调用封装在UserServiceImpl类中的login方法来实现的,而其中的login方法是根据封装在UserDaoImpl类中的findUserByUsernameAndPassword方法来实现的。
login:
//验证登录信息
@Override
public User login(User user) {
return dao.findUserByUsernameAndPassword(user.getUsername(), user.getPassword());
}
findUserByUsernameAndPassword:
//根据用户名和密码查询User对象
@Override
public User findUserByUsernameAndPassword(String username, String password) {
try {
String sql = "select * from user where username = ? and password = ?";
User user = template.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), username, password);
return user;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
实现效果:
2. 分页查询、模糊查询
**设计思路:**创建一个分页的实体类对象 PageBean,主页跳转到 FindUserByPageServlet 中进行查询。
PageBean属性:
//总记录数
private int totalCount;
//总页码
private int totalPage;
//每页的数据
private List<T> list;
//当前页码
private int currentPage;
//每页显示的记录数
private int rows;
FindUserByPageServlet:
//查询
@WebServlet(“/findUserByPageServlet”)
public class FindUserByPageServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
//当前页码
String currentPage = request.getParameter("currentPage");
//每页显示条数
String rows = request.getParameter("rows");
//判断当前页码、每页显示的条数
if (currentPage == null || "".equals(currentPage)) {
currentPage = "1";
}
if (rows == null || "".equals(rows)) {
rows = "5";
}
//获取条件查询参数
Map<String, String[]> condition = request.getParameterMap();
//调用service查询
UserService service = new UserServiceImpl();
PageBean<User> pb = service.findUserByPage(currentPage, rows, condition);
//将PageBean存入request
request.setAttribute("pb", pb);
//将查询条件存入request
request.setAttribute("condition", condition);
//转发到list.jsp
request.getRequestDispatcher("/list.jsp").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
注意:数据的查询是通过调用封装在UserServiceImpl类中的findUserByPage****方法实现的,然而具体的数据库操作是根据封装在UserDaoImpl类中的 findTotalCount 和 findByPage 方法 来实现的。
findTotalCount:
//查询总记录条数
@Override
public int findTotalCount(Map<String, String[]> condition) {
//定义模板初始化sql
String sql = "select count(*) from user where 1 =1 ";
StringBuilder sb = new StringBuilder(sql);
//遍历map
Set<String> keySet = condition.keySet();
//定义参数集合
List<Object> params = new ArrayList<>();
for (String key : keySet) {
//排除分页条件参数
if ("currentPage".equals(key) || "rows".equals(key)) {
continue;
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if (value != null && !"".equals(value)) {
//有值
sb.append(" and " + key + " like ? ");
//?条件的值
params.add("%" + value + "%");
}
}
return template.queryForObject(sb.toString(), Integer.class, params.toArray());
}
findByPage:
//在数据库中查询数据,获取一个User的对象集合
@Override
public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
String sql = "select * from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
//遍历map
Set<String> keySet = condition.keySet();
//定义参数集合
List<Object> params = new ArrayList<>();
for (String key : keySet) {
//排除分页条件参数
if ("currentPage".equals(key) || "rows".equals(key)) {
continue;
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if (value != null && !"".equals(value)) {
//有值
sb.append(" and " + key + " like ? ");
//?条件的值
params.add("%" + value + "%");
}
}
if (start < 0)
start = 0;
//添加分页查询
sb.append(" limit ?,? ");
//添加分页查询参数值
params.add(start);
params.add(rows);
return template.query(sb.toString(), new BeanPropertyRowMapper<>(User.class), params.toArray());
}
findUserByPage:
//处理查询
@Override
public PageBean<User> findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {
//类型转换
int currentPage = Integer.parseInt(_currentPage);
int rows = Integer.parseInt(_rows);
//第一页时,不能点击上一页
if (currentPage <= 0)
currentPage = 1;
//创建PageBean对象
PageBean<User> pb = new PageBean<>();
//调用dao查询总记录数
int totalCount = dao.findTotalCount(condition);
pb.setTotalCount(totalCount);
//计算总页码
int totalPage = (totalCount % rows) == 0 ? totalCount / rows : totalCount / rows + 1;
pb.setTotalPage(totalPage);
//最后一页时,不能点击下一页
if (currentPage >= totalPage)
currentPage = totalPage;
//设置参数
pb.setCurrentPage(currentPage);
pb.setRows(rows);
//调用dao查询list集合
//计算开始记录索引
int start = (currentPage - 1) * rows;
List<User> list = dao.findByPage(start, rows, condition);
pb.setList(list);
return pb;
}
实现效果:
3. 增、删、改操作
设计思路:管理员选择对应的功能操作后,JSP页面的数据就会提交到对应的 Servlet 中进行处理,通过调用业务逻辑层中的方法,业务逻辑层再调用数据库操作层中的方法,从而实现用户信息的增、删、改。
实现效果:
总结
–
本项目综合性很强,涉及到的知识点比较多,盲目的敲代码是不理智的,明确项目的设计思路十分重要。本次介绍只展示出了几个比较重要功能的部分代码,其他部分就不详细介绍了。博主认为最难的点就在于数据的交互,前端到后端,后端到前端,前端到前端,后端到后端,使用的数据传递方式不尽相同,要明确是哪一种数据传递场景,这样就很好解决了。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
总的来说,面试是有套路的,一面基础,二面架构,三面个人。
最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
总的来说,面试是有套路的,一面基础,二面架构,三面个人。
最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友
[外链图片转存中…(img-a643UH9A-1713118320568)]
[外链图片转存中…(img-Vw2x7up1-1713118320569)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!