这是我参与「第四届青训营 」笔记创作活动的第3天。
在软件应用开发过程中,毫无疑问会有数据库的操作,并且当下java主流框架为springboot。传统的java操作数据库方式为JDBC。而目前流行的数据库操作框架为Mybatis,于是,让我们来看看springboot如何整合Mybatis。
什么是Mybatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。让数据库的操作变的更简单方便。Mybatis官方链接为 mybatis.org/mybatis-3/z…
详细操作
使用IDE(推荐使用idea)新建一个springboot项目,然后新建相应的工程文件夹,工程目录大致如下
- controller层负责具体的业务模块流程的控制逻辑相关代码。
- bean(有时也称为entity)层用于存放我们的实体类,与数据库中的属性值基本保持一致,实现set和get的方法。
- dao(有时也称为Mapper)层主要是做数据持久层的工作,负责与数据库联络,封装了增删改查基本操作。
- service层主要负责业务模块的逻辑应用设计,具体要调用到已定义的DAO层的接口。
引入Mybatis项目包
在项目的pom.xml文件中写入如下代码
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
更新pom.xml文件,Mybatis相关的包便会导入至项目中。
修改配置文件
在resource文件夹下的application.properties中添加代码,此文件为springboot项目核心配置文件,采用yaml语法。
spring.datasource.url=jdbc:mysql://localhost:3306/parklot?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=****
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
mybatis.typeAliasesPackage=com.example.parking.bean
mybatis.mapperLocations=classpath:mapper/*.xml
- url:mysql连接的url,默认是3306端口,parklot是数据库名,添加时需要修改成自己的数据库名。serverTimezone设置时区,亚洲时区请设置上海或者香港,不要设置北京,因为系统里没有这个时区。
- driver-class-name:mysql驱动,此驱动同样需要在pom.xml文件中导入,注意有时会有版本问题导致错误,通常可以通过提高驱动版本或者添加时区解决。
- username 是数据库用户名,password是数据库密码。
- mybatis.typeAliasesPackage=com.example.parking.bean是Mybatis的包扫描路径,扫描将实体类包。
- mybatis.mapperLocations:用于将配置路径下的 * .xml 文件加载到 mybatis 中。
新建实体类
在bean文件夹下新建实体类,这里举例说明
public class ParkRecord {
private int PId;
private String carId;
private String startTime;
private String overTime;
private String carPlace;
private double money;
private String status;
public int getPId() {
return PId;
}
public void setPId(int PId) {
this.PId = PId;
}
public String getCarId() {
return carId;
}
public void setCarId(String carId) {
this.carId = carId;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getOverTime() {
return overTime;
}
public void setOverTime(String overTime) {
this.overTime = overTime;
}
public String getCarPlace() {
return carPlace;
}
public void setCarPlace(String carPlace) {
this.carPlace = carPlace;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
实体类尽量和数据库中的表保持一致,并且实体类拥有属性的Set和Get方法。实体类(这里其实也是POJO类)用于数据的临时传递,它只能装载数据,作为数据存储的载体,而不具有业务逻辑处理的能力。
新建dao类
springboot整合Mybatis有两种方法:配置文件与注解,由于使用注解开发比较方便,这里只讲解注解开发。
@Mapper
public interface ParkRecordDao {
/*查询所有数据*/
@Select("select * from parkrecord")
List<ParkRecord> findAll();
/*根据车号删除相应信息*/
@Delete("delete from parkrecord where PId=#{id}")
void deleteParkRecord(int id);
@Insert("insert into parkrecord(carId,startTime,overTime,carPlace,money,status) values (#{carId},#{startTime},#{overTime},#{carPlace},#{money},#{status})")
void insetParkRecord(ParkRecord parkRecord);
@Update("update parkrecord set carId=#{carId},startTime=#{startTime},overTime=#{overTime},carPlace=#{carPlace},money=#{money},status=#{status} where id=#{id}")
void updateParkRecord(ParkRecord parkRecord);
}
使用 @Mapper标识类,说明将此类交给springboot容器管理,不需要再写Mapper配置文件。其中在方法上添加 @Select,@Delete,@Insert,@Update等注解,在其中直接编写相应SQL语句,使用 #{} 解析参数。
编写service类
在service文件夹下编写相应的service类,使用接口闭合原则,降低程序模块之间的耦合性。
public interface ParkRecordService {
/*查询所有数据*/
List<ParkRecord> findAll();
void deleteParkRecord(int id);
boolean updateParkRecord(ParkRecord parkRecord);
boolean insertParkRecord(ParkRecord parkRecord);
}
@Service
public class ParkRecordServiceImpl implements ParkRecordService{
@Autowired
private ParkRecordDao parkRecordDao;
@Override
public List<ParkRecord> findAll() {
return parkRecordDao.findAll();
}
@Override
public void deleteParkRecord(int id) {
parkRecordDao.deleteParkRecord(id);
}
@Override
public boolean updateParkRecord(ParkRecord parkRecord) {
boolean flag=false;
try{
parkRecordDao.updateParkRecord(parkRecord);
flag=true;
}catch (Exception e){
e.printStackTrace();
}
return flag;
}
@Override
public boolean insertParkRecord(ParkRecord parkRecord) {
boolean flag=false;
try{
parkRecordDao.insetParkRecord(parkRecord);
flag=true;
}catch (Exception e){
e.printStackTrace();
}
return flag;
}
}
使用 @service注解标识类,可被springboot容器管理。使用 @Autowired注解自动装配Dao类。
编写controller类
编写外部接口层,使用Restful风格编写。
@RestController
@RequestMapping(value = "do/parkRecord")
public class ParkRecordController {
@Autowired
private ParkRecordService parkRecordService;
@RequestMapping(value = "/all",method = RequestMethod.GET)
public List<ParkRecord> findAll(){
return parkRecordService.findAll();
}
@RequestMapping(value = "/delete",method = RequestMethod.GET)
public void deleteParkRecord(@RequestParam(value = "id", required = true) int id){
//System.out.println("执行删除");
//System.out.println(id);
parkRecordService.deleteParkRecord(id);
}
@RequestMapping(value = "/insert",method = RequestMethod.POST)
public boolean insertParkRecord(@RequestBody ParkRecord parkRecord){
return parkRecordService.insertParkRecord(parkRecord);
}
@RequestMapping(value = "/update",method = RequestMethod.POST)
public boolean updateParkRecord(@RequestBody ParkRecord parkRecord){
return parkRecordService.updateParkRecord(parkRecord);
}
}
运行项目,在浏览器中输入相应链接,便能成功访问。
总结
使用springboot整合Mybatis可以方便的操作数据库,省去了冗杂的SQL代码编写,并提高了程序可读性与可维护性。