• JSD-2204-Lombok插件-MyBatis配置.xml文件-Day03


    1.LOMBOK

    LOMBOK是一款可以在编译期在类中自动生成某些代码的工具,通常用于自动生成:

    • Setters & Getters
    • hashCode() and equals()
    • toString()
    • 无参数构造方法
    • 全参数构造方法

    在使用时,需要添加依赖项:

    1. <dependency>
    2. <groupId>org.projectlombokgroupId>
    3. <artifactId>lombokartifactId>
    4. <version>1.18.20version>
    5. <scope>providedscope>
    6. dependency>

    在POJO类的声明上,添加@Data注解,此注解可以帮助生成所有属性对应的Setters & Getters、规范的hashCode()equals()toString(),并且,要求此类的父类中存在无参数构造方法。

    1. package cn.tedu.csmall.product.pojo.entity;
    2. import lombok.Data;
    3. import java.io.Serializable;
    4. import java.time.LocalDateTime;
    5. @Data
    6. public class Album implements Serializable {
    7. private Long id;
    8. private String name;
    9. private String description;
    10. private Integer sort;
    11. private LocalDateTime gmtCreate;
    12. private LocalDateTime gmtModified;
    13. }

    注意:Lombok是在**编译期(将Java源代码文件.java编译成目标文件.class)**添加各方法,所以,在IntelliJ IDEA或其它开发工具中,默认情况下,直接调用以上各属性对应的Setter或Getter方法,在开发工具将无法提示这些方法,并且,已经写出来的调用这些方法的代码会报错,为了解决此问题,需要在开发工具中安装Lombok插件。

    另外,Lombok还提供了以下注解:

    • @Data

    • @Setter

    • @Getter

    • @EqualsAndHashCode

    • @ToString

    • @NoArgsConstructor

    • @AllArgsConstructor

    • @Accessors

      • 配置为@Accessors(chain = true)时,将支持链式调用方法
    • @Slf4j

      • 用于日志,将在后续补充说明

    2.Mybatis框架

    2.1Mybatis框架的主要作用

    Mybatis框架主要实现了简化持久层编程的问题。

    持久层:实现数据持久化的一系列组件。

    数据持久化:通常,在开发领域中,讨论的数据大多是在内存中的,而内存默认特指内存条(RAM:Random Access Memory),RAM的特性包含“一旦断电,数据将全部丢失”,且“正在执行的程序和数据都是在内存中的”,由程序处理的数据最终应该永久的保存下来,则不能将这些数据一直只存储在内存中,通常,会将数据存储到可以永久保存数据的存储介质中,典型的永久存储数据的存储介质有:硬盘、U盘、光盘等,所以,数据持久化就是将内存中的数据存储到硬盘等介质中,而硬盘中的数据是以文件的形式存在的,所以,通常可以将数据存储到文本文件中、XML文件、数据库中,这些存储方案中,只有数据库是便于实现增、删、改、查这4种操作的,所以,一般“数据持久化”默认指的就是将数据存储到数据库中。

    在Java语言中,实现数据库编程需要先建立与数据库的连接,然后准备SQL语句,然后执行,然后获取执行结果并处理结果,最后,关闭或归还数据库连接,这是一套非常固定的流程,无论对哪个数据表执行哪种操作,其流程大致是固定的,所以,就产生了一些框架,用于简化这部分的编程。

    在使用Mybatis时,只需要关注2点:

    • 在接口中定义抽象方法
    • 配置抽象方法映射的SQL语句

    2.2使用Mybatis的前期准备

    在Spring Boot项目中,当需要使用Mybatis时,需要添加相关的依赖:

    1. <dependency>
    2. <groupId>mysqlgroupId>
    3. <artifactId>mysql-connector-javaartifactId>
    4. <scope>runtimescope>
    5. dependency>
    6. <dependency>
    7. <groupId>org.mybatis.spring.bootgroupId>
    8. <artifactId>mybatis-spring-boot-starterartifactId>
    9. <version>2.2.2version>
    10. dependency>

    当添加以上依赖项后,如果启动项目,会提示以下错误:

    1. ***************************
    2. APPLICATION FAILED TO START
    3. ***************************
    4. Description:
    5. Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
    6. Reason: Failed to determine a suitable driver class

    因为Spring Boot启动时,如果检测到当前已经添加数据库编程的依赖项,会自动读取连接数据库的配置信息,由于目前尚未配置这些信息,所以,启动会报错!

    所以,需要在application.properties中添加配置:

    1. # 连接数据库的参数
    2. spring.datasource.url=jdbc:mysql://localhost:3306/mall_pms?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    3. spring.datasource.username=root
    4. spring.datasource.password=root

    由于Spring Boot在启动项目时只会读取以上配置并应用,并不会实际的连接数据库,所以,即使以上配置值是错误的,启动项目时并不会报告错误!

    可以在src/test/java的根包下的测试类中进行测试连接:

    1. @SpringBootTest
    2. class CsmallProductApplicationTests {
    3. @Test
    4. void contextLoads() {
    5. }
    6. @Autowired
    7. DataSource dataSource;
    8. @Test
    9. void testConnection() throws Exception {
    10. dataSource.getConnection();
    11. }
    12. }

    当配置的URL错误(含主机名错误、端口号错误),或MySQL未启动时,将出现以下错误:

    1. com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
    2. The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

    如果数据库名称错误,或无此数据库,将出现以下错误:

    java.sql.SQLSyntaxErrorException: Unknown database 'mall_pmsxzxxxxx'
    

    如果用户或密码错误,将出现以下错误:

    java.sql.SQLException: Access denied for user 'rootx'@'localhost' (using password: YES)
    
    java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
    
    java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)
    

    2.3使用Mybatis插入数据

    Mybatis要求抽象方法必须存在于接口中(因为其实现原理是基于接口的代理模式的),所以,在项目的根包下创建mapper.AlbumMapper接口。

    提示:可以在接口上添加@Repository注解,避免在自动装配时IntelliJ IDEA误判而提示错误。

    关于接口中的抽象方法:

    • 返回值类型:如果需要执行的SQL是增、删、改类型的,使用int作为返回值类型,表示“受影响的行数”,不建议使用void
    • 方法名称 :自定义,不要使用重载
      • 获取单个对象的方法用get做前缀
      • 获取多个对象的方法用list做前缀
      • 获取统计值的方法用count做前缀
      • 插入的方法用save/insert做前缀
      • 删除的方法用remove/delete做前缀
      • 修改的方法用update做前缀
    • 参数列表:如果需要执行的SQL语句有多个参数,应该将这些参数封装到自定义的数据类型中,并使用自定义的数据类型作为抽象方法的参数

    则,插入相册时需要执行的SQL语句大致是:

    insert into pms_album (name, description, sort, gmt_create, gmt_modified) values (?, ?, ?, ?, ?);
    

    则抽象方法为:

    int insert(Album album);
    

    首次使用时,需要让Mybatis知道哪些接口是Mapper接口,可以(二选一):

    • 在每个接口上添加@Mapper注解
    • 配置类上添加@MapperScan并指定Mapper接口所在的包
      • 在根包下的任何类,添加了@Configuration注解,即是配置类
      • 可以在根包下创建config.MybatisConfiguration类,同时添加@Configuration@MapperScan("cn.tedu.csmall.product.mapper")即可

    另外,在使用Mybatis时,还需要为每个抽象方法配置其映射的SQL语句,可以使用@Insert等注解来配置SQL语句,但不推荐,因为:

    • 不便于配置较长的SQL语句
    • 不便于做一些复杂的配置,特别是查询时
    • 不便于实现与DBA(Database Administrator)分工合作

    建议的做法是使用XML文件来配置SQL语句,可以从 http://doc.canglaoshi.org/config/Mapper.xml.zip 下载得到所需的文件,然后,在项目的src/main/resources下创建mapper文件夹,将得下载、解压得到的XML文件复制到此文件夹中。

    关于配置SQL的XML文件:

    • 根节点必须是
    • 上必须配置namespace属性,取值为对应的接口的全限定名
    • 的子级,根据需要执行的SQL语句,选择使用