ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

day66(YAML配置,使用Druid数据库连接池,编写持久层(数据访问层)代码,关于业务逻辑层(service层)

2022-06-05 10:02:21  阅读:170  来源: 互联网

标签:demo cn service tedu 配置 Druid 添加 day66 数据


day66(YAML配置,使用Druid数据库连接池,编写持久层(数据访问层)代码,关于业务逻辑层(service层)

1.YAML配置

  1. YAML配置就是把原有的.properties配置的扩展改为yml

  2. AML配置原本并不是Spring系列框架内置的配置语法,如果在项目中需要使用这种语法进行配置,解析这类文件需要添加相关依赖,在Spring Boot中默认已添加此依赖

  3. 在YAML配置中,原本在.properties的配置表现为使用多个小数点分隔的配置将改为换行使用2个空格缩进的语法,换行前的部分使用冒号表示结束,最后的属性名与值之间使用冒号和1个空格进行分隔,如果有多条属性在.properties文件中属性名有重复的前缀,在yml中不必也不能重复写

  4. 例如:

    1. 原本在.properties中配置为:

      spring.datasource.username=root
      spring.datasource.password=123456
    2. 则在yml文件中配置为:

      spring:
       datasource:
         username: root
         password: 123456
  5. 提示:在IntelliJ IDEA中编写yml时,当需要缩进2个空格时,仍可以使用键盘上的TAB键进行缩进,IntelliJ IDEA会自动将其转换为2个空格。

  6. 无论是.properties还是yml,只是配置文件的扩展名和文件内部的配置语法有区别,对于Spring Boot最终的执行其实没有任何表现上的不同

2.使用Druid数据库连接池

  1. Druid数据库连接是阿里巴巴团队研发的,在Spring Boot项目中,如果需要显式的指定使用此连接池,首先,需要在项目中添加依赖:

    <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>druid</artifactId>
       <version>1.1.20</version>
    </dependency>
  2. 当添加了此依赖,在项目中需要应用时,需要在配置文件中指定spring.datasource.type属性,取值为以上依赖项的jar包中的DruidDataSource类型的全限定名。

  3. 例如: 在yml中配置为:

    # Spring系列框架的配置
    spring:
     # 连接数据库的相关配置
     datasource:
       # 使用的数据库连接池类型
       type: com.alibaba.druid.pool.DruidDataSource

3.编写持久层(数据访问层)代码

  1. 数据持久化:

    • 在开发领域中,讨论数据时,通常指定是正在执行或处理的数据,这些数据都是在内存中的,而内存(RAM)的特征包含”一旦断电,数据将全部丢失“,为了让数据永久保存下来,通常会将数据存储到能够永久存储数据的介质中,通常是计算机的硬盘,硬盘上的数据都是以文件的形式存在的,所以,当需要永久保存数据时,可以将数据存储到文本文件中,或存储到XML文件中,或存储到数据库中,这些保存的做法就是数据持久化,而文本文件、XML文件都不利于实现增删改查中的所有数据访问操作,而数据库是实现增删改查这4种操作都比较便利的,所以,一般在讨论数据持久化时,默认指的都是使用数据库存储数据

  2. 在项目中,会将代码(各类、接口)划分一些层次,各层用于解决不同的问题,其中,持久层就是用于解决数据持久化问题的,甚至,简单来说,持久层对应的就是数据库编程的相关文件或代码。

  3. 目前,使用Mybatis技术实现持久层编程,需要:

    1. 编写一次性的基础配置

      • 使用@MapperScan指定接口所在的Base Package

      • 指定配置SQL语句的XML文件的位置

    2. 编写每个数据访问功能的代码

      • 在接口中添加必须的抽象方法

        • 可能需要创建相关的POJO类

      • 在XML文件中配置抽象方法映射的SQL语句

  4. 关于一次性的配置,@MapperScan注解需要添加在配置类上,有2种做法:

    1. 直接将此注解添加在启动类上,因为启动类本身也是配置类

    2. 自行创建配置类,在此配置类上添加@MapperScan

      1. 如果采用以上的第2种做法,则应该在src\main\java的根包下,创建config.MybatisConfig类,并在此类使用@MapperScan注解

        package cn.tedu.boot.demo.config;

        import org.mybatis.spring.annotation.MapperScan;
        import org.springframework.context.annotation.Configuration;

        @Configuration
        @MapperScan("cn.tedu.boot.demo.mapper")
        public class MybatisConfig {
        }
  5. 另外,关于指定配置SQL语句的XML文件的位置,需要在application.yml(或application.properties)中配置mybatis.mapper-locations属性,例如:

    # Mybatis相关配置
    mybatis:
     # 用于配置SQL语句的XML文件的位置
     mapper-locations: classpath:mapper/*.xml
  6. 基于以上的配置值,还应该在src/main/resources下自行创建名为mapper的文件夹。

    至此,关于使用Mybatis实现数据库编程的一次性配置结束!

    接下来,可以使用任何你已知的Mybatis使用方式实现所需的数据访问。

    目前,设定目标为:最终实现”添加管理员账号“的功能。则在数据访问层需要做到:

    • 插入管理员数据

      • 创建cn.tedu.boot.demo.entity.Admin

      • cn.tedu.boot.demo.mapper包(不存在,则创建)下创建AdminMapper接口,并在接口中声明int insert(Admin admin);方法

      • src/main/resources/mapper文件夹下通过粘贴得到AdminMapper.xml文件,在此文件中配置与以上抽象方法映射的SQL语句

      • 编写完成后,应该及时测试,测试时,推荐在src/test/java的根包下创建mapper.AdminMapperTests测试类,并在此类中编写测试方法

    • 根据用户名查询管理员数据

      • 后续,在每次插入数据之前,会调用此功能进行查询,以此保证”重复的用户名不会被添加到数据库中“

        • 即便在数据表中用户名已经添加了unique,但是,不应该让程序执行到此处

      • AdminMapper接口中添加Admin getByUsername(String username);方法

      • AdminMapper.xml文件中添加与以上抽象方法映射的SQL语句

      • 编写完成后,应该及时测试

    • 其它问题暂不考虑,例如在ams_admin中,其实phoneemail也是设置了unique的,如果完整的实现,则还需要添加根据phone查询管理员的功能,和根据email查询管理员的功能,在不实现这2个功能的情况下,后续进行测试和使用时,应该不使用重复的phoneemail值来测试或执行

4.关于业务逻辑层(service层)

  1. 业务逻辑层是被Controller直接调用的层(Controller不允许直接调用持久层),通常,在业务逻辑层中编写的代码是为了保证数据的完整性和安全性,使得数据是随着我们设定的规则而产生或发生变化。

  2. 通常,在业务逻辑层的代码会由接口和实现类组件,其中,接口被视为是必须的

  • 推荐使用基于接口的编程方式

  • 部分框架在处理某些功能时,会使用基于接口的代理模式,例如Spring JDBC框架在处理事务时

  1. 在接口中,声明抽象方法时,仅以操作成功为前提来设计返回值类型(不考虑失败),如果业务在执行过程可能出现某些失败(不符合所设定的规则),可以通过抛出异常来表示!

  2. 关于抛出的异常,通常是自定义的异常,并且,自定义异常通常是RuntimeException的子类,主要原因:

  • 不必显式的抛出或捕获,因为业务逻辑层的异常永远是抛出的,而控制器层会调用业务逻辑层,在控制器层的Controller中其实也是永远抛出异常的,这些异常会通过Spring MVC统一处理异常的机制进行处理,关于异常的整个过程都是固定流程,所以,没有必要显式抛出或捕获

  • 部分框架在处理某些事情时,默认只对RuntimeException的子孙类进行识别并处理,例如Spring JDBC框架在处理事务时

  1. 所以,在实际编写业务逻辑层之前,应该先规划异常,例如先创建ServiceException类:

package cn.tedu.boot.demo.ex;

public class ServiceException extends RuntimeException {
   
}
  1. 接下来,再创建具体的对应某种“失败”的异常,例如,在添加管理员时,可能因为“用户名已经存在”而失败,则创建对应的UsernameDuplicateException异常:

package cn.tedu.boot.demo.ex;

public class UsernameDuplicateException extends ServiceException {
   
}
  1. 关于抽象方法的参数,应该设计为客户端提交的数据类型或对应的封装类型,不可以是数据表对应的实体类型!如果使用封装的类型,这种类型在类名上应该添加某种后缀,例如DTO或其它后缀,例如:

package cn.tedu.boot.demo.pojo.dto;

public class AdminAddNewDTO implements Serializable {
   private String username;
   private String password;
   private String nickname;
   private String avatar;
   private String phone;
   private String email;
   private String description;
   // Setters & Getters
   // hashCode(), equals()
   // toString()
}

然后,在cn.tedu.boot.demo.service包下声明接口及抽象方法:

package cn.tedu.boot.demo.service;

public interface IAdminService {
   void addNew(AdminAddNewDTO admin);
}

并在以上service包下创建impl子包,再创建AdminServiceImpl类:

package cn.tedu.boot.demo.service.impl;

@Service // @Component, @Controller, @Repository
public class AdminServiceImpl implements IAdminService {
   @Override
   public void addNew(AdminAddNewDTO admin) {
       //调用adminMapper的insert(Admin admin)
       
  }
}
控制器Controller调用业务逻辑层Service的代码时,大致表现为:
   
try {
   Admin admin = service.login("root","1234");
   // 登录成功的后续处理
} catch (UserNotFoundException e) {
   // 针对用户名错误的处理
} catch (PasswordNotMatchException e) {
   // 针对密码错误的处理
}
//@Service
public class TomServiceImpl implements xxxService {
   public void addNew(Admin admin) {
       
  }
}

@Service
public class JackServiceImpl implements xxxService {
   public void addNew(Admin admin) {
       
  }
}
@Autowired
xxxService xxx;
 

标签:demo,cn,service,tedu,配置,Druid,添加,day66,数据
来源: https://www.cnblogs.com/xiaoyezilei/p/16343419.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有