版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
个人博客系统项目5目录01日志打印02自增ID和UUID03跨表显示数据04多表查询05事务回滚06用户、角色和权限5.1JavaWeb应用开发项目教程(SpringBoot+Mybatis)日志打印1.记录用户登录日志,方便分析用户是正常登录还是恶意破解用户;2.记录系统的操作日志,方便数据恢复和定位操作人;3.记录程序的执行时间,方便为以后优化程序提供数据支持。任务5.1
日志打印-日志作用SLF4J将日志分为TRACE、DEBUG、INFO、WARN、ERROR五个级别,每个级别对应记录不同的日志,适用于不同的使用场景。1.TRACE:最低级别的日志记录,用于追踪程序的详细执行路径和调试信息。2.DEBUG:用于记录调试信息,例如变量的值、方法的执行情况等。3.INFO:用于记录程序的正常运行信息,例如应用程序启动、关键操作完成等。4.WARN:用于记录警告信息,表示程序可能存在潜在的问题或异常情况。5.ERROR:最高级别的日志记录,用于记录错误信息和异常情况。任务5.1
日志打印-日志分类1.打印时间:日志事件发生的日期和时间。2.日志级别:日志事件的严重程度,如DEBUG、INFO、WARN、ERROR等。3.线程ID:产生日志事件的线程ID号。4.线程名称:产生日志事件的线程名。5.执行的类名:产生日志事件的日志类名或用户定义的日志标识。6.日志消息:开发者自定义的日志信息。任务5.1
日志打印-日志信息IDEA→File→Settings→Plugins,安装Lombok插件。任务5.1
日志打印-安装Lombok插件application.yml代码:logging:file:
name:mylog.log
path:E:/SpringBoot/level:root:error#全局日志级别com.example.demo.controller.LogTestController:infocom.example.demo.controller.LogController:trace任务5.1
日志打印-代码实现LogController.java代码:@Slf4j@RestController@RequestMapping("/api")publicclassLogController{@RequestMapping("/log")publicvoidprintLog(){log.trace("Iamtrace");log.debug("Iamdebug");("Iaminfo");log.warn("Iamwarn");log.error("Iamerror");}}指定日志文件的路径与名字指定日志文件的路径任务5.1
日志打印-测试结果1.使用生成mylog.log日志文件2.使用logging.file.path生成spring.log日志文件5.2JavaWeb应用开发项目教程(SpringBoot+Mybatis)自增ID和UUID自增ID是指数据库自增长的字段,在插入时自动生成,从1开始连续增加。自增ID的优缺点如下:优点:有序的增加、查询速度快、写入效率高、节省磁盘的空间、易读、性能好。缺点:仅适用于单个数据库中的数据,无法实现跨数据库或跨系统的唯一标识,因而难以分布式存储;同时,当出现频繁的插入或删除操作时,自增ID也会出现性能问题。任务5.2
自增ID和UUID-自增IDUUID是指UniversallyUniqueIdentifier,翻译为中文是通用唯一识别码,UUID的目的是让分布式系统中的所有元素都能有唯一的识别信息。UUID是由一组32位数的16进制数字所构成,以连字号分隔的五组来显示,形式为8-4-4-4-12,总共有36个字符(即32个英数字母和4个连字号)。例如:123e4567-e89b-12d3-a456-426655440000UUID的优缺点如下:优点:唯一性非常好,可以避免出现ID冲突的情况,一般用于跨系统的数据交换,或者当需要主键值在本地产生而又需要保证唯一性,较适用于分布式系统,同时对性能要求不高。缺点:数据量大的时候会消耗性能、生成位数较长。任务5.2
自增ID和UUID-UUIDMyBatis实现自增ID有两种方法1.自增主键,使用useGeneratedKeys+keyProperty组合的方式MyBatis中SQL语句如下:<insertid="insert"parameterType="user"useGeneratedKeys="true"keyProperty="id">INSERTINTOuserinfo(user_name,user_tel)VALUES(#{userName},#{tel})</insert>useGeneratedKeys="true"表示使用JDBC的getGeneratedKeys()方法获取数据库生成的主键值。keyProperty="id"表示将生成的主键值自动回填到插入数据对应的对象属性中,以便在后续的业务逻辑中使用,而不需要再次查询数据库。在INSERT语句中,不需要显式地插入id,只需要插入其他字段即可。任务5.2
自增ID和UUID-自增ID实现方法2.使用MyBatis的selectKey元素MyBatis中SQL语句如下:<insertid="insert"parameterType="user"><selectKeykeyProperty="id"order="AFTER"resultType="java.lang.Integer">SELECTLAST_INSERT_ID()</selectKey>INSERTINTOuserinfo(user_name,user_tel)VALUES(#{userName},#{tel})</insert>SELECTLAST_INSERT_ID()方法用于获取最后插入记录的自增主键值。order="AFTER"表示在插入操作完成后获取主键。在INSERT语句中,不需要显式地插入id,只需要插入其他字段即可。任务5.2
自增ID和UUID-自增ID实现方法MyBatis实现UUID<insertid="insert"parameterType="stu"><selectKeykeyProperty="id"order="BEFORE"resultType="java.lang.string">SELECTUUID()</selectKey>INSERTINTOstu(id,name,sex)VALUES(#{id},#{name},#{sex})</insert>UUID()是MySQL的内置函数,用于生成一个唯一的UUID值。SELECTUUID()用于生成一个新的UUID,返回到keyProperty指定id中。任务5.2
自增ID和UUID-UUID实现方法5.3JavaWeb应用开发项目教程(SpringBoot+Mybatis)跨表显示数据<resultMapid="BaseResultMap"type="ArticleClass"><resultcolumn="article_class_id"jdbcType="INTEGER"property="articleClassId"/><resultcolumn="article_class_name"jdbcType="VARCHAR"property="articleClassName"/><!--自定义的字段--><resultcolumn="article_num"jdbcType="VARCHAR"property="articleNum"/></resultMap><selectid="selectArticleNum"resultMap="BaseResultMap">SELECTarticle_class_id,article_class_name,(SELECTCOUNT(*)FROMtb_articleWHEREtb_article.article_class_id=tb_article_class.article_class_id)ASarticle_numFROMtb_article_class;</select>任务5.3
跨表显示数据-ArticleClassMapping.xml文件5.4JavaWeb应用开发项目教程(SpringBoot+Mybatis)多表查询tb_team(球队)、tb_coach(教练)、tb_player(球员)、tb_match(比赛)。1.一对一关系tb_team和tb_coach是一对一关系,建立新类TeamCoach,其成员对象为:TeamCoach类成员对象=Team类成员对象+Coach对象。MyBatis数据结构映射为:<!--配置关联实体类TeamCoach--><resultMapid="BaseResultMap"type="TeamCoach"><!--用于配置tb_team表字段与Team类属性之间的映射关系。--><!--一对一映射--><associationproperty="Coach"javaType="Coach"><!--用于配置tb_coach表字段与Coach类属性之间的映射关系。--></association></resultMap>任务5.4
多表查询2.一对多关系tb_team和tb_player是一对多关系,建立新类TeamPlayer,其成员对象为:TeamPlayer类成员对象=Team类成员对象+List<Player对象>。MyBatis数据结构映射为:<!--配置关联实体类TeamPlayer--><resultMapid="BaseResultMap"type="TeamPlayer"><!--用于配置tb_team表字段与Team类属性之间的映射关系。--><!--一对多映射--><collectionproperty="playerList"ofType="Player"><!--用于配置tb_player表字段与Player类属性之间的映射关系。--></collection></resultMap>任务5.4
多表查询3.多对多关系tb_player和tb_match是一对多关系(1)建立新类PlayerMatch,其成员对象为:PlayerMatch类成员对象=Player类成员对象+List<Match对象>。MyBatis数据结构映射为:<!--配置关联实体类PlayerMatch--><resultMapid="BaseResultMap"type="PlayerMatch"><!--用于配置tb_player表字段与Player类属性之间的映射关系。--><!--一对多映射--><collectionproperty="matchList"ofType="Match"><!--用于配置tb_match表字段与Match类属性之间的映射关系。--></collection></resultMap>任务5.4
多表查询(2)建立新类MatchPlayer,其成员对象为:MatchPlayer类成员对象=Match类成员对象+List<Player对象>。MyBatis数据结构映射为:<!--配置关联实体类MatchPlayer--><resultMapid="BaseResultMap"type="MatchPlayer"><!--用于配置tb_match表字段与Match类属性之间的映射关系。--><!--一对多映射--><collectionproperty="playerList"ofType="Player"><!--用于配置tb_player表字段与Player类属性之间的映射关系。--></collection></resultMap>任务5.4
多表查询5.5JavaWeb应用开发项目教程(SpringBoot+Mybatis)事务回滚任务5.5事务回滚-异常分类checked异常(Exception)是指编译器要检查这类异常,检查的目的一方面是因为该类异常的发生难以避免,另一方面就是让开发者去解决掉这类异常,所以称为必须处理(try...catch)的异常。常见的异常有:Exception、FileNotFoundException、IOException、SQLException.checked异常(Exception)是由编译器强制要求处理的,可以提前预防和处理程序可能遇到的问题。任务5.5
事务回滚-checked异常(Exception)unchecked异常(RuntimeException)是指编译器不会检查这类异常,不检查的则开发者在代码的编辑编译阶段就不是必须处理,这类异常一般可以避免,因此无需处理(try...catch)的异常。如果不处理这类异常,集成开发环境中的编译器也不会给出错误提示。常见的异常有:NullPointerException、ClassCastException、ArrayIndexsOutOfBoundsException等。unchecked异常(RuntimeException)通常是由程序编码错误引起的,通常应该通过改进代码来修复这些问题,而不是捕获异常。任务5.5
事务回滚-unchecked异常(RuntimeException)@Transactional相当于@Transactional(rollbackFor=RuntimeException.class),只对抛出的RuntimeException异常,才会事务回滚。如果希望无论抛出是checked异常(Exception),还是unchecked异常(RuntimeException),事务都要回滚,可以使用如下方法:@Transactional(rollbackFor={RuntimeException.class,Exception.class})publicvoidmethodName5(){ //...业务省略 if(){ thrownewRuntimeException("RuntimeException"); }
//...业务省略 if(){ thrownewException("Exception"); }}@Transactional标注位置的注意点:1.标注在接口实现类或接口实现方法上,而不是接口类中;2.标注在public方法上;3.标注在controller层、serviceImpl层都有效,规范起见,建议加到serviceImpl层。
任务5.5
事务回滚为了避免受异常的影响而无法返回该结果集,我们使用try-catch语句来捕获异常,返回给调用者,代码如下。@TransactionalpublicResultmethod(){try{//...各种的业务逻辑省略}catch(Exceptione){(e.getMessage());}}但是此方法因为异常被catch了,所以事务没有回滚。有以下三种处理方法。任务5.5
事务回滚1.手动抛出RuntimeException异常。@TransactionalpublicResultmethod(){try{//...各种的业务逻辑省略}catch(Exceptione){(e.getMessage());
thrownewRuntimeException();}}任务5.5
事务回滚2.手动触发事务回滚。@TransactionalpublicResultmethod(){try{//...各种的业务逻辑省略}catch(Exceptione){(e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//手动手工回滚异常}}3.改变默认的@Transactional回滚的异常设置,catch中必须要抛出异常throwe才会触发回滚,只是简单的打印异常而未抛出,则不会回滚。@Transactional(rollbackFor=Exception.class)publicResultmethod(){try{//...各种的业务逻辑省略}catch(Exceptione){throwe;}}5.6JavaWeb应用开发项目教程(SpringBoot+Mybatis)用户、角色和权限用户权限可以分为用户、角色和权限三个模块,其中用户和角色是多对多的关系,角色和权限也是多对多的关系。1.用户是应用系统的具体操作者,如何区分他们就要通过角色和权限来实现。2.角色往往是基于业务管理需求而预先在系统中设定好的固定标签,每个角色对应明确的系统权限,其所拥有的系统权限一般不会随意更改,并且角色也不会随着用户的添加和移除而进行改变,相较于用户管理而言更加稳定。3.权限决定用户在使用系统时能否操作某些功能,如果有权限则可以进行操作,没有则不能。任务5.6
用户、角色和权限具体使用方法是在创建角色之后给对应的角色分配权限,再将用户与角色关联,用以管理用户权限。不必再给每个用户单独分配权限,只需管理角色权限即可实现管理用户权限。若用户职位有变动,只需要改变他的角色属性就可以改变他的用户权限。任务5.6
用户、角色和权限t_user用户表表结构任务5.6
用户、角色和权限-表结构t_user用户表表数据t_role角色表表结构任务5.6
用户、角色和权限-表结构t_role角色表表数据t_module权限表表结构任务5.6
用户、角色和权限-表结构t_module权限表表数据t_user_role用户角色表表结构任务5.6
用户、角色和权限-表结构t_user_role用户角色表表数据t_role_module角色权限表表结构任务5.6
用户、角色和权限-表结构t_role_module角色权限表表数据<!--根据用户得到角色--><selectid="selectRoleByUser"resultMap="UserRoleEntity">SELECTt_user_role.user_id,t_role.role_nameFROMt_role,t_user_roleWHEREt_role.role_id=t_user_role.role_idANDt_user_role.user_id=#{userId}</select><!--根据角色得到权限--><selectid="selectModuleByRole"resultMap="RoleModuleEntity">SELECTt_role.role_id,t_module.module_name,t_module.module_urlFROMt_module,t_role,t_role_moduleWHEREt_role.role_id=t_role_module.role_idANDt_role_module.module_id=t_module.module_idANDt_role.role_id=#{roleId}</select><!--根据用户得到权限--><selectid="selectModuleByUser"resultMap="UserRoleModuleEntity">SELECTt_user_role.user_id,t_module.module_name,t_module.module_urlFROMt_module,t_role_module,t_user_roleWHEREt_role_module.role_id=t_user_role.role_idANDt_role_module.module_id=t_module.module_idANDt_user_role.user_id=#{userId}</select>任务5.6
用户、角色和权限-UserRoleModuleMapping.xml文件@Component//第一步:使用@Component注解publicclassUserAuthority{@Autowired//第二步:@Autowired注册Mapper层接口privateUserRoleModuleMapperuserRoleModuleMapper;publicstaticUserAuthorityuserAuthority;//第三步:添加一个你需要用到的类的静态字段@PostConstruct//第四步:用@PostConstruct注入bean,声明init()方法,进行初始化挂载publicvoidinit(){userAuthority=this;userAuthority.userRoleModuleMapper=this.userRoleModuleMapper;//第五步:调用mapper或service接口}publicbooleancheck(StringuserId,Stringurl){try{booleanb=false;List<Module>module=userAuthority.userRoleModuleMapper.selectModuleByUser(userId).getModuleList();for(Modulem:module){//System.out.println(m.getModuleUrl());if(url.equals(m.getModuleUrl()))b=true;}returnb;}catch(Exceptione)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保卫部工作制度
- 低收入工作制度
- 卫生室工作制度
- 传谋工作制度
- 中介人工作制度
- 午托班工作制度
- 内页工作制度
- 咨询部工作制度
- 代双联工作制度
- 冲床工作制度
- 腹腔镜下胆囊切除手术配合课件
- 开封智慧城市建设规划
- 胆囊病变的影像学检查及诊断思路
- 中考英语二轮复习课件-专项训练之补全对话
- 中心静脉压测量CVPppt
- 新生儿特点及常见疾病新
- 4M变更管理程序(含表格)
- GB/T 18941-2003高聚物多孔弹性材料定负荷冲击疲劳的测定
- GA 844-2009防砸复合玻璃通用技术要求
- 小学数学西南师大三年级上册四两位数除以一位数的除法 最新西师大版小学三年级上册数学第四单元两位数除以一位数的除法问题解决精品
- 泛光照明工程技术要求及质量标准
评论
0/150
提交评论