这里只需要定义接口类就行了,我们暂时还用不到自定义sql语句,所以其他不用写
public interface UserRepository extends JpaRepository<User, Integer> {
}
service(业务层接口)
==============
在service包下新建一个UserService接口类(注意是接口哦!)
定义五个方法(增删改查),其中查询有两个方法,一个是页面加载要显示所有用户信息的,一个是通过搜索框搜索的模糊查询
public interface UserService {
void insertUser(User user);// 添加用户
void deleteUser(Integer uid);// 删除用户
void updateUser(User user);// 修改用户
List<User> selectAllUser();// 查询所有用户
List<User> selectLike(String search);// 模糊查询
}
serviceImpl(业务层实现)
==================
在serviceImpl包下新建一个UserServiceImpl类,实现UserService接口
前面四个基本的增删改查就不多说啦~大伙应该都知道
主要是第五个selectLike(重点!原创)这个方法,大伙可以仔细研究一下我的这个模糊查询设计模式,很有帮助的哦~ 这里不多介绍了,可以自己仔细学一学
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public void insertUser(User user) {
userRepository.save(user);
}
@Override
public void deleteUser(Integer uid) {
userRepository.deleteById(uid);
}
@Override
public void updateUser(User user) {
userRepository.saveAndFlush(user);
}
@Override
public List<User> selectAllUser() {
return userRepository.findAll();
}
/**
* 查询优先级:
* 1.先查询是否为整型,为整型则通过ID主键查询,返回结果,不为整型则模糊查询其他字段
* 2.模糊查询字段,忽略密码的模糊查询,对用户名和昵称进行模糊查询,返回结果
* @param search 查询字段
* @return 查询列表集合
*/
@Override
public List<User> selectLike(String search) {
List<User> list = new ArrayList<>();// 查询列表集合
User user = new User();
user.setUsername(search);
user.setNickname(search);
try {
Integer uid = Integer.parseInt(search);
Optional<User> optional = userRepository.findById(uid);
if (!optional.isPresent()) {
list = selectVague(user);
} else {
list.add(optional.get());
}
}catch (NumberFormatException e) {
// 查询字段不为整型数据,捕获异常
list = selectVague(user);
}
return list;
}
/**
* 模糊查询
* @param user
* @return
*/
private List<User> selectVague(User user) {
List<User> list = null;
ExampleMatcher matcher = ExampleMatcher.matchingAny()
.withMatcher("username", ExampleMatcher.GenericPropertyMatchers.contains())
.withMatcher("nickname", ExampleMatcher.GenericPropertyMatchers.contains())
.withIgnoreCase("uid")
.withIgnoreCase("password");
Example<User> example = Example.of(user, matcher);
list = userRepository.findAll(example);
return list;
}
}
controller(控制层)
===============
基本的一个整体流程已经搭建完毕,最后就是处理controller控制层的逻辑,我们首先完善一下上一篇中的IndexController的代码,让页面加载时候就能显示所有用户的数据、
在controller包下新建一个UserController类,设置改控制类处理所有/user下的请求
@RestController
@RequestMapping(value = “/user”)
public class UserController {
}
页面加载显示数据
IndexController(页面加载显示所有用户)
@RestController
public class IndexController {
@Autowired
private UserService userService;
@RequestMapping(value = "/index") // 访问路径
public ModelAndView toIndex() {
// 返回templates目录下index.html
ModelAndView view = new ModelAndView("index");
// 查询所有的用户,添加到model视图里
view.addObject("user_list", userService.selectAllUser());
return view;
}
}
前端修改
同时修改前端内容,通过th:each遍历user_list,分别获取编号,用户名,昵称,密码,通过th:text标签赋值text(对thymeleaf语法不熟悉的可以先去简单看一下基础语法哦~)
还有HTML顶部不要忘了添加支持thymeleaf语法哦~
运行结果
为了方便查看结果,预先在数据库插入几条数据
回到IDEA项目,点击右上角的debug模式启动项目,打开浏览器输入localhost:8081/index(路径根据自己情况来),就能看到数据已经成功显示上来啦
查询功能模块
Ajax异步请求局部刷新
给搜索按钮和搜索框都设置一个ID,同时给数据显示部分的div设置th:fragment标签,获取后端的代码片段
在index.js中添加代码,向后端发送异步请求
// 查询
$(‘#findBtn’).click(function () {
// 发送GET异步请求
$.ajax({
type: 'GET',
url: '/user/select', // 请求路径
data: {
'search': $('#search').val()
},
success: function (data) {
// 局部刷新数据显示部分的div
$('#userTable').html(data)
},
error: function (err) {
console.log(err)
alert('操作失败,请刷新重新尝试!')
}
})
})
UserController处理查询请求
@RestController
@RequestMapping(value = “/user”)
public class UserController {
// 注入业务层对象
@Autowired
private UserService userService;
@GetMapping(value = "/select")
public ModelAndView selectLike(String search) {
// 返回th:fragment代码片段
ModelAndView view = new ModelAndView("index::userTable");
view.addObject("user_list", userService.selectLike(search));
return view;
}
}
运行结果
重新启动,输入xiao,成功显示
输入数值,优先查询编号
删除功能模块
刚刚的查询功能前端呢我是在index.js里面处理的,接下来删除模块我们换一个方法
首先,删除一条数据,我们是不是通关编号id进行删除呀,所以发送请求的时候是不是要传递编号数据
修改前端
在删除按钮中添加一个th:onclick标签,传递参数为当前行的编号
接着在html底部添加如下代码
function deleteBtn(id) {
// 发送请求
$.ajax({
type: 'POST',
url: '/user/delete',
data: {
'id': 'id' // 编号
},
success: function (data) {
// 局部刷新
$('#userTable').html(data)
},
error: function (err) {
console.log(err)
alert("操作失败,请刷新重新尝试!")
}
})
}
UserController处理删除请求
添加新的方法
@PostMapping(value = “/delete”)
public ModelAndView deleteUser(Integer id) {
// 通过编号删除用户
userService.deleteUser(id);
ModelAndView view = new ModelAndView("index::userTable");
// 返回新的数据列表
view.addObject("user_list", userService.selectAllUser());
return view;
}
运行结果
点击删除第五条数据,成功删除了第五条数据并刷新表格
添加功能模块
JS和Ajax部分
通过JQuery对提交的表单进行一些非空检验,通过之后发出POST异步请求
在index.js添加下面代码
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **
下面有部分截图希望能对大家有所帮助。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
以上Java开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-FhH4F8Ni-1712704596846)]
总结
互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **
下面有部分截图希望能对大家有所帮助。
[外链图片转存中…(img-rBqGg6Bk-1712704596847)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-MgN0hYWz-1712704596847)]