通过学习Springboot和Mybatis,搭建了一个小的实例。
把搭建的整个过程整理好思路,用文字记录下来,最终能形成我自己的东西。
麻雀虽小,五脏俱全,该案例实现了使用springboot+mybatis实现数据库的读取功能,理清了各层级之间的关系,全面详细地复习了一遍相关基础。
-------------------------------密------封------线------内------禁------止------答------题-------------------
需求:读取本地MySQL数据库中某张表的内容,然后输出到网页上。
IDE:IntelliJ IDEA 2018.1.5 x64
SDK:1.8
java version:1.8.0_171
数据库:MySQL
图形化界面工具:MySQL-Front
创建Springboot项目
File -> New -> Project -> Spring Initializr -> Next ->修改Group和Artifact值 ->添加web依赖
该项目拥有一个初始的Application启动项。
jar包支持
File -> Project Structure -> Modules -> Dependencies -> "+" -> "Jars or directories" ->添加相应jar包
我们要根据对应的表内容来创建对应的实体类,首先观察表结构
数据库名:AIS20171028103342
表名:DealerEntity
字段名:id(主键)(int),FName(varchar),FNumber(varchar),FPhone(varchar),FHelpCode(varchar)
由此我们可以创建对应的实体类DealerEntity.java
package com.bkw.ankang.dao.entity;
import lombok.Data;
/**
* @author: xialegemo
* @date: 2018/7/4 16:25
**/
@Data
public class DealerEntity {
private Integer id;
private String FName;
private String FNumber;
private String FPhone;
private String FHelpCode;
}
可以观察到,我使用了lombok插件,使用@Data注解可以省略get/set,、当然也可以快捷通过alt+insert,选择getter/seter快速添加get/set方法。
我的Group设置为com.bkw,Artifact值为ankang。在ankang下新建一个包dao作为dao层,dao下再新建一个包entity,这个包收纳所有的实体类。
id是int类型,其余字段为String类型。都设置为private。
所有在spring中注入的bean 都建议定义成私有的域变量。并且要配套写上 get 和 set 方法。
Springboot各层级的构造顺序
springboot各层级的构造是有顺序的
我们通过controller层调用service层的方法,一般不涉及到数据库的实例到此结束,但是大部分情况下,我们的业务是与数据库挂钩的,所以service层还需要进一步去找dao层定义的方法。
在写整个项目的过程中,我们需要逆着程序调用的思路去写,因为没有底层提供接口,上层显然是无法调用的。
本案例开发的持久层支持使用mapper+xml的方式实现,还有一种注解方式(待点亮)。
所以开发的顺序是:
①观察数据库,对应数据库,确定表结构,主要观察表名,字段名,字段类型;
②写对应表的实体类,要注意一一对应;
③写实体类对应的mapper接口,提供一个方法接口,这个方法接口的具体内容由mapper.xml提供,就是基于数据库的增删改查,sql语句写在xml文件中,这种写法叫做mapper+xml写法,我们可以先写一个空的mapper,然后创建对应的xml文件,在xml文件中做好SQL语句的封装,然后再对应的mapper中调用该语句。
xml配置文件内容:
检索的关键词是"findAll",调用这个关键词,就会调用它封装的SQL语句“select * from DealerEntity”,就是检索该表中所有数据。返回类型是DealerEntity,就是指返回一个DealerEntity对象。
于是我们可以给空的mapper添加findAll()方法了。当然你也可以先写mapper中的方法,报错了再到xml中去配置具体的方法:)
package com.bkw.ankang.dao.mapper;
import com.bkw.ankang.dao.entity.DealerEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @author: xialegemo
* @date: 2018/7/4 16:27
**/
@Component
@Mapper
public interface DealerMapper {
List findAll();
}
注意,mapper的类型是一个接口interface,文件类型意义上的接口,区别于java类型文件,这是一个接口中的方法,所以没有方法体。
@Mapper注解表明这是一个mapper类。
@Component注解表示将该类纳入到Spring中管理。
现在我们的mapper层(也就是dao层)已经提供了一个方法,我们可以在service层中调用这个方法。
以下是service层:
package com.bkw.ankang.service;
import com.bkw.ankang.dao.entity.DealerEntity;
import com.bkw.ankang.dao.mapper.DealerMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author: xialegemo
* @date: 2018/7/4 17:08
**/
@Service
public class DealerService {
@Autowired
DealerMapper dealerMapper;
public List findAll() {
List dealerList= dealerMapper.findAll();
return dealerList;
}
}
其中用到了@Autowired自动装配注解
也就是:
@Autowired
DealerMapper dealerMapper;
个人对于@Autowired注解的理解如下
https://www.jianshu.com/p/8d9b34df05d8
调用mapper中的findAll()方法,把取到的值赋值给定义好的数组dealerList,再返回这个数组。
接下来,我们写controller层,在controller层定义并调用了list()方法,相当于间接调用了service层的findAll()方法,要注意我们在controller层也必须@Autowired 一个service层的实例dealerService,这样才能实现方法的调用。
controller层:
package com.bkw.ankang.controller;
import com.bkw.ankang.dao.entity.DealerEntity;
import com.bkw.ankang.service.DealerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author:
* @date: 2018/7/4 16:30
**/
@RestController
public class DealerController {
@Autowired
DealerService dealerService;
@RequestMapping(value="/nameList",method = RequestMethod.GET)
public List list(){
return dealerService.findAll();
}
}
关于@RestController注解
个人理解如下
https://www.jianshu.com/p/253c22dd6018
关于@RequestMapping注解
个人理解如下
https://www.jianshu.com/p/21fc73f09f41
我们在controller层中调用list()方法,继而到service层中调用findAll()方法,继续往下又调用了mapper层(也就是dao层)的方法findall()。
注意,虽然这里方法名字相同,但是其实是不同类下定义的方法,所以是不同的方法。
mapper中的findAll()方法在mapper.xml文件中有对应的SQL语句,执行可得结果,再通过return层层往上递交执行结果,最终以数组形式传递到最上层,我们定义了一个访问的路径/nameList,
在浏览器地址栏中键入
http://127.0.0.1:9910/nameList,即可得到执行结果: