1. 项目配置

ORM框架:Object Relational Mapping,“对象关系映射” 框架。

在开发中,java操作的是对象,ORM 框架在对象和数据库数据间建立连接,使我们直接对Java对象进行操作就可以实现对数据的CRUD,而不用再写sql语句。

1.1 引入mybatisplus依赖

若原有mybatis依赖则予以替换,tips:artifactId不是spring开头的均为第三方依赖

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${project.mybatisplus.version}</version>
        </dependency>

1.2 application.yml文件中相应的mybatis配置予以替换

#mybatis:
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#  type-aliases-package: com.wn.bc0606.entity
#  mapper-locations: classpath:/mappers/*.mapper.xml

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2. 从entity实体类-->Service单元测试

2.1 项目结构

若依springboot框架用户名密码在哪里设定 springboot默认的orm框架_spring boot

2.2 entity实体类的注解

@TableName--表名,@TableId--value主键名,type对应主键选择AUTO自增长,@TableField--字段名

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("btype_tab")
public class BookType {
    @TableId(value = "btype_id",type = IdType.AUTO)
    private Integer id;

    @TableField("btype_name")
    private String name;

    @TableField("btype_createtime")
    private Date createTime;

    @TableField("btype_updatetime")
    private Date updateTime;

    @TableField("btype_createby")
    private String createBy;
}

2.3 Dao接口继承BaseMapper接口

注意将泛型里的内容替换为entity实体类,否则无法映射

@Mapper注解 将对象交由容器管理

@Mapper
public interface BookTypeDao extends BaseMapper<BookType> {

}

2.4 Service层调用Dao接口

API详见官网

(CRUD 接口 | MyBatis-Plus)

@Service
@Transactional
public class BookTypeServiceImpl implements BookTypeService {

    @Autowired
    private BookTypeDao bookTypeDao;

    @Override
    public List<BookType> selectAllBookTypes() {
//        QueryWrapper<BookType> wrapper = new QueryWrapper<>();
//        wrapper.eq("btype_name","传记类").eq("btype_createby","marry");

        return bookTypeDao.selectList(null);
    }

    @Override
    public List<BookType> selectByName(String name) {
        QueryWrapper<BookType> wrapper = new QueryWrapper<>();
        wrapper.eq("btype_name",name);
        return bookTypeDao.selectList(wrapper);
    }

    @Override
    public List<BookType> orderByCreateTimeDesc() {
        QueryWrapper<BookType> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("btype_createtime");
        return bookTypeDao.selectList(wrapper);
    }
}

2.5 Junit单元测试Service

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class BookTypeServiceImplTest {

    @Autowired
    private BookTypeServiceImpl bookTypeService;
    @Test
    public void selectAllBookTypes() {
//        Assert.assertEquals("传记类",bookTypeService.selectAllBookTypes().get(3).getName());
        bookTypeService.selectAllBookTypes();
    }

    @Test
    public void selectByName() {
        bookTypeService.selectByName("传记类");
    }

    @Test
    public void orderByCreateTimeDesc() {
        bookTypeService.orderByCreateTimeDesc();
    }
}

3. DTO的采用

DTO是数据传输对象(Data Transfer Object)的缩写,指将数据封装成普通的JavaBeans,在J2EE多个层次之间传输。

3.1枚举

如果对象类型是String、数组、Enum,没有实现Serializable接口,使用ObjectOutputStream的write(object)方法会抛出异常NotSerializableException。

序列化当前对象,引用该对象的对象也会因为传递性而序列化。尽量避免深层引用,不然序列化过程的开销会很大。

public enum ResultCode implements Serializable {
    QUERY_BOOKTYPE_SUCCESS(2001,"查询所有图书类型信息成功"),
    QUERY_BOOKTYPE_ORDERBY_CREATETIME_DESC_SUCCESS(2002,"按图书类型排序查询"),
    QUERY_BOOKTYPE_SELECTBY_NAME_SUCCESS(2003,"按图书类型名称查询成功"),

    INSERT_PUBLISHER_SUCCESS(2101,"添加出版社信息成功"),
    QUERY_PUBLISHER_NAME_LIKE_SUCCESS(2102,"按名称模糊查询出版社成功"),
    QUERY_PUBLISHER_ALL_SUCCESS(2103,"查询所有出版社信息成功"),
    UPDATE_PUBLISHER_SUCCESS(2104,"修改出版社信息成功")

    ;
    private Integer code;
    private String msg;

    ResultCode(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HttpResp {
    private ResultCode resultCode;
    private Date time;
    private Object data;

//    public <T> T getResults(T data){
//        return data;
//    }
}

4. 调试完成restful风格的Controller

4.1 restful风格的Controller

@GetMapping-->查询,幂等

@PostMapping-->修改,非幂等

@DeleteMapping-->删除,幂等

@PutMapping-->添加,幂等

幂等性:多次操作/多次运算,结果一致。如何理解,即对于同一操作比如删除一条数据,删完后无论再进行多少次,最终的结果都不会再发生变化了。

@RestController
@RequestMapping("/api/publisher")
public class PublisherController {
    @Autowired
    private PublisherServiceImpl publisherService;

    @PutMapping("/insertPublisher")
    @ResponseBody
    public HttpResp insertPublisher(@RequestBody Publisher publisher){
//        publisherService.insertPublisher(publisher);
        return new HttpResp(ResultCode.INSERT_PUBLISHER_SUCCESS,new Date(),publisherService.insertPublisher(publisher));
    }

    @GetMapping("/selectNameLike")
    public HttpResp selectNameLike(String name){
        return new HttpResp(ResultCode.QUERY_BOOKTYPE_SELECTBY_NAME_SUCCESS,new Date(),publisherService.selectNameLike(name));
    }

    @GetMapping("/selectAllPublishers")
    public HttpResp selectAllPublishers(){
        return new HttpResp(ResultCode.QUERY_PUBLISHER_ALL_SUCCESS,new Date(),publisherService.selectAllPublishers());
    }

    @PostMapping("/updatePublisher")
    public HttpResp updatePublisher(@RequestBody Publisher publisher){
        return new HttpResp(ResultCode.UPDATE_PUBLISHER_SUCCESS,new Date(),publisherService.updatePublisher(publisher));
    }
}

4.2 采用Idea自带的HTTP Client测试工具对Controller进行测试 

若依springboot框架用户名密码在哪里设定 springboot默认的orm框架_mybatis_02

 4.3 HTTP Client测试工具 put/get/post请求的测试写法

此处注意日期格式,与yml配置文件中相匹配

spring:
  mvc:
    format:
      date: yyyy-MM-dd HH:mm:ss
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
###
PUT http://localhost:9097/api/publisher/insertPublisher
Content-Type: application/json

{
  "id": null,
  "name": "aaa",
  "createTime": "2023-06-06 18:53:46",
  "updateTime": "2023-06-06 18:53:46",
  "createBy": "xxx"
}

<> 2023-06-06T212920.200.json
<> 2023-06-06T212812.405.json

###
GET http://localhost:9097/api/publisher/selectAllPublishers

<> 2023-06-06T213300.200.json

###
POST http://localhost:9097/api/publisher/updatePublisher
Content-Type: application/json

{
  "id": 9,
  "name": "bbb",
  "createTime": "2023-06-06 18:53:46",
  "updateTime": "2023-06-06 18:53:46",
  "createBy": "xXx"
}

<> 2023-06-06T213754.200.json

5. 额外引入PO\POJO\DTO\VO的理解

直接引用大佬理解

三分钟掌握POJO及其转换——PO、DO、DTO、VO