第三周的实习内容是学习一个真实项目中的登录认证与分页查询的操作方法,学习别人使用的代码框架与编写代码方式,并与自己写的用户管理系统做个对比。

首先是了解如何拆解一个项目把它变成许多不同的模块,方便逐个学习。在项目的前端首页一般就会有项目的功能菜单,选择想要学习的模块,选择子菜单,一直选到底,从最小的功能开始拆解项目。选择后在当前页面调出控制台,查看当前界面的一些 request URL,然后返回项目代码,在控制层找到所对应的URL,从该控制层作为入口开始学习其引用的哪些服务层代码以及如何操作的数据库。 例如学习最开始用户登录功能,登录后打开控制台发现URL是以/login结尾,找到URL为/login的控制层代码,学习如何引用的服务层方法和业务逻辑如何实现的。

对比自己的和项目登录模块发现该项目中并没有使用Mybatis框架而是使用的JPA框架。JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范,其最大的功能是简化现有的持久层开发工作,可使开发者用极简的代码即可实现对数据的访问和操作。具体体现为持久层不在需要写sql语句,只需要继承JpaRepository<实体, id>接口即可拥有常用的数据库操作:增删查改。如果需要的方法JPA接口里没有,可以直接加在持久层的接口里,例如用用户名查寻用户信息。在服务层可以直接把持久层的接口里的增删查改基本功能给点出来。

public interface JpaUserRepository extends JpaRepository<User, Long> , JpaSpecificationExecutor<User> {User getUserByName(String name);
}

在学习使用JPA的时候发现查询数据库的时候有些字段没有获取到,都是使用了驼峰命名的多个单词组成的字段。在数据库里查看发现对于驼峰命名的多个单词组成的字段连接方式是以"_"连接。比如,在实体里面的字段是userName,数据库中的字段也是userName,但是自动生成的sql语句中的字段是user_name,对应不上,所以找不到。解决办法是在配置文件application.properties中添加如下配置:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

然后在对应的实体字段添加@Column注解,注解中添加name="数据库中的字段"。默认遇到大写字母改成下划线的配置是这种:

spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

此外,又延伸学习了使用监听器功能,在开启springboot时初始化一条管理员用户信息。监听器能帮助开发者监听特定的事件,可以在某些动作前后增加处理,实现监控等等。具体实现方法为创建一个配置类(@Configruation),然后创建一个bean方法(@Bean),类名为ApplicationListener<>,括号里加入的是事件类型,具体的类型有如下几个:

  1. ApplicationStartingEvent
  2. ApplicationEnvironmentPreparedEvent
  3. ApplicationContextInitializedEvent
  4. ApplicationReadyEvent
  5. ApplicationFailedEvent

这里我使用的是ApplicationReadyEvent,返回值是一个lambda表达式event ->{},括号里为初始化管理员信息的方法。实例代码如下:

@Beanpublic ApplicationListener<ApplicationReadyEvent> initListener(JpaUserRepository jpaUserRepository){return event -> {createAdmin(jpaUserRepository);};}private void createAdmin(JpaUserRepository jpaUserRepository){业务逻辑}

有了前面的内容做基础,对于登录认证就比较方便了。这里使用的框架为Sa-Token,是一个轻量级 Java 权限认证框架。相对于shiro这些传统老牌框架,Sa-Token 的 API 设计简单,业务明确。在登录业务中,通过登录页面传入的账号密码与数据库的做比较,并调用StpUtil.login(id)即可实现登录操作。一般来说返回给前端的数据应该是一个token,可以调用StpUtil.getTokenInfo()方法返回当前会话的Token参数。该方法会返回一个对象,关键属性为tokenValue,即为token的值。默认的token生成方法为uuid格式,可以在yaml配置文件里设置sa-token.token-style=风格类型即可。对于权限认证功能,自定义一个类通过实现StpInterface接口,重写getPermissionList和getRoleList方法,传入用户id和权限、集合,授予用户角色和权限。接着就可以通过调用StpUtil.hasPermission(“权限”)和StpUtil.hasRole(“角色”)方法来鉴权。

对于分页查询功能,有两个重要的参数当前查询页数和每页显示条数。首先需要让持久层实现接口JpaSpecificationExecutor<实体>,实现该接口可以调用方法findAll(Pageable)。如果仅仅实现基础分页功能不传入查找条件的话,则可以直接用spring自带的PageRequest类,里面有个方法PageRequest.of(index, pageSize)将查询页数与显示条数传入,然后调用方法findAll(Pageable)就能实现分页查询功能。如果是满足需要传入查询条件的情况,则需要用到Specification<实体>接口,该接口返回一个lambda表达式,里面有三个参数分别为root即为跟对象(实体)、query代表一个顶层查询对象,用来自定义查询,和CriteriaBuilder用来构建查询。判断是否有传入判断的参数,有的话则加在specification里,最后调用findAll(specification,Pageable)两个参数实现查询分页功能。构造查询条件代码如下:

Specification<User> specification = (root, query, cb) ->{List<Predicate> list = new ArrayList<>();if (StringUtils.hasText(name)) {list.add(cb.equal(root.get("name"), name));}if (StringUtils.hasText(nickName)) {list.add(cb.equal(root.get("nickName"), nickName));}return cb.and(list.toArray(new Predicate[0]));};

用postman测试接口结果如下,成功只查询到名字为lys的用户:

总结一下,这周学习到的内容不少,主要学习并对比了企业项目是如何对这些基本业务需求进行代码编写的,以及使用的框架区别,例如安全框架shiro与sa-token和mybatis与JPA框架。然后初识了监听器,了解了如何在某个时间节点让spring帮忙做些事情,例如初始化管理员信息。在接下来的一周里,继续学习项目中的其他业务功能。

java实习第三周总结相关推荐

  1. 2017-2018-1 JAVA实验站 第三周作业

    2017-2018-1 JAVA实验站 第三周作业 团队展示 队名 JAVA实验站 拟作的团队项目描述 (2048)增加其他模式,使得2048更加丰富多彩 团队的首次合照 团队的特色描述 团队内部很团 ...

  2. 2017-2018-1 Java演绎法 第三周 作业

    团队任务:团队展示与选题 团队展示 队员学号及姓名 学号 姓名 主要负责工作 20162315 马军 日常统计,项目部分代码 20162316 刘诚昊 项目部分代码,代码质量测试 20162317 袁 ...

  3. Java学习---第三周周报

    第三周周报 收获 1.正则表达式的进阶应用-计算器 通过再次对正则表达式的学习,记住了各个符号的应用,通过下题的展示,得到了一种思路,可以用于设计计算器,在计算器的设计中,让用户输入一连串的数字包括运 ...

  4. 科大讯飞总裁办实习第三周

    5.7号周一上班收到的第一个消息:带我流程的瑞哥请假三天.经理在群里说这块找张杰确认,突然就一个重担砸到我的身上了.之前一直站在瑞哥的身后,需求来自于瑞哥直接吩咐,现在直接需求来源于项目推进.总共有1 ...

  5. 实习第三周小记-----生活在于经历

    努力就是为了更好的活着.当自己写这篇文章的时候,我已经下定决心要辞职了.因为我发现现在的环境并不适合我自身的需要. 这几天自己接受的信息量确实有点大,不仅是公司的还有其它一些社会因素在里面.因为自己上 ...

  6. java基础——第三周总结

    这一周由于事务较多,因此我的进度较慢(其实还是效率不高,c和java一起学还是有点头大),学到了多态,下周争取把异常学完. 多态案例 需求: 使用面向对象编程模拟:设计一个电脑对象,可以安装2个USB ...

  7. Java俱乐部第三周练习题

    021. 亲和数 令 d(n)表示自然数 n 所有真因子(除开数 n 身的所有因子)的和,如果 d(a)=b 且 d(b)=a,其 中 a≠b,那么 a 与 b 便为亲和数对,其中的每个数称为亲和数. ...

  8. 学习Java的第三周

    文章目录 前言 正则表达式 1.概述 2.使用正则表达式的目的 3.正则表达式中的符号 4.创建匹配器Matcher类 5.Matcher类方法 异常处理 1.异常的概述 1.异常的继承体系 2.常见 ...

  9. QA实习第三周个人感受

    发现在上班的大部分时间效率都很低,总结一下原因有几个: 1.会议太多,除了正常做事,就是开会了,而且经常做事情做到一半就被叫开会,开会的时候废话太多,目标不明确,只是单纯的磨时间,时间没到继续说废话, ...

  10. JAVA训练营第三周和第四周学习总结

    这两周我学习了数组.方法.类和对象. 难度在以肉眼可见的速度递增,学习的脚步越来越慢.这对我来说还好,就是还想多多的实战一下. 参加这个训练营已经整整一个月,我切身体会到孔子说的那句话:逝者如斯夫,不 ...

最新文章

  1. Documentum常见问题2—压力测试时一旦用户数超过一定数量就不能登录了
  2. 设计模式之装饰模式的学习
  3. 电脑连接到网络显示未连接到服务器未响应,电脑dns服务器未响应怎么办?
  4. Spring全家桶中的日志框架
  5. 设置XenServer中的Linux vm从光驱启动
  6. Windows 11 dapr 环境安装
  7. 中国大学MOOC-陈越、何钦铭-数据结构-2019春期末考试(题目+部分解答)
  8. vue做混合式app_Vue+原生App混合开发手记#1
  9. android webview 长按复制,Android webview 点击或长按有蒙层 – 热爱改变生活
  10. 特别引人注目的头像_设计样式指南:构建引人注目的产品的要素
  11. 小白必看!JS中循环语句大集合
  12. 为什么要使用计算机协议,为什么需要网络协议
  13. clob oracle 连接_Oracle clob 操作
  14. MySQL知识点查阅
  15. [1077]ZooKeeper下载安装(Windows版本)
  16. iOS----------Apple id如何关闭双重认证?
  17. Win10/11 移动C:\Users 目录
  18. 15年30亿设备,安卓如何从0到最大的操作系统?
  19. linux查找文件中的字符串
  20. gethostbyname和gethostbyaddr

热门文章

  1. 流媒体管理服务器显示不可用,部署国标流媒体服务器成功后无法播放视频问题步骤排查...
  2. flashfxp链接不上,flashfxp链接不上是因为什么
  3. 利用cookies登录QQ空间
  4. 8个顶级云安全解决方案
  5. 计量经济学计算机实验报告,计量经济学实验报告.doc
  6. 没有光驱照样安装Win7!U盘装系统教程
  7. linux驱动无线网卡数据发送,基于Linux的无线网卡驱动程序
  8. 分享灵动微MM32F3270微控制器的音频类产品参考方案
  9. wps怎么免费导出简历_简历模板Word文档 免费下载简历模板
  10. 计算机控制面板设置命令,进入开始---设置--控制面板--声音和音频设备命令