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 项目结构
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详见官网
@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进行测试
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