자바 공부/스프링공부

My Batis 사용법

ari0930 2024. 7. 4. 00:24

My Batis 란?

SQL을 XML파일이나 주석으로 관리하고 자동으로 매핑시켜준다.

JDBC Template는 java 객체를 매핑하기 위해서는 BeanPropertyRowMapper 같은 거 사용하거나 직접 매핑하는 것을 만들어줘야 한다.

 

사용법

기본적으로 DTO, Controller, Service, DAO 형식으로 작성한 JDBC Template 방식과 매우 유사하다.

My Batis 방식 또한 DTO, Controller, Service, 작성하고 DAO 대신 Mapper 하고 sql문을 작성할 xml 파일을 작성해야 한다.

 

DTO

@Getter
@Setter
public class UserVO {
    private int id;
    private String name;
    private String email;
}

 

Controller

@RestController
@RequestMapping("/users")
public class UserController {
	@Autowired
    private UserService userService;

    @GetMapping("/Id") //아이디로 유저 조회
    public ResponseEntity<User> getUserById(@RequestParam("id") int id) {
        User user = userService.getUserById(id);
        return ResponseEntity.ok(user);
    }


    @PostMapping("/Join") //유저회원가입
    public ResponseEntity<String> createUser(@RequestBody UserVo user) {
        userService.createUser(user);
        return ResponseEntity.ok("User created");
    }

    @PutMapping //유저정보수정
    public ResponseEntity<String> updateUser(@RequestBody UserVo user) {
        userService.updateUser(user);
        return ResponseEntity.ok("User updated");
    }

    @DeleteMapping("/Delete}") //유저삭제
    public ResponseEntity<String> deleteUser(@RequestParam("id") int id) {
        userService.deleteUser(id);
        return ResponseEntity.ok("User deleted");
    }
}

 

Service

@Service
public class UserService {
	@Autowired
    private UserMapper userMapper;

	//유저조회
    public User getUserById(int id) {
        return userMapper.findById(id);
    }

	//회원가입
    public void createUser(User user) {
        userMapper.insert(user);
    }
    
    //유저정보수정

    public void updateUser(User user) {
        userMapper.update(user);
    }

//유저삭제
    public void deleteUser(int id) {
        userMapper.delete(id);
    }
}

 

Mapper

어노테이션을 사용하여 sql문을 작성하는 방법

@Mapper
public interface UserMapper {
	//유저 조회
    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(int id);
	//회원가입
    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    void insert(User user);
	//유저 정보수정
    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    void update(User user);
	//회원탈퇴
    @Delete("DELETE FROM users WHERE id = #{id}")
    void delete(int id);
}

 

어노테이션을 사용하지 않을 때

@Mapper
public interface UserMapper {

	//유저 조회
    public User findById(int id);
    //회원가입
    public void insert(User user);
	//유저 정보수정
    public void update(User user);
	//회원탈퇴
    public void delete(int id);
}

 

어노테이션을 사용하지 않았을 경우 xml 파일 작성

application.properties에서 xml 파일의 위치를 넣어줘야 한다.

properties에 아래와 같이 작성해준 다다면 

mybatis.mapper-locations=classpath:mapper/*. xml 

 

resources파일 아래의 mapper 파일 안의 모든 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.example.demo.mapper.UserMapper">  <!--이부분은 우리가 작성한 mapper을 위치를 입력해야한다  -->
    <resultMap id="UserResultMap" type="com.example.demo.model.UserVo">
    	<!-- 이부분에서 type 에서 userVo라는 객체로 맵핑하겠다 라는 의미이다   -->
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="email" column="email"/>
    </resultMap>

    <select id="findById" resultMap="UserResultMap">
        SELECT * FROM users WHERE id = #{id}
    </select>


    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO users(name, email) VALUES(#{name}, #{email})
    </insert>

    <update id="update">
        UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
    </update>

    <delete id="delete">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

<select id="findById" resultMap="UserResultMap"> 여기서 이 걸 보면 

id 값은 mapper에 작성한 메서드 명하고 같은 이름을 호출한다

resultMap은 아래 resultMap에서 id 값하고 같은 걸 알 수 있다 이 말은 아래의 방식으로 맵핑하겠다고 지정해 주는 거다.

    <resultMap id="UserResultMap" type="com.example.demo.model.UserVo">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="email" column="email"/>
    </resultMap>
반응형