【Spring Boot(三)】

Spring Boot + Mybatis

Posted by Raserting_L on June 7, 2020

写在前面:

这是我第一天接触Spring Boot并且完成了第一个简单的Spring Boot服务程序搭建,再根据搜集到的各种资料摸索完成了Spring Boot + Mysql 的程序小实验,Spring Boot + Mybatis的程序小实验,Spring Boot + Redis的程序小实验之后写的,算是记录自己学习过程,如有错误望见谅。对了,一共分了四篇小文章来记录噢。

一、 总体概述

jiegou3

上面的是最终的一个项目目录结构

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

另外,这次实验我是用的是注解的方式进行配置。

首先还是需要对pom.xml文件进行依赖引用,然后对application.properties文件进行一个配置信息的编写。主要是Mysql和Mybatis的配置信息。之后我们开始代码编写,为了简洁性,我没有做太多的分层处理了,我这里就分为:实体类、Mapper接口、service类,Controller类,使用Controller调用Service类中的函数方法来调用Mapper接口进行数据持久化处理。

二、依赖引入

下面是pom.xml文件的需要添加的内容

<!--添加Mysql连接依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--引入jdbc支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--引入对Mybatis的集成-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

主要是引入对 Mysql 的依赖包,对jdbc的支持以及对Mybatis的集成。

三、 配置信息

下面是application.properties的内容

# Mysql的一些配置信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=true  #这个test为数据库名称
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#貌似上面这几行是最重要的,尤其是第一行,test数据库后面的?后面的东西,好像是设置时区对于Mysql8一定要有


#Mybatis的配置信息
mybatis.type-aliases-package=com.example.mybastisdemo.mapper

可以看到,就是两个方面的配置信息。对于Mysql 还是版本问题,之前已经提过。

四、 分层代码编写

### 1. 启动文件

首先,直接在启动文件SpringbootApplication.java的类上配置@MapperScan,这样就可以省去,单独给每个Mapper上标识@Mapper的麻烦。

如下:

package com.example.mybatisdemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.mybatisdemo.mapper")
public class MybatisdemoApplication {

    public static void main(String[] args) {

        SpringApplication.run(MybatisdemoApplication.class, args);
    }

}

二. 各层代码

首先是entity层的User.java文件,该文件里定义的是一个类,该类的属性和数据库中要查询的表属性一一对应。代码如下:

package com.example.mybastisdemo.entity;

public class User {

    private String id ;
    private String name ;

    public User(){}

    public User(String id, String name){
        this.id = id ;
        this.name = name ;
    }

    public void setId(String id){
        this.id = id ;
    }


    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }
}

然后是mapper层,该层主要实现的是一个接口,而所有的SQL语句都是卸载该接口里,每一条语句对应的一个接口的方法。

Mapper里的注解说明

  • @Select 查询注解
  • @Result 结果集标识,用来对应数据库列名的,如果实体类属性和数据库属性名保持一致,可以忽略此参数
  • @Insert 插入注解
  • @Update 修改注解
  • @Delete 删除注解

代码如下:

package com.example.mybastisdemo.mapper;

import com.example.mybastisdemo.entity.User;
import org.apache.ibatis.annotations.* ;
import java.util.List ;

public interface Usermapper {
    @Select("select * from test1")
/*    @Results({
            @Result(property = "name", column = "name")
    })*/
    List<User> getAll();

    @Select("select * from test1 where id=#{id}")
    User getById(String id);

    @Insert({"insert into test1(id,name) values(#{id},#{name})"})
    void install(User user);

    @Update({"update test1 set name=#{name} where id=#{id}"})
    void Update(User user);

    @Delete("delete from test1 where id=#{id}")
    void delete(String id);
}

然后是实现Userservice类,其作用是编写不同的方法函数,而每种函数的实现是通过调用Usermapper中的接口函数来实现的。具体代码如下

package com.example.mybastisdemo.service;

import com.example.mybastisdemo.entity.User;
import com.example.mybastisdemo.mapper.Usermapper ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;

import java.util.List ;

@Service
public class Userservice {
    @Autowired(required = false)  //玄学,,,如果没有这个required,那下面的usermapper会报错
    private Usermapper usermapper;

    /**
     * 获取所有用户信息
     */
    public List<User> getAll() {
        return usermapper.getAll();
    }

    /**
     * 添加用户
     */
    public void insert(User User){
        usermapper.install(User);
    }

	//根据id来查用户
    public User getById(String id){
        return usermapper.getById(id) ;
    }
    
	//更新用户信息
    public void update(User user){
        usermapper.Update(user);
    }
	
	//删除用户
    public void delete(String id){
        usermapper.delete(id) ;
    }



}

最后实现Controller控制器,这里直接调用Userservice中的函数作为服务。并且使用不同的@RequestMapping(““)来配置URL映射来进行不同功能是实验实现。

最终代码如下:

package com.example.mybastisdemo.web;

import com.example.mybastisdemo.entity.User ;
import com.example.mybastisdemo.mapper.Usermapper ;
import com.example.mybastisdemo.service.Userservice ;

import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping ;
import org.springframework.web.bind.annotation.RestController ;
import org.springframework.web.servlet.ModelAndView ;

import java.util.List ;

@RestController
public class UserController {
    @Autowired(required = false)
    private Usermapper usermapper ;


    @RequestMapping("/getUsers")
    public List<User> getUsers() {
        List<User> users=usermapper.getAll();
        return users;
    }

    @RequestMapping("/getUser")
    public User getUser() {
        String id = "1" ;
        User user=usermapper.getById(id);
        return user;
    }

    @RequestMapping("/add")
    public void save() {
        User user = new User() ;
        user.setId("4");
        user.setName("demo4");

        usermapper.install(user);
    }

    @RequestMapping("/update")
    public void update() {
        User user = new User() ;
        user.setId("2");
        user.setName("demo2");
        usermapper.Update(user);
    }

    @RequestMapping(value="/delete/{id}")
    public void delete(@PathVariable("id") String id) {
        usermapper.delete(id);
    }


}

最后启动服务,在浏览器中输入localhost:8080/需要的功能 可以查看到输出效果

最终结果和预期符合。