Github->https://github.com/noahlin27/Astera
Gitee->Astera: Astera project for Spring Boot
推荐官方的 spring 项目初始化服务器 https://start.spring.io/
选择 maven 进行项目构建和项目管理,初始化项目之前可以自定义添加依赖(Dependencies)
添加 MariaDB 的依赖
org.mariadb.jdbc
mariadb-java-client
runtime
更改项目配置文件(我习惯用 yml 风格),添加数据源配置
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
username: root
password: {password}
url:jdbc:mariadb://localhost:3306/{db_name}?useUnicode=true&
serverTimezone=Asia/Shanghai&characterEncoding=utf8&
autoReconnect=true&useSSL=false&allowMultiQueries=true
下面就正式开始写代码了,我选择用自己相对熟悉的 MVC模式 进行开发。
创建 model 层的实体类 User,成员变量和数据库字段一一对应,并为每个成员变量提供get、set方法。
接着写对应的 dao 层接口 UserDAO,提供操作数据库的方法。
首先添加 mybatis 依赖
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.0
方法一:
用 @Insert 注解的方式写一个插入记录行的方法 insert()
@Insert({"insert into", TABLE_NAME, "(", INSERT_FIELDS, ") values (#{变量1}, #{变量2}, ...)"})
int insert(User user);
方法二:
用 mapper 文件的方式实现,在 resources 目录中添加 mapper 目录,创建 UserMapper.xml 文件
insert into TABLE_NAME (字段1, 字段2, ...)
values (#{变量1}, #{变量2}, ...)
在配置文件中添加 mybatis 配置
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
两种实现操作数据库方法的对比:
注解的方法比较简洁方便
mapper 配置文件的方法可以实现分支、循环等逻辑结构(以后在项目中会用到)
在 test 目录下的项目包同名目录中创建 InitDatabaseTests 类,在启动类添加 @Sql 注解执行 sql建表文件创建数据表,sql 文件路径默认以 resources 目录为根目录,比如下面代码中对应的 init-schema.sql 文件应位于 resources 目录下。
@Sql("/init-schema.sql")
在启动类添加 @MapperScan 注解,Mybatis 会有一个拦截器自动地扫描这些包路径下的类,自动地为它们生成代理类
@MapperScan("top.noahlin.astera.dao")
添加 @Resouce 注解注入 UserDAO
也可以使用 @Autowired 注解,用 @Autowired 注解 IDEA 编辑器会报错,但运行程序时没有报错,DAO 接口提供的方法可以被正常执行
@Resource
UserDAO userDAO;
另一种生成代理类的方式是在 UserDAO 接口添加 @Mapper 注解,Mybatis 有一个拦截器,会自动地把 @Mapper 注解的接口生成动态代理类,这时使用 @Autowired 注解注入 UserDAO 不会出现编辑器的报错
问题原因:
(CSDN博客)在正常单元测试中,我们向方法上添加 @Test 注解即可,但是在 springboot 中我们要使用类似控制器注入方法,或者注入 dao 层方法,这种自动装配的类就可能会注入失败,报空指针异常 java.lang.NullPointerException
简单概括,在测试类中,dao 层的方法没有被正确注入,从图中 debug 情况可以看到 userDao 的值为 null。在运行项目时不存在这个问题。
解决方法:
在测试类上添加 @RunWith 和 @SpringBootTest 两个注解
@RunWith(SpringRunner.class)
@SpringBootTest
找到报错信息中导致异常的原因
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]……(报错信息太长,不完整复制了)
问题原因:
最终发现导致报错是因为在项目配置文件中配置了 mybatis 的 mapper-locations 同时 mapper 目录下的文件配置有错误(空的 xml 文件也不行)
解决方法:
如果选择了使用 @Insert 方式实现 dao 接口的方法,可以注释掉项目配置文件中的 mybatis mapper-locations 配置;
或者把 mapper 目录下的 UserDAO.xml 配置文件改成正确的。
No runnable methods
问题原因:
@Test注解导入的包有问题
解决方法:
import org.junit.Test;