主要内容:
〇、项目结构
一、创建dataobject
二、创建mapper
三、创建dao
四、创建service
五、创建impl
六、创建单元测试
〇、项目结构
一、创建dataobject
1.1. 新建dataobject包(在com.example.demo下)
1.2. pom增加包依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
1.3. 在dataobject下新增class - ModuleInfo
@DynamicUpdate @Data @Entity public class ModuleInfo { /** 模块id. 主键,自增. */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; /** 模块名. */ private String moduleName; private Date createTime; private Date updateTime; }
注:
@Data是用于省略写get和set方法,源于lombok。
@Entity是用于将这个类标注为一个实体类,可用于之后对该对象直接调用,默认和数据库_对应驼峰关系,如:module_name对应moduleName。
@DynamicUpdate是用于当实体类中写到时间字段,但更新其它字段时,没有对时间字段赋值,可自动更新时间。
二、创建mapper
2.1. 新建mapper包(在com.example.demo下)
2.2. pom.xml增加包依赖
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency>
2.3. 在mapper下增加interface - ModuleInfoMapper
@Mapper public interface ModuleInfoMapper { @Select("select * from module_info where id = #{id}") @Results({ @Result(column = "id", property = "id"), @Result(column = "module_name", property = "moduleName") }) ModuleInfo findByModuleId(Integer id); }
注:
@Mapper:用于标注这是一个Mapper
@Select:用于编写这个方法对应的SQL,同理有@Insert,@Update,@Delete
@Result:用于把实体类的字段和数据库的字段成对应关系,即_和驼峰的对应关系
2.4. 优化上面的写法
2.4.1. 在application.yml增加自动匹配对应关系配置
mybatis: configuration: map-underscore-to-camel-case: true
2.4.2. 去掉@Result
@Mapper public interface ModuleInfoMapper { @Select("select * from module_info where id = #{id}") }) ModuleInfo findByModuleId(Integer id); }
2.4.3. 在application.yml增加mapper输出配置
logging:
level:
com.example.demo.mapper: trace
2.4.4. 在之后编写的单元测试后,执行单元测试,查看输出
三、创建dao
3.1. 新建dao包(在com.example.demo下)和 class - ModuleInfoDao
@Repository public class ModuleInfoDao { @Autowired ModuleInfoMapper mapper; public ModuleInfo findByModuleId(Integer id) { return mapper.findByModuleId(id); } }
注:
@Repository:怎么解释我也不知道,但是可以帮助spring注入bean
四、创建service
4.1. 新建service包和 interface - ModuleInfoService
public interface ModuleInfoService { ModuleInfo findByModuleId(Integer id); }
五、创建impl
5.1. 在service下新建impl包(在com.example.demo.service下)和 class - ModuleInfoServiceImpl
@Service public class ModuleInfoServiceImpl implements ModuleInfoService { @Autowired ModuleInfoDao dao; @Override public ModuleInfo findByModuleId(Integer id) { return dao.findByModuleId(id); } }
注:
@Service:标注这是service,其实同理上面的@Repository
impements:这是用于实现service类的
快捷键:
ctrl + O:选择需要实现的类
六、创建单元测试
6.1. 在DemoApplication里增加mapper扫描
@SpringBootApplication // 增加mapper扫描 @MapperScan(basePackages = {"com.example.demo.mapper"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
6.2. 创建mapper的单元测试,在mapper文件下,右键类名 -> Go To -> Test
6.3. 生成的mapperTest文件在test目录下,并增加单元测试内容
@SpringBootTest @RunWith(SpringRunner.class) public class ModuleInfoMapperTest { @Autowired ModuleInfoMapper mapper; @Test public void findByModuleId() { ModuleInfo result = mapper.findByModuleId(1); assertNotNull(result); } }
注:
@SpringBootTest:属于springboot,用于指定启动类,否则一些autowired会引入失败
@RunWith:属于junit,用于执行junit的测试代码
6.4. 同理增加serviceTest文件,从ModuleInfoServiceImple处增加单元测试(写完右键执行就可以,观察运行结果)
@SpringBootTest @RunWith(SpringRunner.class) public class ModuleInfoServiceImplTest { @Autowired ModuleInfoService service; @Test public void findByModuleId() { ModuleInfo result = service.findByModuleId(1); assertNotNull(result); } }