在学习用postgresql数据库结合 Springboot+MybatisPlus时,创建了如下数据库表:
create table "user"
(
id bigint not null
primary key,
name varchar(30),
age integer,
email varchar(50)
);
alter table "user"
owner to postgres;
DAO类:
package com.powernode.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class user {
private Long id;
private String name;
private Integer age;
private String email;
}
mapper接口:
package com.powernode.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.powernode.domain.user;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface userMapper extends BaseMapper<user> {
}
servicer接口:
package com.powernode.service;
import com.powernode.domain.user;
import java.util.List;
public interface userService {
List<user> selectList();
}
service impl接口:
ackage com.powernode.service.impl;
import com.powernode.domain.user;
import com.powernode.mapper.userMapper;
import com.powernode.service.userService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class userServiceImpl implements userService {
@Autowired
private userMapper usermapper;
@Override
public List<user> selectList() {
return usermapper.selectList(null);
}
}
controller类:
package com.powernode.controller;
import com.powernode.domain.user;
import com.powernode.service.userService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class userController {
@Autowired
private userService userservice;
@RequestMapping("/selectList")
public List<user> selectList() {
return userservice.selectList();
}
}
项目配置yml文件:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mptest
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
项目的文件结构:
编译运行后,产生如下错误信息:
DEBUG信息提示:字段ID不存在。
首先,检查项目文件结构,application.yml在controller、domain、mapper、service包之外,且与四个包同级,符合Spring boot约定,问题依然存在。
其次,检查postgresql服务器,已自动运行。在IDEA中执行数据查询命令
,能够查询出完整结果。如下图:
突然发现,IDEA生成的查询语句是这样的:
select * from "user";
数据库表名上被自动加上了双引号。如果去掉了双引号,IDEA查询结果如下:
数据库表名爆红,IDEA提示”无法解析表 user“,不能得出正确的查询结果。
查询语句修改如下:
select * from public.user
IDEA继续报错,提示“关系不存在”:
突然想到,postgersql的表,都是放在scheam(模式)下的,但网上的大多数例子用的mysql数据库,没有“模式”的概念。
在DAO类上添加Table注解,参数上标识表名和模式名:
@TableName(value = "user",schema = "public")
修改后DAO类如下:
package com.powernode.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "user",schema = "public")
public class user {
private Long id;
private String name;
private Integer age;
private String email;
}
再次运行整个项目程序,并在浏览器中查询,结果正确:
至此,问题得以解决。
如果项目里面的表很多,每张表都用在DAO类里面写@TableName 注解的方式,就比较麻烦了。可以在application.yml文件统一配置表的前缀来达到上述目的。配置路径为:mybatis-plus.global-config.db-config.table-prefix: public.
注意:“public.”后面的小数点不能省略。
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mptest
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
main:
banner-mode: OFF
mybatis-plus:
global-config:
banner: false
db-config:
table-prefix: public.
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true