java实习第三周总结

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

        首先是了解如何拆解一个项目把它变成许多不同的模块,方便逐个学习。在项目的前端首页一般就会有项目的功能菜单,选择想要学习的模块,选择子菜单,一直选到底,从最小的功能开始拆解项目。选择后在当前页面调出控制台,查看当前界面的一些 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 ->{},括号里为初始化管理员信息的方法。实例代码如下:

@Bean
    public 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帮忙做些事情,例如初始化管理员信息。在接下来的一周里,继续学习项目中的其他业务功能。

        

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值