create database mybatis_db default character set utf8mb4 default collate utf8mb4_general_ci;
create user 'mybatis'@'%' identified by'thatkxkd123';
grant allon mybatis_db.* to 'mybatis'@'%';
use mybatis_db;
createtablecompany (
id INTEGER AUTO_INCREMENT PRIMARYKEY,
company_name VARCHAR(128),
company_address VARCHAR(128),
INDEX (company_name)
)
@Data
publicclass Company {
privateint id;
private String name;
private String address;
}
@Mapper
publicinterface CompanyMapper {
@Insert("INSERT INTO company(company_name, company_address) VALUES(#{company.name}, #{company.address})")
intinsert(@Param("company") Company company);
// 반환되는 결과는 입력된 갯수가 반환된다. 실패할 경우 0 반환.
}
@RestController
@RequestMapping("/company")
publicclass CompanyController {
@Autowired
private CompanyMapper companyMapper;
@PostMapping("")
publicintpost(@RequestBody Company company){
return companyMapper.insert(company);
}
}
POST 테스트
Select기능 만들기
Mapper
java
@Select("SELECT * FROM company")
@Results({
@Result(property="name", column="company_name"),
@Result(property="address", column="company_address")
}) // id의 경우는 자동으로 매핑이 된다.
List<Company> getAll();
Controller
java
@GetMapping("")
public List<Company> getAll(){
return companyMapper.getAll();
}
GET 테스트
Insert 개선
보통 insert작업을 하면 0이나 1로 리턴값을 받기 보다는 전체의 값을 반환 받는다.
그러나 id의 경우 DB에서 auto increment기 때문에 별도의 작업이 필요하다.
java
//Controller@PostMapping("")
public Company post(@RequestBody Company company){
companyMapper.insert(company);
return company;
}
객체를 그대로 반환하면 입력값 그대로 반환되지만 id는 값이 설정되지 않는다.
property를 설정하기 위해 mapper에서 옵션을 지정해줘야한다
java
@Insert("INSERT INTO company(company_name, company_address) VALUES(#{company.name}, #{company.address})")
@Options(useGeneratedKeys = true, keyProperty = "id")
intinsert(@Param("company") Company company);
@Options를 통해 생성된 키를 가지고 keyProperty를 설정하면, 자동으로 생성된 id값이 객체의 id변수에 설정된 상태로 반환된다.
id값을 가지고 Select 해보기
java
동일한 매핑 관계 @Results를 복사 할 수도 있지만 id값을 부여해 재사용 할 수 있다.
@Results(id="CompanyMap", value={
@Result(property = "name", column = "company_name"),
@Result(property = "address", column = "company_address")
})
id를 가지고 select하는 mapper
java
@Select("SELECT * FROM company WHERE id=#{id}")
@ResultMap("CompanyMap")
Company getById(@Param("id") int id);
REST controller
java
@GetMapping("/{id}")
public Company getById(@PathVariable("id") int id){
return companyMapper.getById(id);
}
@PathVariable : GetMapping의 변수와 매칭된다.
직원 테이블 만들기
sql
createtableemployee (
id INTEGER AUTO_INCREMENT PRIMARYKEY,
company_id INTEGER,
employee_name VARCHAR(128),
employee_address VARCHAR(128),
INDEX (employee_name),
FOREIGNKEY (company_id) REFERENCEScompany(id)
)
company목록이 1개 이상 조회된 경우에 employee목록을 set할것 - getByCompanyId라는 메서드에 companyId로 조회함으로써 모든 직원의 목록을 얻어오도록 할것이다.
Employee mapper
java
@Select("SELECT * FROM employee WHERE company_id=#{companyId}")
@ResultMap("EmployeeMap")
List<Employee> getByCompanyId(@Param("companyId") int companyId);