implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4'
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8&useTimezone=true&serverTimezone=Asia/Seoul
username: [username]
password: [password]
mybatis: # type을 쉽게 쓰기 위해서 dto 패키지를 type-aliaes에 설정
type-aliases-package: com.may.mybatispractice.dto
cf) 연결 테스트
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class ConnectionTests {
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Test
public void connection_test(){
try(Connection con = sqlSessionFactory.openSession().getConnection()){
System.out.println("커넥션 성공");
}catch(Exception e){
e.printStackTrace();
}
}
}
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user")
List<UserDto> findAll();
@Select("SELECT * FROM user where id = #{id}")
UserDto findById(Long id);
@Insert("INSERT INTO user (name, age) values (#{name}, #{age})")
void save(@Param("name") String name, @Param("age") int age);
}
@Mapper
public interface UserMapper {
List<UserDto> findAll();
UserDto findById(Long id);
String nameCheck(String name);
void save(@Param("name") String name, @Param("age") int age);
}
resources > com.may.mybatis.practice.mapper > UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.may.mybatispractice.mapper.UserMapper">
<select id="findById" resultType="UserDto">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="findAll" resultType="UserDto">
SELECT * FROM user
</select>
<select id="nameCheck" resultType="String">
SELECT COUNT(name) FROM user WHERE name = #{name}
</select>
<insert id="save">
INSERT INTO user (name, age) values (#{name}, #{age})
</insert>
</mapper>
application.yml에
type-aliases-package: com.may.mybatispractice.dto
작성했으므로,
resultType을 바로 UserDto로 작성할 수 있다.
spring:
schema: classpath:schema.sql
추가한 후, resources > schema.sql을 생성하자.
해당 파일에 SQL 구문을 삽입하고 ctrl + enter 누르면 해당 쿼리문이 실행된다.
ex)
DROP TABLE IF EXISTS board;
create table board (
id BigInt not null auto_increment,
user_id BigInt not null,
title varchar(100) not null,
content varchar(255),
regdate timestamp default now(),
primary key(id),
FOREIGN KEY (user_id) REFERENCES user(id)
);
alter table user modify id int not null auto_increment;
INSERT INTO board(user_id, title, content) VALUES (1, 'title1', '');
User 데이터를 insert할 때, save할 때 파라미터로 name, age를 전달했다. 이렇게 되면 PK값을 가져올 수 없게 된다.
이제 PK값을 가져오도록 해보자.
파라미터로 BoardDto를 전달한 후, PK값인 boardId를 접근자 메서드로 가져오면 된다.
int save(BoardDto boardDto);
<insert id="save" useGeneratedKeys="true" keyProperty="boardId">
INSERT INTO board (userId, title, content) values (#{userId}, #{title}, #{content})
</insert>
useGeneratedKeys="true" keyProperty="boardId"
를 Mapper에 추가해주면 자동으로 값이 들어가진다.
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class BoardDto {
private Long boardId;
private Long userId;
private String title;
private String content;
}
@Transactional
public Long save(BoardDto boardDto){
if(boardMapper.save(boardDto) == 0){
throw new IllegalArgumentException("데이터베이스에 저장되지 않았습니다.");
}
return boardDto.getBoardId(); // 생성된 데이터의 pk값을 가져온다.
}