Spring JDBC実習

32827 ワード

1.Mavenプロジェクトの作成




  • maven-archetype-quickstart
  • グループid、ワークidは、パッケージになるため、小文字として指定されます.
  • ワークIdは実際の項目名を記入します.
  • 2. pom.xmlにコードを追加

      <properties>
        <spring.version>4.3.5.RELEASE</spring.version>
      </properties>
    
      <dependencies>
        <!-- Spring. 버전은 5.1 이상으로 해야 오류 x -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
        </dependency>
        
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
        <!-- basic data source -->
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-dbcp2</artifactId>
          <version>2.1.1</version>
        </dependency>
        
        <!-- JDBC 사용을 위함. 내 컴퓨터의 mysql 버전과 동일해야함 -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.26</version>
        </dependency>
        
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.6.1</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>

    追加後maven update


    3.configの作成


    管理用configパッケージの作成


    ApplicationConfig.Javaの作成

    package kr.or.connect.daoexam.config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Import;
    
    @Configuration
    @Import({DBConfig.class})
    public class ApplicationConfig {
    }
  • @importを使用すると、プロファイルを複数の使用に分けることができます.
  • データベース接続に関する設定を別々に管理します.
  • DBConfig.Javaの作成

    package kr.or.connect.daoexam.config;
    
    import javax.sql.DataSource;
    import org.apache.commons.dbcp2.BasicDataSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @Configuration
    @EnableTransactionManagement
    public class DBConfig {
      private String driverClassName = "com.mysql.cj.jdbc.Driver";
      private String url =
          "jdbc:mysql://localhost:3306/connectdb?useUnicode=true&characterEncoding=utf8";
      private String username = "connectuser";
      private String password = "connect123!@#";
      
      @Bean
      public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
      }
    }

    4.DTOファイルの作成

  • Role
  • package kr.or.connect.daoexam.dto;
    
    public class Role {
      private int roleId;
      private String description;
    
      public int getRoleId() {
        return roleId;
      }
    
      public void setRoleId(int roleId) {
        this.roleId = roleId;
      }
    
      public String getDescription() {
        return description;
      }
    
      public void setDescription(String description) {
        this.description = description;
      }
    
      @Override
      public String toString() {
        return "Role [roleId=" + roleId + ", description=" + description + "]";
      }
    }

    5.Daoファイルの作成


    Dao用sqlファイルの作成

    package kr.or.connect.daoexam.dao;
    
    public class RoleDaoSqls {
    	public static final String SELECT_ALL = "SELECT role_id, description FROM role order by role_id";
    }
  • static finalを貼り付け、定数のように使用します.変数名を大文字で決定します.
  • Daoファイルの作成-SELECTAL()

    package kr.or.connect.daoexam.dao;
    
    import static kr.or.connect.daoexam.dao.RoleDaoSqls.SELECT_ALL;
    import java.util.Collections;
    import java.util.List;
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
    import org.springframework.stereotype.Repository;
    import kr.or.connect.daoexam.dto.Role;
    
    @Repository
    public class RoleDao {
      private NamedParameterJdbcTemplate jdbc;
      private RowMapper<Role> rowMapper = BeanPropertyRowMapper.newInstance(Role.class);
      
      public RoleDao(DataSource dataSource) {
        this.jdbc = new NamedParameterJdbcTemplate(dataSource);
      }
      
      public List<Role> selectAll() {
        return jdbc.query(SELECT_ALL, Collections.emptyMap(), rowMapper);
      }
    }
  • import staticと宣言された場合、クラス名なしでRoleDaoSqlsの変数がすぐに使用可能になります.RoleDaoSqls.SELECT ALLではなくSELECT ALLとして使用可能
  • Daoは@Repositoryを提供しています.
  • jdbc.query(SELECT_ALL, Collections.emptyMap(), rowMapper);

  • query()メソッドは、複数の結果がある場合、内部でDTOを繰り返し生成し、生成したDTOをリストに入れ、対応するリストを返します.
  • の最初のパラメータはsqlです.
  • の2番目のパラメータは、空のマッピングオブジェクトを宣言します.
  • sql文にバインドする値がある場合にバインドする値を渡すために使用します.
  • 3回のパラメータは、作成したrowmapperオブジェクトに格納されます.
  • selectの1つで、結果をDTOに保存します.
  • BenPropertyRowMapperオブジェクトを使用して、列の値をDTOに自動的に読み込みます.
  • BenPropertyRowMapperと変数名

  • DBMSでは、列名で単語と単語を区別する場合に使用します.
  • DBMSは大文字と小文字を区別しないからです.
  • Javaでは、単語と単語が出会う大文字をアルパカ記号で表します.
  • BenPropertyRowMapperは、DBMSおよびJavaネーミング規則に適合する機能を有する.
  • 6. ApplicationConfig.@ComponentScanをjavaに追加

    @ComponentScan(basePackages = { "kr.or.connect.daoexam.dao" })

    7.Daoへの挿入、更新、選択、削除機能の追加


    insert


    RoleDao.Javaに追加

      public int insert(Role role) {
        SqlParameterSource params = new BeanPropertySqlParameterSource(role);
        return insertAction.execute(params);
      }
  • という挿入文も、プライマリ・キーを自動的に生成する場合があります.
  • この場合には、生成されたプライマリ・キー値を再読み込みするなどの機能が必要となる.SimpleJdbcInsertオブジェクトには、この機能があります.
  • では、プライマリ・キー値に直接挿入されます.
  • ロールオブジェクトの値をマップに変換します.roleId名をrole idに変更します.
  • は、生成されたマッピングオブジェクトをSimpleJdbcInsertのexecute()メソッドのパラメータとして渡す.
    値は自動的に保存されます.
  • update


    RoleDaosqls.Javaに追加

     public static final String UPDATE = "UPDATE role SET description = :description WHERE ROLE_ID = :roleId";
  • ":値"はバインドする部分です.
  • RoleDao.Javaに追加

      public int update(Role role) {
        SqlParameterSource params = new BeanPropertySqlParameterSource(role);
        return jdbc.update(UPDATE, params);
      }
  • jdbc.update(UPDATE,params)の最初のパラメータはsqlで、2番目のパラメータはマッピング対象オブジェクト(マッピングする値を持つオブジェクト)です.
  • select, delete


    RoleDaosqls.Javaに追加

      public static final String SELECT_BY_ROLE_ID = "SELECT role_id, description FROM role where role_id = :roleId";
      public static final String DELETE_BY_ROLE_ID = "DELETE FROM role WHERE role_id = :roleId";

    RoleDao.Javaに追加

      public int deleteById(Integer id) {
        Map<String, ?> params = Collections.singletonMap("roleId", id);
        return jdbc.update(DELETE_BY_ROLE_ID, params);
      }
    
      public Role selectById(Integer id) {
        try {
          Map<String, ?> params = Collections.singletonMap("roleId", id);
          return jdbc.queryForObject(SELECT_BY_ROLE_ID, params, rowMapper);
        } catch (EmptyResultDataAccessException e) {
          return null;
        }
      }

    delete

  • query文はupdateの
  • に似ています.
  • paramsはupdateのようにSqlParameterSourceを使用してオブジェクトをマッピングに入れることができますが、deleteは1つの値しか入力しません.
    使用しました.
  • select

  • 1件を選択する際にqueryForObjectメソッドを使用します.
  • の最初のパラメータはquery文です.
  • の2番目のパラメータのroleId値を渡すことを目的としています.
  • の3番目のパラメータは、作成されたマッピングオブジェクトです.
  • の条件を満たす値がない場合、Exceptionが発生します.