JDBC ์—ฐ๋™(MySQL, STS, maven) - MyBatis

์ด๋ฆฌยท2022๋…„ 1์›” 13์ผ

๐Ÿš€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.5.7</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>1.3.2</version>
</dependency>

๐Ÿš€ SQLSession, SQLSessionFactory
1. SQLSessionFactorys๋Š” SQLSession๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค.
2. SQLSession์œผ๋กœ connection ์ƒ์„ฑ, SQL์งˆ์˜, ๊ฒฐ๊ณผ ๋ฆฌํ„ด ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. bean ๋“ฑ๋ก
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
</bean>

  • dataSource๋ฅผ ์ฐธ์กฐํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  1. ์ฝ”๋“œ ์ˆ˜์ •
  • ํŒฉํ† ๋ฆฌ์—์„œ ์„ธ์…˜์„ ๋งŒ๋“ค์–ด ๋‚ด์–ด ์ปค๋„ฅ์…˜์„ ๋ฐ›์•„์˜จ๋‹ค.
  • ๊ธฐ์กด dataSource๋ฅผ ๋Œ€์ฒดํ•œ๋‹ค.
@Component
@AllArgsConstructor
public class SampleDAO {

    //private DataSource dataSource;
    private SqlSessionFactory sqlSessionFactory;

    public void select(){                
        String sql = "select * from tbl_board where bno > ?";   

        try {
            @Cleanup SqlSession session = sqlSessionFactory.openSession();
            @Cleanup Connection connection=session.getConnection();
            @Cleanup PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, 4);
            @Cleanup ResultSet resultSet = preparedStatement.executeQuery();
            while(resultSet.next()) {
                resultSet.getInt(1);
                resultSet.getString(2);
                resultSet.getString(3);
            }

        }catch(SQLException e) {
            e.printStackTrace();
        }        
    }
}
  • session์œผ๋กœ ์ปค๋„ฅ์…˜์„ ์–ป์–ด ์˜ค๋Š” ๊ฒƒ ์™ธ์— ์งˆ์˜๋„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค์Œ์— ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ณ , mybatis์˜ ๋งคํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๊ฒ ๋‹ค.

๐Ÿš€ Mapper - 1 (annotation)

  1. DTO์ž‘์„ฑ
@Data
public class SampleDTO {
    private int bno;
    private String title;
}
  1. SampleDAO ์ˆ˜์ •
public interface SampleDAO {
    @Select("select * from tbl_board where bno > 4")
    List<SampleDTO> select();
}
  1. root-context.xml ์ˆ˜์ •
<mybatis-spring:scan base-package="com.company.dao" />
<!-- 
<context:component-scan	base-package="com.company.dao">
</context:component-scan>
 -->
  1. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(์ด์ „๊ณผ ๊ฐ™์Œ)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class Tests {
    
    @Setter(onMethod_ = @Autowired)
    private SampleDAO dao;
    
    @Test
    public void test1() throws Exception {
        dao.select();
    }
}

  1. ๊ฒฐ๊ณผ - ์„ฑ๊ณต


?????????????????


  • ์–ด๋…ธํ…Œ์ด์…˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์˜€์œผ๋‹ˆ statement ์ค€๋น„(prepare), ์ง‘ํ–‰(execute), ๋ฐ˜ํ™˜(resultSet)๊นŒ์ง€๋Š” ์ดํ•ดํ•˜๊ฒ ๋‹ค.

    • ์ปค๋„ฅ์…˜์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ–ˆ์ง€?
  • DTO ํ•„๋“œ์™€ DB์ปฌ๋Ÿผ์˜ ์ด๋ฆ„์ด ๊ฐ™์•„์„œ ์•Œ์•„์„œ ๋“ค์–ด๊ฐ„ ๊ฒƒ์ผ๊นŒ, ์›น์—์„œ์˜ EL์ด getter ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, setter์˜ ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ™์•„์„œ ๋“ค์–ด๊ฐ„ ๊ฒƒ์ผ๊นŒ?

    • ์ด๋ฆ„์ด ๋‹ค๋ฅด๋ฉด ์–ด์ฉŒ์ง€?
  • select * from ์œผ๋กœ ์ปฌ๋Ÿผ 6๊ฐœ๋ฅผ ๊ตฌํ•ด์™”์ง€๋งŒ, DTO์— ์žˆ๋Š” ๊ฒƒ๋“ค๋กœ๋งŒ ์ €์žฅ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์•Œ์•„์„œ List๋กœ ๋ฆฌํ„ด๋œ ๊ฒƒ ์ธ์ƒ์ ์ด๋‹ค.

  • ์ „์ฒด์ ์œผ๋กœ conn, stmt, rs ๋ฐ return ๊ณผ์ •์ด ์ƒ๋žต๋˜์—ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • context:component-scan + @Component ์ด ์•„๋‹Œ

    • mybatis-spring:scan base-package ๋ฐฉ์‹์œผ๋กœ bean์ด ์ƒ๊ฒผ๋‹ค.
      (SampleDAO๋Š” interface์ธ๋ฐ ์ ๋‹นํ•œ ๊ฐ์ฒด๊ฐ€(bean) ์ƒ๊ฒผ๋‹ค.)



Q. ์ปค๋„ฅ์…˜์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ–ˆ์ง€?
-> ์™ ์ง€ sqlFactory๋ฅผ mybatis์—์„œ ์•Œ์•„์„œ ์“ธ ๊ฒƒ ๊ฐ™๋‹ค.(์•„๊นŒ ์˜ˆ์ œ ์‹ค์Šตํ•˜๋ฉด์„œ ์ด๋Ÿด๊ฑฐ๋ฉด ์™œ์ผ์ง€ ํ–ˆ๋‹ค..)
-> ์—†์• ๊ณ  ์—๋Ÿฌ๋‚˜๋ฉด ๋‚ด ๋ง์ด ๋งž๋‹ค.

  • ์ž ๊น ์—†์• ๊ณ  test๋Œ๋ ค๋ณด์•˜๋‹ค


Q. ํ•„๋“œ๋ช…๊ณผ ์ปฌ๋Ÿผ๋ช…

@Data
public class SampleDTO {
    
    private int bno;
    private String title2;
    
    public void setTitle(String title2) {
        this.title2 = title2;
    }
}
  • setter ํ”„๋กœํผํ‹ฐ๋ฐฉ์‹์ด ๋งž์•˜๋‹ค.
  • ์ด๋ฆ„์ด ์•ˆ๋งž์œผ๋ฉด ์—๋Ÿฌ๋Š” ์•ˆ๋‚˜๊ณ  ์ฟจํ•˜๊ฒŒ ์•ˆ ๋ฐ›์•„๋ฒ„๋ฆฐ๋‹ค.

๐Ÿš€ Mapper - 2 (xml)

  • pstmt.setXXX() ์ฒ˜๋Ÿผ ์น˜ํ™˜ํ•˜๊ณ  ์‹ถ๋‹ค!!
  • ๊ทธ ๋ฐ–์— ๋ณต์žกํ•œ sql์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ
  • ๋ฌผ๋ก , ์–ด๋…ธํ…Œ์ด์…˜, xml ๋‘ ๋ฐฉ์‹์„ ํ˜ผ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  1. SampleDAO ์ˆ˜์ • (์–ด๋…ธํ…Œ์ด์…˜ ์‚ญ์ œ)
public interface SampleDAO {
    List<SampleDTO> select();
}
  1. xml ํŒŒ์ผ ์ž‘์„ฑ

  • resources์— ์ž‘์„ฑ
  • ๊ฒฝ๋กœ๋ฅผ ๊ฐ™๊ฒŒ ํ•ด์ฃผ๋ฉด ๊ฐ€๋…์„ฑ ๐Ÿ‘Œ๐Ÿ‘Œ
  • ํด๋”๋Š” ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค ๊ฒƒ

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.company.dao.SampleDAO">
        
        <select id="select" resultType="com.company.dto.SampleDTO" >
            select * from tbl_board
        </select>

</mapper>
  • namespace์™€(์ธํ„ฐํŽ˜์ด์Šค ๊ฒฝ๋กœ) id๊ฐ€(๋ฉ”์„œ๋“œ๋ช…) ๊ด€๊ฑด
  • ์ฟผ๋ฆฌ๋ฌธ ์„ธ๋ฏธ์ฝœ๋ก  ์ฃผ์˜
  • resultType์ด DTOํ•˜๋‚˜ ์ž„์—๋„ ์™ธ๋ถ€์—์„œ List๋กœ ๋ฐ›์œผ๋ฉด ๋ฐ›์•„์ง€๋Š” ๊ฒŒ ์ธ์ƒ์ 

  1. test (๋ณ€๊ฒฝ์—†์Œ) - ์„ฑ๊ณต


  • Alias ์ ์šฉ
  1. sqlFactory property ์ถ”๊ฐ€
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"></property>
  <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
</bean>
  1. resources์— mybatis-config.xml์ถ”๊ฐ€
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration 
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
<configuration>
  <typeAliases>
    
    <typeAlias type="com.company.dto.SampleDTO" alias="SampleDTO" />
    
  </typeAliases>
</configuration>
  1. mapper.xml์˜ resultType ๋ณ€๊ฒฝ
        <select id="select" resultType="SampleDTO" >
            select * from tbl_board
        </select>


  • ์น˜ํ™˜ ์ ์šฉ
  1. xml์ˆ˜์ •
	<select id="select" resultType="SampleDTO">
        <![CDATA[
            select bno from tbl_board where bno > #{bno}
            ]]>
        <!-- <, > ๋“ฑ์„ ํƒœ๊ทธ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— <![CDATA[ ]]>๋ฅผ ์‚ฌ์šฉ -->
	</select>
  1. DAO ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜์ • ๋ฐ ์ถ”๊ฐ€
public interface SampleDAO {
    List<SampleDTO> select(int bno);
    //List<SampleDTO> select(SampleDTO dto);
}
  1. tests ์ˆ˜์ •
    @Test
    public void test1() throws Exception {
        dao.select(4);
        
        /*
        SampleDTO dto = new SampleDTO();
        dto.setBno(4);
        dao.select(dto);
        */
    }
  • ์ฃผ์„ ์•ˆ, ์ฃผ์„ ๋ฐ– ๋‘˜ ๋‹ค ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๊ฐ์ฒด๋ฅผ ๋„ฃ์—ˆ์„ ๊ฒฝ์šฐ, getter ํ”„๋กœํผํ‹ฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.(์‹คํ—˜์™„๋ฃŒ)

  • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ ์กฐ๊ธˆ ๋” ๊ณต๋ถ€ํ•ด๋ณด์•„์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

profile
์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์‚ฌ๋žŒ์ด ๋˜์ž

0๊ฐœ์˜ ๋Œ“๊ธ€