springboot整合Mybatis详细操作|青训营笔记

101 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第3天。

在软件应用开发过程中,毫无疑问会有数据库的操作,并且当下java主流框架为springboot。传统的java操作数据库方式为JDBC。而目前流行的数据库操作框架为Mybatis,于是,让我们来看看springboot如何整合Mybatis

什么是Mybatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。让数据库的操作变的更简单方便。Mybatis官方链接为 mybatis.org/mybatis-3/z…

详细操作

使用IDE(推荐使用idea)新建一个springboot项目,然后新建相应的工程文件夹,工程目录大致如下

image.png

  • 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;
    }
}

实体类尽量和数据库中的表保持一致,并且实体类拥有属性的SetGet方法。实体类(这里其实也是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);
    }
}

运行项目,在浏览器中输入相应链接,便能成功访问。

image.png

总结

使用springboot整合Mybatis可以方便的操作数据库,省去了冗杂的SQL代码编写,并提高了程序可读性与可维护性。